今天遇到了一个问题,查了半天。。。,情况是这样的,我用的是dubbox,想做一个精简的全链路跟踪,一个消费者通过dubbox调用一个Service, service 里另外调用了两个service:
A服务被调用时,通过dubbo的Filter接收了一个参数,这个参数是附加在Invocation实例中的,像这样:
这是调用方:
这是被调用方:
情况大体如此,当调用的b的服务时,这个参数被正确传递了,但是调用c的时候,就是收不到。
问题产生的原因跟了一下dubbox的代码发现,Filter执行的最后会触发一个自带的ConsumerContextFilter的执行:
注意最后一句,它清除了所有的附加值。那为什么b能收到呢,自然是因为是调用方在做清理工作,所以是调用a的那台服务器执行的,当然清不到b的,但是b执行完了,c就。。。
解决办法也简单,给存在service互相调用的Provider端也配上SendFilter,在这个Filter中用比如ThreadLocal什么的保存一下只,每次发都带出去,不过如果用ThreadLocal要注意一点,当所有调用都执行完了,一定要清理掉,不然这个线程一旦被线程池复用,就可能出现问题。
==========================================================
咱最近用的github:https://github.com/saaavsaaa
微信公众号:
转载请注明出处