Dubbo版本: dubbo-2.6.2
源码地址: https://github.com/apache/dubbo
其中有的类在部分版本中被重构掉了,可能会出现找不到的情况
Dubbo中的线程模型
![image.png](https://cdn.nlark.com/yuque/0/2021/png/191132/1628258991072-67e4af7b-9cdc-471b-9038-5964cc10a1fd.png#align=left&display=inline&height=70&margin=%5Bobject%20Object%5D&name=image.png&originHeight=140&originWidth=700&size=70981&status=done&style=none&width=350)<br />这张图是Dubbo官网的线程模型图,它不仅是Dubbo官方的模型,也是广大RPC实现框架的一个模型。如果我们要自己去实现一个RPC,基本上也是按照这个思路去进行实现的。
这里涉及到2个线程模型,分别是Netty线程模型和Dubbo线程模型
实现细节
由于Dubbo默认的网络框架是基于Netty实现的,所以直接从Netty看起即可,如果对于Netty不了解或者是没有听过Netty,可以从这里查看细节 https://netty.io/.
Dubbo配置了3个hander,分别是
- InternalDecoder 解码
- InternalEncoder 编码
- NettyServerHandler (业务handler)
业务handler经过解码后收到信息讲起递交给MultiMessageHandler实现,具体实现中,会根据我们的dispatcher的配置交给 AllChannelHandler 使用,在内部将该事件传递给线程池。至此,Netty的IO线程的任务就算完成了,接下来就是Dubbo的业务线程池进行处理,后续就是耳熟能详的业务处理了<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />
如果对于Netty有一定了解,对此应该是非常之熟悉