# netty

分享netty 相关的技术

# netty 网络模型

# 网络模型优化历程简介

<div drawio-diagram="132"><img src="http://wiki.shopqorg.com/uploads/images/drawio/2024-04/drawing-1-1714291369.png" alt=""/></div>

<div drawio-diagram="143"><img src="http://wiki.shopqorg.com/uploads/images/drawio/2024-04/drawing-1-1714293610.png" alt=""/></div>

<div drawio-diagram="144"><img src="http://wiki.shopqorg.com/uploads/images/drawio/2024-04/drawing-1-1714296852.png" alt=""/></div>

##### **Netty模型介绍：**

1. **Netty网络模型包含两组线程池，分别是BossGroup 和 workGroup**
2. bossGroup负责客户端连接，WorkGroup 负责网络读写
3. BossGroup和WorkGroup的类型都是NIOEventLoopGroup
4. NIOEventLoopGroup 相当于一个事件循环组，这个组中含有多个事件循环，每一个事件循环都是NioEventLoop
5. NioEventLoop表示一个不断执行处理任务的线程，每个NioEventLoop都有一个Selector,用于监听绑定在其上的socket网络通讯
6. NIOEventLoopGroup可以有多个线程，即可以包含多个NioEventLoop
7. 每个Boss NioEventLoop 循环执行的步骤如下 
    1. 轮询accept事件
    2. 处理accept事件，与client建立连接，生成NioServerSocketChannel,将其注册到work NIOEventLoop上的selector
    3. 处理任务队列的任务，即runAllTask
8. 每个Work NioEventLoop 循环执行的步骤如下 
    1. 轮询read、write事件
    2. 处理I/O事件，在对应的NioSocketChannel中处理
    3. 处理任务队列的任务，即runAllTask
9. 每个worker NioEventLoop处理业务时，会使用pipeline（管道），pipeline中包含channel

<div drawio-diagram="149"><img src="http://wiki.shopqorg.com/uploads/images/drawio/2024-04/drawing-1-1714299318.png" alt=""/></div>

# channel和ChannelPipeline的联系与区别

1. **每个channel有且仅有一个ChannelPipeline与之对应**
2. **一个channel 包含一个ChannelPipeline，而一个ChannelPipeline中维护了一个由ChannelHandlerContext组成的双向链表，并且每个ChannelHandlerContext又关联着ChannelHandler**
3. **入栈和出栈事件在一个双向链表中，入栈事件会从链表head往后传递到最后一个入栈的handler，出栈事件会从链表tail往前传递到最前一个出栈的handler，两种类型的handler互不干扰**

<div drawio-diagram="150"><img src="http://wiki.shopqorg.com/uploads/images/drawio/2024-04/drawing-1-1714385182.png" alt=""/></div>

# netty 源码分析

简明扼要的进行源码梳理与分析

# 服务端启动流程源码分析

#### 一、启动流程简明梳理：

1. 实例化BossGroup线程组
2. 实例化WorkGroup 线程组
3. 实例化ServerBootstrap
4. 配置 ServerBootstrap属性
5. *ServerBootstrap*对象绑定端口并监听网络连接
6. 通道监听客户端关闭连接

#### 二、具体流程示意图

<div drawio-diagram="152"><img src="http://wiki.shopqorg.com/uploads/images/drawio/2024-04/drawing-1-1714452205.png" alt=""/></div>