Netty线程模型之服务端线程模型

笔记来源:http://www.infoq.com/cn/articles/netty-threading-model/

一、服务端线程模型:

一种比较流行的做法是服务端监听线程和IO线程分离,类似于Reactor的多线程模型,它的工作原理图如下:

下面结合Netty的源码,对服务端创建线程工作流程进行介绍:

1.第一步,从用户线程发起创建服务端操作,代码如下:

EventLoopGroup管理的线程数可以通过构造函数设置,如果没有设置,默认取-Dio.netty.eventLoopThreads,如果该系统参数也没有指定,则为可用的CPU内核数 × 2

bossGroup线程组实际就是Acceptor线程池,负责处理客户端的TCP连接请求,如果系统只有一个服务端端口需要监听,则建议bossGroup线程组线程数设置为1。

workerGroup是真正负责I/O读写操作的线程组,通过ServerBootstrap的group方法进行设置,用于后续的Channel绑定。

2.第二步,Acceptor线程绑定监听端口,启动NIO服务端,相关代码如下:

bossGroup中选择一个Acceptor线程监听服务端,其中,group()返回的就是bossGroup,它的next方法用于从线程中获取可用线程,代码如下:


服务端Channel创建完成后,将其注册到多路复用器Selector上,用于接收客户端的TCP请求,核心代码如下:


3.第三步,如果监听到客户端连接,则创建客户端SocketChannel连接,重新注册到workerGroupIO线程上,首先看Acceptor如何处理客户端的接入:(处理读或者连接事件)


调用unsafe的read()方法,对于NioServerSocketChannel,它调用了NioMessageUnsafe的read()方法,代码如下:

最终它会调用NioServerSocketChannel的doReadMessages方法,代码如下:(创建客户端连接SocketChannel)

4.第四步,选择IO线程后,将SocketChannel注册到多路复用选择器上,监听READ操作。


5.第五步,处理网络的IO读写事件,核心代码如下:





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值