dubbox的provider端嵌套调用问题

  今天遇到了一个问题,查了半天。。。,情况是这样的,我用的是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

微信公众号:

                      

转载请注明出处
posted @ 2017-05-08 09:46  draculav  阅读(1451)  评论(0编辑  收藏  举报