Dubbo 源码分析11 网络通信篇NettyServer、HeaderExchangeServer

NettyServer
   1、private Map< String, Channel> channels:< ip:port, channel> 所有通道。
   2、private ServerBootstrap bootstrap : netty 服务端启动器。
   3、private io.netty.channel.Channel channel:服务端监听通道。
   4、private EventLoopGroup bossGroup;Netty boss线程组(负责连接事件)
   5、private EventLoopGroup workerGroup : nety work线程组(负责IO事件)
代码@1:调用父类的构造方法,主要初始化AbstractPeer(channelHandler、url)和AbstractEndpoint(codec2、timeout、idleTimeout )
   代码@2:根据URL中的host与端口,创建localAddress。
   代码@3:如果配置了< dubbo:parameter key = “bind.ip” value = “”/> 与 < dubbo:parameter key = “bind.port” />,则用该IP与端口创建bindAddress,通常用于多网卡,如果未配置,bindAddress与 localAddress绑定的IP与端口一样。
   代码@4:初始化accepts与idleTimeout ,这两个参数未被其他地方使用。
   代码@5,调用doOpen方法,正式在相应端口建立网络监听。
1.2、源码分析NettyServer#doOpen

代码@1:创建Netty服务端启动帮助类ServerBootstrap.
   代码@2:创建服务端Boss线程,线程名:.NettyServerBoss,主要负责客户端的连接事件,主从多Reactor线程模型中的主线程(连接事件)。
   代码@3:创建服务端Work线程组,线程名:NettyServerWorker-序号,线程个数取自参数:iothreads,默认为(CPU核数+1)与32取小值,顾名思义,IO线程数,主要处理读写事件,编码、解码都在IO线程中完成。
   代码@4:创建用户Handler,这里是NettyServerHandler。
   代码@5:Netty启动的常规写法,关注如下内容:
   addLast(“decoder”, adapter.getDecoder()) : 添加解码器
   addLast(“encoder”, adapter.getEncoder()) :添加编码器
   addLast(“handler”, nettyServerHandler) :添加业务Handler。
   这里简单介绍一下流程:
   1、客户端建立与服务端连接,此时Boss线程的连接事件触发,建立TCP连接,并向IO线程注册该通道(Channel0)的读事件。
   2、当客户端向服务端发送请求消息后,IO线程中的读事件触发,会首先调用adapter.getDecoder() 根据对应的请求协议(例如dubbo)从二进制流中解码出一个完整的请求对象,然后传入到业务handler,例如nettyServerHandler,执行相应的事件方法,例如recive方法。
   3、当服务端向Channel写入响应结果时,首先编码器会按照协议编码成二进制流,供客户端解码。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值