自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(136)
  • 收藏
  • 关注

原创 记一次使用spring事件机制失效排查修复

在日常业务开发中过程,我们有时候为了业务解耦,会利用spring的机制,就是利用spring提供的ApplicationListener、ApplicationEventMulticaster等核心API来实现。我这边列的是核心底层API接口,正常我们会用监听事件用@EventListener,发布事件用 applicationContext.publishEvent()或者applicationEventPublisher.publishEvent())

2024-04-02 11:03:33 384

原创 再聊SPI机制

去年更新了一系列和SPI相关的内容,最近因为业务需要,我又基于业务场景,实现了一版。对于什么是spi,很久之前有写过一篇文章,java之spi机制简介感兴趣的朋友可以蛮看一下核心代码@Slf4j/***/if (!/***/if (!");Class<?

2024-03-26 09:02:25 371

原创 redisson序列化采坑那些事儿

如果对springcloud-gateway有了解的同学,应该会知道springcloud-gateway默认提供了一个基于内存的路由定义仓库。基于内存的好处,就是快,但是缺点就是网关重启路由就丢失了。为了方便管理网关路由以及保证网关重启,路由不丢失,于是业务部门做了形如图的改造就是会有一个gateway的portal面板来管理路由,然后路由规则是保存在redis,gateway从redis取路由规则。

2024-03-12 10:26:05 864

原创 记一次openfeign反序列化异常复盘

之前业务部门有2个通用响应类,一个是负责和前端交互的响应类AjaxResult,一个是负责和后端RPC接口交互的响应类RpcResult。一开始这两个响应类的值字段都一样,形如下因为前端和后端部署在不同的服务器上,某次因为前端和后端的时间不一致,导致出现业务异常,后面业务的架构师说,业务统一以后端的时间为准。于是AjaxResult新增了一个时间字段nowDateTime,而RpcResult维持不变。今天的要讲解的故事就是由此拉开序幕。

2024-03-05 10:26:13 380

原创 聊聊maven指定version区间的妙用

在我们开发微服务项目的过程中,难免会依赖各种jar,开发环境可能引用1.0.0-SNAPSHOT,而到了正式环境,则需要引用1.0.0。之前我们的做法是通过pom配置profile来达到不同环境,使用不同的版本。形如下-- 开发环境 --> < profile > < properties > < user-api.version > 1.0.0-SNAPSHOT </ user-api.version > </ properties > < activation > <!

2024-02-27 09:41:33 373

原创 记一次unable to find valid certification path to requested target异常排查

最近因为uat环境https过期,后边进行证书续期,发现通过浏览器访问可以正常访问,但是接口调用该地址,却出现网上的大部分针对java解决方案可以归类如下两种1、在jdk证书库里添加该域名的公钥证书该方案比较繁琐,此外我们的接口不仅是要提供给java系语言,还要提供给其他非java系语言调用,其次因为我们的证书并非自签发,而是真金白银买的,理论上不应该有问题。所以该方案一开始就没纳入我重点考虑范围内2、忽略证书认证,信任所有请求链接该方案其实也不可取,因为有安全隐患,不过该方案确实能解决问题。

2024-01-23 09:39:06 996

原创 聊聊如何实现动态加载spring拦截器

之前写过一篇文章聊聊如何实现热插拔AOP,今天我们继续整一个类似的话题,聊聊如何实现spring拦截器的动态加载动态变更java的方式有很多种,比如利用ASM、ByteBuddy等操作java字节码来实现java变更,而本文则是采用groovy脚本来变更,主要是因为groovy的学习门槛很低,只要会java基本上等于会groovy。对groovy感兴趣的同学可以通过如下链接进行学习。

2024-01-16 10:46:32 806

原创 聊聊springboot项目出现同名bean异常报错如何修复

最近业务部门接手供方的项目过来二开,其中有个认证实现因为业务需要,需要替换原有供方实现的逻辑。大概伪代码如下。供方提供的接口以及默认实现形如下// doBiz业务的替换实现如下@Service然而项目运行的时候,发现走的认证逻辑始终是供方的逻辑,而非业务重写后的逻辑。平时因为跟业务的技术负责人走得比较近,他就私下找我交流一下思路。一开始我给他提的建议是说在你定制的业务类上加@Primary试下,他说他加了但没效果。

2024-01-09 09:21:04 919

原创 聊聊如何实现热插拔AOP

之前偶然看到一篇文章利用aop实现热拔插(类似于插件),里面的实现挺好玩。今天我们也来玩一把。

2023-12-19 09:44:46 977

原创 聊聊部署在不同K8S集群上的服务如何利用nginx-ingress进行灰度发布

之前有篇文章聊聊如何利用springcloud gateway实现简易版灰度路由,里面的主人公又有一个需求,他们有个服务是没经过网关的,而是直接通过nginx-ingress暴露出去,现在这个服务也想做灰度,他知道在同个集群如何利用nginx-ingress进行灰度发布,但是现在这个服务是部署在新的集群,他查了不少资料,都没查到他想要的答案,于是就和我交流了一下,看我这边有没有什么实现思路,今天就来聊下这个话题:不同K8S集群上的服务如何利用nginx-ingress进行灰度发布。

2023-12-05 10:24:13 123

原创 记一次请求接口出现400响应码的诡异错误实录

最近业务碰到了一个诡异的400接口请求异常,部门用户通过浏览器访问会出现400响应码错误,部分用户又能正常访问。该接口用postman请求访问,都能正常返回数据。后端写客户端请求该接口,也都能返回正常的数据。本文就来记录一下这次问题此次400响应码错误的问题,除了技术层面上,还有一些是规范上的,比如请求头加了了一堆无用的参数,其次为了方便,在token上搞了一堆业务数据,有些bug真的是无意识产生的,轻描淡写的一篇文章,可知道当时排查了2,3天,希望这篇文章能给其他小伙伴带来一些帮助或者排查思路吧。

2023-11-28 15:51:41 533 1

原创 聊聊如何利用springcloud gateway实现简易版灰度路由

前阵子时间和朋友聊天,他们有个sass微服务,因为之前拆分过细,导致服务不仅调用链路过长,而且浪费服务资源,他们后面做了服务合并的重构,并即将上线。他觉得上线不能直接把线上的租户都全切到重构版的sass微服务,而是需要实现如下的效果他就问我说,有没有啥开源平台可以快速支持,因为之前时间都耗费在重构业务上,这块就没考虑周全,现在临近上线,预留的时间不多。后面和他细聊,得知他们这套sass服务,租户不多,其次他们微服务API网关是springcloud gateway。

2023-11-21 10:18:26 121

原创 记一次请求头header丢失问题排查实录

前端小王需要调用兄弟部门老张的后端接口,老张提供的接口,需要token鉴权才能调用成功。当小王按约定携带token调用老张的接口时,起先因为跨域问题,导致前端小王没法成功请求老张的接口。于是小王就跟老张说,能不能他那边配置下允许跨域。但小王是一个很有原则的人,他说这个接口是要给N个部门调用的,不可能给这些调用部门都配置允许跨域,不然口子一旦开了,后面就没完没了,他让小王自己想办法解决跨域。后面小王就把事情向上反馈,小王的领导就跟小王说,我们自己搭个反向代理,通过反向代理解决跨域问题。

2023-11-14 09:35:40 237

原创 聊聊多层嵌套的json的值如何解析/替换

前阵子承接了2个需求,一个数据脱敏,一个是低代码国际化多语言需求,这两个需求有个共同特点,都是以json形式返回给前端,而且都存在多层嵌套,其中数据脱敏的数据格式是比较固定,而低代码json的格式存在结构固定和不固定 2种格式。最后不管是数据脱敏或者是多语言,业务抽象后,都存在需要做json值替换的需求。今天就来聊下多层嵌套json值如何解析或者替换本文的多层嵌套json的解析和替换都提供了几种方案,综合来讲是推荐将json先转对象,通过对象操作。对json替换,推荐使用自定义json序列化注解的方式。

2023-10-31 09:34:15 1254

原创 聊聊多个节点实例数据同步如何触发

之前写过一篇文章聊聊在集群环境中本地缓存如何进行同步,今天聊的话题看着和那篇文章有点雷同,不过我们今天重点会放在方法论上,也不会拘泥于具体实现。在聊这个话题之前,大家可以思考一下,如果要实现多个实例数据同步触发,大家会怎么做?脑海里,是会浮现,我可以用消息队列或者定时器来实现?这种已经具象化的技术细节?还是进一步进行拆解?假设大家已经思考好,我来说下我个人的思考逻辑。今天标题的内容,主要讲同步如何触发?内容已经圈定死,因此就不谈数据同步涉及的一致性,只谈如何触发这个动作。

2023-10-24 09:55:18 143

原创 云原生时代开发提效神器-Nocalhost

在很早以前发表了一篇文章springcloud本地开发的微服务如何调用远程k8s的微服务。着重介绍的如何利用kt-connect来打通开发环境与K8S环境的调试。今天介绍的Nocalhost,不仅仅能达到上述的效果,而且功能更加强大。下面我们就进入正题直接在 Kubernetes 集群中构建、测试和调试应用程序提供易于使用的 IDE 插件(支持 VS Code 和JetBrains),即使在 Kubernetes 集群中进行开发和调试,Nocalhost 也能保持和本地开发一样的开发体验。

2023-10-10 09:37:33 98

原创 聊聊springboot自动装配出现的TypeNotPresentExceptionProxy异常排查

正文开始前,我们做个小测试,假设我们封装了一个springboot starter,其自动装配类形如下内容@Bean该starter的pom引入的apollo gav是optional</</</</</我的问题是在运行环境为jdk8的springboot项目引入上述的starter,是否会有问题?我们运行一下,发现会出现然后我们不改任何一行代码,把JDK调成11或者以上版本,再运行项目成功运行。那我们的修复的第一直觉是不是把JDK8的版本提高。

2023-09-19 09:55:19 200

原创 聊聊如何玩转spring-boot-admin

1、何为spring-boot-admin?Spring Boot Admin 是一个监控工具,旨在以良好且易于访问的方式可视化 Spring Boot Actuators 提供的信息spring-boot-admin其实核心就做了一件事,就是把Spring Boot Actuators 可视化。本文就不提供demo了,因为官网文档写得很详细,大部分内容都可以从官网找到。除了那个日志稍微有点坑。

2023-09-05 17:39:23 350

原创 聊聊spring项目中如何动态刷新bean

前阵子和朋友聊天,他手头上有个spring单体项目,每次数据库配置变更,他都要重启项目,让配置生效。他就想说有没有什么办法,不重启项目,又可以让配置生效。当时我就跟他说,可以用配置中心,他的意思是因为是维护类项目,不想再额外引入一个配置中心,增加运维成本。后边跟他讨论了一个方案,可以实现一个监听配置文件变化的程序,当监听到文件变化,进行相应的变更操作。具体流程如下在这些步骤,比较麻烦就是如何动态刷新bean,因为朋友是spring项目,今天就来聊下在spring项目中如何实现bean的动态刷新。

2023-08-29 09:43:45 280

原创 聊聊在集群环境中本地缓存如何进行同步

之前有发过一篇文章聊聊如何利用redis实现多级缓存同步。有个读者就给我留言说,因为他项目的redis版本不是6.0+版本,因此他使用我文章介绍通过MQ来实现本地缓存同步,他的同步流程大概如下图他原来的业务流程是每天凌晨开启定时器去爬取第三方的数据,并持久化到redis,后边因为redis发生过宕机事故,他碰巧看了我文章,就觉得可以用使用多级缓存的策略,用来做个兜底。

2023-08-15 09:32:20 1693

原创 聊聊springcloud如何与k8s configMap整合实现配置动态刷新

配置中心在微服务的服务治理场景基本上是属于标配,常见可以用来做配置中心有nacos、apollo、zookeeper、springcloud config、consul、etcd、redis、disconf、dimond、xxl-conf等。这些组件的特点都是需要安装,如果大家的部署环境中有用到k8s,且不需要用到太多配置中心的特殊功能,比如灰度发布、权限管理、发布审核、操作审计啥的,仅仅只是用来统一配置,以及实现配置的热更新,那今天讲主角configMap会是一个挺不错的选择。

2023-08-08 10:07:39 648

原创 聊聊如何利用wrk进行压测初探

wrk 是一个能够在单个多核 CPU 上产生显著负载的现代 HTTP 基准测试工具。它采用了多线程设计,并使用了像 epoll 和 kqueue 这样的可扩展事件通知机制。此外,用户可以指定 LuaJIT 脚本来完成 HTTP 请求生成、响应处理和自定义报告等功能。输入命令查看支持的相关参数-c与服务器建立并保持的TCP连接数,其实就是并发数-d压测的持续时间(单位为秒),默认为 10s-t压测的线程数。正常设置为cpu核心线程数的2-4倍即可。如果线程数过多,会因线程上下文切换频繁,影响到压测效果。

2023-07-25 09:34:50 147

原创 聊聊使用错误采集平台sentry踩到的坑

sentry简介Sentry 是一款专业的企业级错误跟踪和日志分析工具,旨在帮助开发人员、管理员和产品经理跟踪、分析和解决应用程序错误和性能问题。Sentry 可以跟踪应用程序中的错误,并将它们记录下来,以便开发人员能够快速定位和解决问题。Sentry 可以分析应用程序的日志,并提供详细的信息,如错误级别、调用堆栈、数据库访问等,以帮助开发人员快速定位和解决问题。Sentry 可以通过电子邮件、Slack、PagerDuty 等渠道通知开发人员错误和性能问题的发生,以便及时响应和解决问题。

2023-07-11 11:37:01 146

原创 聊聊不同集群的微服务如何通过feign调用

之前业务部门的某项目微服务调用关系如下图后因业务改造需要,该项目需要将服务A部署到另外一个集群,但服务A仍然需要能调用到服务B,调用关系如下图之前调用方式是负责服务B的开发团队提供相应的feign客户端包给到服务A开发团队,服务A开发团队直接将客户端包引入到项目,在通过@EnableFeignClients来激活feign调用,现在跨了不同集群,而且2个集群间的注册中心也不一样,之前的调用方式就不大适用了。业务部门的技术负责人就找到我们部门,看我们有没有什么方案。

2023-07-04 10:35:50 743

原创 聊聊如何独立使用ribbon实现业务客户端负载均衡

ribbon是Netflix开源的客户端负载均衡工具,ribbon实现一系列的负载均衡算法,通过这些负载均衡算法去查找相应的服务。ribbon被大家所熟知,可能是来源于spring cloud,今天就来聊聊如何单独使用ribbon来实现业务客户端负载均衡独立使用ribbon其实不会很难,主要对LoadBalancerBuilder这个API熟悉就可以定制自己想要的负载均衡器。

2023-06-20 09:56:35 230

原创 聊聊如何利用服务定位器模式按需返回我们需要的服务实例

什么是服务定位器模式服务定位器是一个了解如何提供各种应用所需的服务(或组件)的对象。在服务定位器中,每个服务(或组件)都只有一个单独的实例,并通过ID 唯一地标识。用这个 ID 就能从服务定位器中得到这个服务(或组件)。何时可以考虑使用服务定位器模式服务定位器模式的目的是按需返回服务实例,当依赖是按需的或需要在运行时查找时,我们可以使用服务定位器模式将客户端与具体实现解耦。服务定位器包含的组件客户端:在运行时需要服务的消费者。服务定位器:服务定位器负责将服务按需返回给客户端。

2023-06-13 14:30:36 501

原创 聊聊部署在K8S的项目如何获取客户端真实IP

最近部门有个需求,需要对一些客户端IP做白名单,在白名单范围内,才能做一些业务操作。按我们的部门的一贯做法,我们会封装一个client包,提供给业务方使用。我们的项目是运行在K8S上)本以为这是一个不是很难的功能,部门的小伙伴不到一天,就把功能实现了,他通过本地调试,可以获取到正确的客户端IP,但是发布到测试环境,发现获取到的客户端IP一直是节点的IP,后面那个小伙伴排查了很久,一直没头绪,就找到我帮忙一直排查一下。今天文章主要就是来复盘这个过程。

2023-05-31 09:37:46 2389 1

原创 聊聊如何利用spring插件来实现策略模式

偶然的机会发现spring有个spring-plugin,官网对它的介绍是大意就是Spring插件提供了一种更实用的插件开发方法,它提供了插件实现扩展核心系统功能的核心灵活性,但当然不提供核心OSGi功能,如动态类加载或运行时安装和部署插件。尽管Spring插件因此不如OSGi强大,但它满足了穷人构建模块化可扩展应用程序的需求。本文就来聊下如何使用spring插件来实现策略模式本文主要通过一个模拟短信发送的示例,演示如何通过spring-plugin来实现策略模式。

2023-05-23 09:48:46 564 1

原创 聊聊那些年我们实现java AOP几种常见套路

有一定开发经验的同学对AOP应该很了解吧,如果不了解,可以先查看如下文章进行科普一下fr=aladdin,再来阅读本文。本文主要从编译期,JVM加载器期、运行期这三个环节,来讲述如何进行AOP。如果对性能有强烈要求的话,推荐在编译期或者JVM加载期进行织入。如果想对方法修饰符为final、static、private进行织入,也可以考虑在编译期进行实现。不过在编译期或者JVM加载期进行织入有个弊端就是,出现问题不好排查。

2023-05-10 09:59:25 517

原创 聊聊如何通过APT+AST来实现AOP功能

如果有使用过spring aop功能的小伙伴,应该都会知道spring aop主要是通过动态代理在运行时,对业务进行切面拦截操作。今天我们就来实现一下如何通过APT+AST在编译期时实现AOP功能。不过在此之前先科普一下APT和AST相关内容抽象语法树(Abstract Syntax Tree,AST),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。比如包、类型、修饰符、运算符、接口、返回值都可以是一个语法结构。int x = 0;

2023-04-25 09:51:01 517

原创 聊聊如何运用JAVA注解处理器(APT)

APT(Annotation Processing Tool)它是Java编译期注解处理器,它可以让开发人员在编译期对注解进行处理,通过APT可以获取到注解和被注解对象的相关信息,并根据这些信息在编译期按我们的需求生成java代码模板或者配置文件(比如SPI文件或者spring.fatories)等。APT获取注解及生成代码都是在代码编译时候完成的,相比反射在运行时处理注解大大提高了程序性能注:因为APT = 注解+ 注解处理器(AbstractProcessor)。

2023-04-11 16:37:52 571

原创 记一次springboot通过jackson渲染到前端,出现大写字母变成小写问题

最近业务部门接手了外包供应商的项目过来自己运维,该部门的小伙伴发现了一个问题,比如后端的DTO有个属性名为nPrice的字段,通过json渲染到前端后,变成nprice,而预期的字段是要为nPrice。于是他们就找到我们部门,希望我们能帮忙解决一下这个问题,本文就聊聊如何解决问题,至于为什么会出现这个问题,后面留个彩蛋。

2023-04-04 09:41:52 761

原创 聊聊如何在docker环境中配置hosts

不知道大家有没有遇到这种场景,部署在docker环境的项目,需要通过域名访问外部一些资源,但因为没有配置dns解析,因此需要通过配置hosts来进行访问。本文就来聊聊可以通过哪些方式可以在docker容器中配置hosts不知道大家有没有好奇为什么没介绍通过dockerfile的方式,因为dockerfile的方式,我试过在dockerfile文件中配置不过没生效。也试过将hosts的文件放在项目目录下通过配置如下内容不过没鸟用。可能配法不对,也有可能是因为被k8s影响到了。

2023-03-28 10:19:11 10156 1

原创 聊聊如何在K8S中实现会话保持

故事的起因是朋友所在的部门最近基于auth2实现单点登录,他们在测试环境单点登录,运行得好好的,但他们把单点登录上到预发布环境,发现单点登录不好使了。他们有部分系统是以授权码式接入,发现第一次登录拿到授权码进行换取token时,会提示授权码失效。而他们测试环境和预发布环境的代码是一样的。后面朋友和我聊天,我就问朋友两套环境有存在什么不一样的地方,朋友说测试环境是单POD部署,而预发布环境是多POD部署。

2023-03-14 09:46:15 1419 1

原创 聊聊如何避免多个jar通过maven打包成一个jar,多个同名配置文件发生覆盖问题

不知道大家在开发的过程中,有没有遇到这种场景,外部的项目想访问内部nexus私仓的jar,因为私仓不对外开放,导致外部的项目没法下载到私仓的jar,导致项目因缺少jar而无法运行。通常遇到这种场景,常用的解法有,外部项目跟内部nexus的网络打通,比如通过VPN。或者将私仓的jar直接下载下来给到外部项目。对于第二种方案有时候因为私仓的jar里面有依赖其他的内部jar,导致要下载多个jar的情况。这时候为了方便,我们可能会将这些jar合并成一个大jar,再给出去。

2023-02-28 10:56:45 928

原创 聊聊如何基于eureka元数据扩展namespace功能

最近朋友部门接手供方微服务项目过来运维,那套微服务的技术栈是springcloud Netflix,和朋友部门的微服务技术栈刚好匹配。当时朋友部门的想法,既然都是同一套技术体系,那些基础服务治理组件比如注册中心之类,就共用同一套。然而在落地实施的过程中,发现供方提供的微服务项目服务有些serviceId和朋友部门他们已有服务serviceId名字竟然一模一样。这样就有问题了,eureka服务发现是通过serviceId识别。

2023-02-21 10:02:20 467

原创 记一次通过K8S ingress访问业务服务出现404问题

本文主要复盘某次协助业务部门排查ingress访问业务报404问题虽然文中轻描淡写,但实际上排查花费了不少时间,本文就做个记录,方便以后出现类似问题排查。

2023-02-14 09:51:27 988

原创 聊聊如何利用apollo与druid整合实现数据源动态热切

本文的素材来源与某次和朋友技术交流,当时朋友就跟我吐槽说apollo不如nacos好用,而且他们还因为apollo发生过一次线上事故。故事的背景大概是如下前阵子朋友部门的数据库发生宕机,导致业务无法正常操作,当时朋友他们数据库信息是配置在apollo上,朋友的想法是当数据库宕机时,可以通过切换配置在apollo上的数据库信息,实现数据源热变更。

2023-01-31 09:25:51 702

原创 记一次部署在docker环境项目发送邮件出现No appropriate protocol

部门有个项目涉及到邮件发送,发送功能在本地测试可以成功发送,但是打包部署到docker环境中,却出现后面在网上搜索了一下,查到了这篇文章这篇文章有个答主提到,他使用的版本的jdk 8u292,这个版本已经禁用了不安全的TLSv1&TLSv1.1,于是我就查了一下我们部署的docker基础镜像jdk版本,为jdk8u332。后面再搜索了一下解决方案,大部分的解决方案都是通过修改java.security文件中的jdk.tls.disabledAlgorithms配置,删除掉TLSv1&TLSv1.1来解决。

2023-01-10 09:20:02 938

原创 聊聊业务项目如何主动感知mysql是否存活

先前写过一篇文章聊聊如何利用redis实现多级缓存同步,里面讲到业务部门因数据库宕机,有技术提出当数据库宕机,切换到redis,今天我们就来聊聊如何触发这个切换动作?其实mysql的探活实现方式有很多种,本文的实现检测逻辑是直接套用druid的检测连接逻辑,之前对druid的使用,基本上就是停留在配置上,没过多关注。为了写这篇文章,特地翻了一下druid的源码,主要是因为之前以为扩展ValidConnectionChecker就行了,后面发现行不通。

2023-01-03 09:49:07 612

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除