您的位置:首页 > 其它

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

2017-09-18 23:46 344 查看
笔记来源: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连接,重新注册到workerGroup的IO线程上,首先看Acceptor如何处理客户端的接入:(处理读或者连接事件)



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



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



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



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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: