DUBBO - Netty 交互 服务器端


Dubbo Remoting 层为Dubbo项目处理底层网络通信的层。类图如下:




DUBBO - Netty 交互 服务器端_第1张图片



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)通道处理器。

  1. URL

        URL为Dubbo框架中用的比较多地方,综合说来,它是一个契约,或者参数集合,用于各个组件的配置。

        在NettyServer构造期间,有如下参数:

  • 通信层的协议---TCP的上层协议

  • 最大连接数

  • 空闲超时

  • 网络IO处理线程数量,默认为处理器+1。(但是很多处理器现在是一个处理器处理两个线程,所以在Netty后续的版本里,默认为 处理器*2 + 1)

  • 最重要的,当然是还有host和port了,没有的,怎么知道绑定在哪个port呢。。。

    2. 对于通道处理器来说,负责处理的,显然就是连接进来的通道所发生的事件咯。但是此处的通道处理器,并不是Netty的Pipeline,中间还需要一层转换,当然除此之外,还有一些其它的操作,比如业务线程委派。

    对于NIO来说,采用了多路复用模型处理网络事件。多路复用的优点是节约了线程上下文切换带来的不必要的CPU的资源的浪费,但是在IO线程里处理业务,显然是不妥当的,因为业务方法,很可能是阻塞的。

      

DUBBO - Netty 交互 服务器端_第2张图片

  

       其中Netty区域的类,都是扩展了了Netty自带类。

       InternalDecoder:负责TCP层协议的解析,处理TCP粘包。(当然这个解析也包含序列化的处理)。

       InternalEncoder: 协议封装。

       NettyHandler:客户通道共享的处理器(请参阅Netty的通道处理器模型),转换Netty的通道事件到Dubbo事件。

       NettyServer:处理连接数量。

       MultiMessageHandler:多消息处理。

       HeartbeatHandler:心跳消息。

       AllChannelHandler:委派业务请求到线程池。

    ---------------------------------------------------------------------------------------------------

       最后就是构造NettyServer的通道ChannelHandler,在线程池里面执行,并非Netty的IO线程组。

本文出自 “Tech Doc” 博客,谢绝转载!

你可能感兴趣的:(java)