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

来源:互联网 发布:c 高级编程第10版教程 编辑:程序博客网 时间:2024/06/05 12:46

笔记来源: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读写事件,核心代码如下:





原创粉丝点击