一、TCP网关Netty Server的IO模型
- 创建ServerBootstrap,设定BossGroup与WorkerGroup线程池;
- bind指定的port,开始侦听和接受客户端链接(如果系统只有一个服务端port需要监听,则BossGroup线程组线程数设置为1);
- 在ChannelPipeline注册childHandler,用来处理客户端链接中的请求帧。
- TCP网关使用Netty的线程池,共三组线程池,分别为BossGroup、WorkerGroup和ExecutorGroup。其中,BossGroup用于接收客户端的TCP连接,WorkerGroup用于处理I/O、执行系统Task和定时任务,ExecutorGroup用于处理网关业务加解密、限流、路由,及将请求转发给后端的抓取服务等业务操作。
二、NioEventLoop是Netty的Reactor线程,其角色分为:
- Boss Group:作为服务端Acceptor线程,用于accept客户端链接,并转发给WorkerGroup中的线程;
- Worker Group:作为IO线程,负责IO的读写,从SocketChannel中读取报文或向SocketChannel写入报文;
- Task Queue/Delay Task Queu:作为定时任务线程,执行定时任务,例如链路空闲检测和发送心跳消息等。
步骤一:创建ServerBootstrap实例,ServerBootstrap是Netty服务端的启动辅助类。
步骤二:设置并绑定Reactor线程池,EventLoopGroup是Netty的Reactor线程池,EventLoop负责所有注册到本线程的Channel。
步骤三:设置并绑定服务器Channel,Netty Server需要创建NioServerSocketChannel对象。
步骤四:TCP链接建立时创建ChannelPipeline,ChannelPipeline本质上是一个负责和执行ChannelHandler的职责链。
步骤五:添加并设置ChannelHandler,ChannelHandler串行的加入ChannelPipeline中。
步骤六:绑定监听端口并启动服务端,将NioServerSocketChannel注册到Selector上。
步骤七:Selector轮训,由EventLoop负责调度和执行Selector轮询操作。
步骤八:执行网络请求事件通知,轮询准备就绪的Channel,由EventLoop执行ChannelPipeline。
步骤九:执行Netty系统和业务ChannelHandler,依次调度并执行ChannelPipeline的ChannelHandler。
步骤十:通过Proxy代理调用后端服务,ChannelRead事件后,通过发射调度后端Service。
步骤十一:创建Session,Session与Connection是相互依赖关系。
步骤十二:创建Connection,Connection保存ChannelHandlerContext。
步骤十三:添加SessionListener,SessionListener监听SessionCreate和SessionDestory等事件。