dubbo系列之网络通信-provider的接收与发送原理
简要
绿色区域在《dubbo系列之服务发布-流程》里面有提到过,这里简单回顾一下。
ThreadPool:线程池,在NettyServer类中设置了boss和wroker线程池。
doOpen()
1 | protected void doOpen() throws Throwable { |
Server:实现类就有NettyServer类以及MinaNetty类。transport:网络传输层,抽象mina和netty为统一接口,以Message为中心;
接下来,我们就要开始介绍上面架构图的红色区域,也是这篇博客的重点。
源码解析
NettyServer类
doOpen()
1 | bootstrap.setPipelineFactory(new ChannelPipelineFactory() { |
进入处理器
NettyHandler类
messageReceived()——消息接收
1 | public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { |
AllChannelHandler类
received()
1 | public void received(Channel channel, Object message) throws RemotingException { |
ChannelEventRunnable类
run()
此时的state是RECEIVED
1 | case RECEIVED: |
DecodeHandler类
received()
1 | public void received(Channel channel, Object message) throws RemotingException { |
HeaderExchangeHandler类
received()
1 | else { |
handleRequest()
1 | Object result = handler.reply(channel, msg); |
DubboProtocol类
1 | public Object reply(ExchangeChannel channel, Object message) throws RemotingException { |
getInvoker()
1 | Invoker<?> getInvoker(Channel channel, Invocation inv) throws RemotingException { |
这样invoker的值就拿到了,再次回到DubboProtocol类,执行invoker.invoke(inv);
——————————————–中间省略一些monitor,context,filter———————————————————
AbstractProxyInvoker—-进入代理类
JavassistProxyFactory类
1 | public Result invoke(Invocation invocation) throws RpcException { |
AbstractProxyInvoker是代理类,再往下执行就是执行JavassistProxyFactory类的getInvoker方法,然后就是进入真正执行的实现类 DemoServiceImpl.sayHello,完成类的代理。
这样response
这样通过Response这个类,provider接收的过程就完成了。。。。。。。。。。。。。。。
接着看channel.send(response),把接受处理的结果,发回consumer。
NettyChannel类
send()
1 | public void send(Object message, boolean sent) throws RemotingException { |
这个地方就是和上一篇博客一样了,走到了channel.write(message);将数据发回consumer。
现在回过头看,博客一开始图上圈出来的红色区域。
Exporter:DubboProtocol类
Filter:ProtocolFilterWrapper ProtocolFilterWrapper ClassLoaderFilter GenericFilter TraceFilter MonitorFilter TimeoutFilter ExceptionFilter InvokerWrapper类
invoker:就是JavassistProxyFactory.AbstractProxyInvoker.doInvoke.通过上面的源码解析,我们能看出来invoker存储于DubboProtocol的ExporterMap里面的DubboExporter.getInvoker().
implement:最终实现类 DemoServiceImpl.sayHello
至此:网络通信的架构图就说完了。