dubbo系列之网络通信-consumer发送原理
简要
先来看一张dubbo的网络通信架构图(也可以说是调用链设计图)
备注:inherit代表继承interface接口,init代表初始化,call代表调用
这篇博客主要就是介绍红色区域,红色区域下面在前几篇博客都已经介绍过了。
源码介绍
接着前面loadbalance往下走
FailoverClusterInvoker类
doInvoke()
1 | Result result = invoker.invoke(invocation);//debug进去 |
ProtocolFilterWrapper类
buildInvokerChain()
1 | public Result invoke(Invocation invocation) throws RpcException { |
—————————这里开始进去filter了——————————-
ConsumerContextFilter类
invoke()
1 | public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { |
进入上下文context,为Invocation设置需要执行的方法和参数等重要信息。
MonitorFilter类
invoke()
1 | // 调用过程拦截 |
进入监控的filter
DubboInvoker类
doInvoke()
1 | protected Result doInvoke(final Invocation invocation) throws Throwable { |
HeaderExchangeChannel类
request()
1 | public ResponseFuture request(Object request, int timeout) throws RemotingException { |
AbstractClient类
send()
1 | public void send(Object message, boolean sent) throws RemotingException { |
NettyChannel类
send()
1 | public void send(Object message, boolean sent) throws RemotingException { |
进去到了NettyChannel,就是实现netty的方法:channel.write(message)。达到最终目的:通过netty的channel发送网络数据。
最后总结一下框架图上我们圈起来三步骤
Filter:ConsumerContextFilter MonitorFilter等一些过滤器类
Invoker:DubboInvoker类
看框架图中知道,invoker的实现是一个protocol,为什么DubboInvoker是个protocol?
如果前面的服务引用我们认真看源码的话,应该熟悉DubboInvoker这个类,就是在RegistryDirectory类
——>refreshInvoker()
——>toInvokers()
——>DubboProtocol类
——>refer()
1 | public <T> Invoker<T> refer(Class<T> serviceType, URL url) throws RpcException { |
所以在服务引用的这个地方,DubboInvoker就被创建了,所以说,DubboInvoker是一个protocol。
Client:就是NettyClient类。
但是我们上面的代码好像没有看到NettyClient类,原来NettyClient类就是我们看到的AbstractClient类的继承类。
那client的实现Transporter又是什么意思呢
transporter:网络传输层,用来抽象netty和mina的统一接口。