dubbo和feign传输上下文信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dubbo和feign传输上下文信息相关的知识,希望对你有一定的参考价值。

参考技术A 在两个进程传输的过程中,例如A进程向B进程传输数据,一般都需要传一些固定字段信息,这些信息一般是与业务无关,像调用链追踪,api网关等都需要传输此上下文信息。我们现在有两个应用,应用A是订单系统,应用B是用户中台系统,而且我们是toB的业务,用户是属于某个企业的,该企业的唯一标识为corpId,每个应用对应一个唯一的应用id,还有多个应用的调用链追踪需要传输traceId等,所以A调用B必须传输此几个字段,以下介绍dubbo和feign传输上下文的方法。

Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现,具体想研究dubbo可以参考dubbo文档,本文只介绍dubbo传输上下文的方法:

注:采用http协议传输上下文信息,会将上下文字段设置到header,但是头信息中不能含有中文,所以需要进行编码后传输,然后在接受端解码。

dubbo的Filter机制

参考技术A 以dubbo官方demo为例,在provider端,从netty接收到消息,递交给业务线程池处理开始,到真正调用到业务方法sayHello()结束,中间经过了十几个Filter的处理。见下图

那么这些Filter是如何初始化的,调用的时候又是如何执行的呢?接下来一步一步介绍。

dubbo在进行服务导出时主要做了如下一些工作

可以看到:第二步中核心工作就包括Filter的初始化。见下ProtocolFilterWrapper#export方法

其中有一步是buildInvokerChain,从名字上也可以看出,这是初始化一个责任链,对应设计模式中的责任链模式。接着看这个责任链是怎么初始化的(ProtocolFilterWrapper#buildInvokerChain)

可以看到这个Filter的责任链初始化过程
1.通过dubbo spi机制,取得所有Filter实例形成一个ArrayList<Filter>
2.遍历这个ArrayList,以next指针初始化一个Invoker的链表InvokerList
3.Invoker执行逻辑即执行Filter的invoke方法的同时,将next指针作为参数传入,以支持链式调用

整个过程结束之后,会有两个List,一个ArrayList<Filter>,一个以NEXT指针形成的InvokerList,这两个List就是dubbo Filter机制的基础。

Filter接口提供了一个invoke方法,另一个是Listener接口,有onResponse,onError两个方法。
这两部分对应着Filter对请求和响应的处理逻辑
请求的处理以AccessLogFilter#invoke的实现为例,可以看到,其首先进行AccessLog的处理,然后调用
invoker.invoke().这个invoker即之前Filter初始化的时候,以Next指针形成的那个InvokerList链表中的节点。这样一来,整个链表中的节点都会得到顺序执行。

响应的处理可以见CallbackRegistrationInvoker#invoke

之前Filter初始化的时候,会形成两个list,next指针形成的那个链表用于对请求的处理,另一个ArrayList<Filter> 就是在此时执行,拿到结果之后,遍历这个ArrayList,执行其onResponse或者onError方法,如此一来,请求和响应应就会经过所有生效的Filter处理。

总结:dubbo的Filter机制是一种典型的责任链模式,这个链的基础即上述两个list。如果我们在自己的业务场景中,需要对请求或者响应做一些通用的处理,那么也很简单,直接基于dubbo spi( https://www.jianshu.com/p/d4d7ebc8f7bb
),自定义逻辑实现Filter接口的相应方法即可。

以上是关于dubbo和feign传输上下文信息的主要内容,如果未能解决你的问题,请参考以下文章

Feign远程调用丢失请求头问题以及异步丢失上下文问题解决方法

Spring Cloud Alibaba Dubbo整合Seata(Fescar)实现分布式事物回滚

springcloudalibaba架构(31):SpringCloud实现用户信息在微服务之间传递(Feign和Dubbo)

SpringCloud系列之Feign-6.Feign上下文构建解析

Dubbo3高级特性「框架与服务」RPC调用上下文的介绍(全链路追踪基础)

Spring Cloud Feign 参数上下文设计