Dubbo Remoting 层为Dubbo项目处理底层网络通信的层。类图如下:
ChannelHandler是抽象的通道事件处理器,源代码如下。
@SPI public interface ChannelHandler { void connected(Channel channel) throws RemotingException; void disconnected(Channel channel) throws RemotingException; void sent(Channel channel, Object message) throws RemotingException; void received(Channel channel, Object message) throws RemotingException; void caught(Channel channel, Throwable exception) throws RemotingException; }
NettyServer初始化时候,需要两个参数,一个是URL,一个是(ChannelHandler)通道处理器。
URL
URL为Dubbo框架中用的比较多地方,综合说来,它是一个契约,或者参数集合,用于各个组件的配置。
在NettyServer构造期间,有如下参数:
通信层的协议---TCP的上层协议
最大连接数
空闲超时
网络IO处理线程数量,默认为处理器+1。(但是很多处理器现在是一个处理器处理两个线程,所以在Netty后续的版本里,默认为 处理器*2 + 1)
最重要的,当然是还有host和port了,没有的,怎么知道绑定在哪个port呢。。。
2. 对于通道处理器来说,负责处理的,显然就是连接进来的通道所发生的事件咯。但是此处的通道处理器,并不是Netty的Pipeline,中间还需要一层转换,当然除此之外,还有一些其它的操作,比如业务线程委派。
对于NIO来说,采用了多路复用模型处理网络事件。多路复用的优点是节约了线程上下文切换带来的不必要的CPU的资源的浪费,但是在IO线程里处理业务,显然是不妥当的,因为业务方法,很可能是阻塞的。
其中Netty区域的类,都是扩展了了Netty自带类。
InternalDecoder:负责TCP层协议的解析,处理TCP粘包。(当然这个解析也包含序列化的处理)。
InternalEncoder: 协议封装。
NettyHandler:客户通道共享的处理器(请参阅Netty的通道处理器模型),转换Netty的通道事件到Dubbo事件。
NettyServer:处理连接数量。
MultiMessageHandler:多消息处理。
HeartbeatHandler:心跳消息。
AllChannelHandler:委派业务请求到线程池。
---------------------------------------------------------------------------------------------------
最后就是构造NettyServer的通道ChannelHandler,在线程池里面执行,并非Netty的IO线程组。
本文出自 “Tech Doc” 博客,谢绝转载!
原文:http://mindoverflow.blog.51cto.com/11468509/1764791