1、consumer 发送扩展
我们先来看一下 dubbo 中 consumer
端的请求发送原理,也就是从 InvokerWrapper#invoke 开始,在 consumer 服务引用分析的时候,我们知道根据 Invoke 调用的时候, dubbo 会创建 ProtocolListenerWrapper
与 ProtocolFilterWrapper 来用集成框架使用者的扩展包含:InvokerListener
与 Filter
。ProtocolListenerWrapper
在对象创建的时候就会调用InvokerListener#referred
扩展,所以在远程服务调用的时候最主要的还是 Filter
扩展(ConsumerContextFilter FutureFilter MonitorFilter)
2、consumer 发送原理
最终 consumer
会到 DubboInvoke
进行服务调用。它会在 AbstractInvoker#invoke
添加一些扩展参数到 RpcInvocation
这个远程调用对象里面。添加的扩展参数包含:
- interface : 远程调用的接口名称
- group : 接口分组名称
- token : 调用的 token 信息
- timeout : 调用服务的超时时间
- async : 是否异步调用
- id : 异步操作默认添加 invocation id,用于保证操作幂等
以及 RpcContext
传递过来的扩展参数(RpcContext#attachments
)。然后在 DubboInvoker#doInvoke
中会添加 path
(接口全类名) 以及 version
(版本信息)。再根据 dubbo 的调用模式进行远程调用,包含以下三种调用模式:
- oneway 模式:
<dubbo:method>
标签的return
属性配置为false,则是oneway模式,利用ExchangeClient 对象向服务端发送请求消息之后,立即返回空 RpcResult 对象 - 异步模式:
<dubbo:method>
标签的async
属性配置为 ture,则是异步模式,直接返回空RpcResult
对象,由FutureFilter
和DefaultFuture
完成异步处理工作 - 同步模式:默认即是同步,则发送请求之后线程进入等待状态,直到收到服务端的响应消息或者超时。
下面我们看一下 dubbo 同步调用时序图:
ChannelFuture future = channel.write(message);
最终是调用