前段时间遇到两个问题,对于现阶段的我来说,有点刺手
问题1: FeignClient的configuration被覆盖我在调用 payment-service(其它部门提供的jar) 的 listPaymentOrderRela() 接口时报 json 解析错误:
这个报错的意思是说,你传过来的参数,不是 payment-service 的 listPaymentOrderRela() 接口想要的。
这时候我就觉得是 编码器 加载顺序的问题(DefaultEncoder 在公司公用的基础组件中有定义,而 payment-service 这个jar 他也自定义提供了一个同名称的DefaultEncoder ),所以当时就以为是jar冲突了
一般情况下 jar 冲突就很导致类找不到或者加载错的问题等问题
后来我把冲突的jar都排除了,重新构建到测试环境调用还是这样,并没有解决这个问题/
紧接着,我在本地调试,发现一个非常诡异的现象,调用 listPaymentOrderRela 接口时的走的 DefaultEncoder 编码器并不是 这个类UserPaymentServiceApi 指定的 编码器,
而是 走的 我们基础组件定义的 DefaultEncoder 。这两个编码器的编码逻辑是不一样的。
这时候,我真的直接蒙了,什么鬼。wtf?
后来通过排查 ,发现本服务在其它地方也有定义一个value 值为 payment-service 的 feignClient。
而这个client ,默认编码器时并不是自定义的,而是用的基础组件公共的那个DefaultEncoder
看到这里,大概知道什么问题了,也许是这里被覆盖了。
后来通过修改其中一个 的FeignClient 的value值,再次调接口,就好了。
通过简单查看源码,发现在注册时,这两个client 确实时属于两个 bean,但是 client 配置属性 可以简单理解是通过vaule -> configuration 一对一的关系
这样的话,确实存在覆盖的情况。
问题二:线程池透传出现串号现象最近在参与公司的一个多租户的项目。怎么理解这个项目呢,总的来说,就是某一个企业大客户的订单统一路由保存到一个库。这就需要解决用户userId的透传(feign调用,线程池,mq等的透传)
就比如用户下单,有一些下单成功任务是异步执行获取通过mq,那么这时候userId是需要透传下去的,不然在 *** 作订单库时获取不到userId。
该项目在实现线程间透传是通过阿里开源项目 transmittable-thread-local-2.12.0.jar来实现
引入这个jar,然后在启动项目中加入个agent 即可。
在开发和测试,甚至灰度环境都没问题,一到线上就出现了串号的现象。
这里简单解释一下啥是串号。一个用户在一个线程池的线程中获取线程的上下文信息时还是其它用户的上下文,也就是说,该用户的上下文并没有透传下去。
后来发现线上启动项目时,除了加了 transmittable 代理,还加了一个arms的代理,可能大概率是被覆盖了还是啥的,导致transmittable 代理没生效,线程池不支持透传。
后来为了先临时解决,在自定义线程池时显示 的通过TtlExecutors.getTtlExecutor(executor)包装线程池。理论上,如果transmittable 代理生效的情况下,是不需要在代码中这个定义的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)