本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Netty是基于Java NIO的异步事件驱动的网络应用框架
用于快速开发高性能,高可靠行的网络程序
1) Netty是java开源框架,提供异步的,事件驱动的网络应用程序框架,可以快速开发性能、高可靠的网络io程序
2) Netty简化和流程化了IO开发过程
3) 是最流行的NIO框架,很多行业都有应用(如dubbo,Elasticsearch),表现很好
1. 为什么不用传统NIO编程****
(1) 原生NIO存在的问题****
NIO类库和API繁琐(选择器,管道,buffer)
掌握多线程编程
掌握网络编程
NIO有bug
2. Netty 优点****
(1) 设计优雅:****
统一api,灵活可扩展的事件模型,具有可定制的线程模型
(2) 使用方便:****
丰富的开发文档和用户指南,没有依赖项
(3) 高性能****
吞吐量高,延迟低,资源消耗少
(2) 安全:****
支持SSL/TSL和startTSL
(3) 社区活跃****
问题能及时修复,更多新功能会被加入,版本迭代周期短
3. Netty 线程模型****
Netty主要基于主从reactor多线程模型做了一定的改进
主从多线程模型有多个reactor
4. reactor模式****
指通过一个或多个输入同时传递给服务处理器的模式(基于事件驱动)
服务器程序处理传入的多个请求,并将它们同步分派到相应分处理线程
reactor模式使用io复用监听事件,收到事件后,分发给某个线程,这点就是网络服务器高并发处理的关键
(1) reactor核心组成****
1) reactor分发器
负责监听和分发事件
2) Handlers处理器
处理来自分发器的IO事件
(2) reactor三种典型实现****
有连接器负责连接,连接后就全部走分发器****
1) 单reactor单线程
特点:Handler既收数据,也做数据处理
2) 单reactor多线程
特点:Handler只接收数据,不做数据处理,数据处理交给线程池
缺点:多线程数据共享复杂,单reactor在高并发会有瓶颈(连接和分发上)
3) 主从reactor多线程:这是netty采用的
特点:
①一个主reactor,多个子reactor,线程池处理IO事件
②主reactor负责连接,子reactor负责分发
③子reactor分发事件给Handler,Handler将数据处理交给线程池处理
5. Netty模型****
(1) 详细版示意图****
①Netty抽象出两组线程池BossGroup专门负责接收客户端的连接,workerGroup专门负责网络的读写
②BossGroup和workerGroup都是NIOEventLoopGroup
③NIOEventLoopGroup相关一个事件循环组,里面的每一个循环是NIOEventLoop
④NIOEventLoop表示一个不断循环的执行处理任务的线程,每个NIOEventLoop都有一个selector,用于监听绑定在其上的socket的网络通讯
⑤NIOEventLoopGroup有多个线程。即可以包含多个NIOEventLoop
⑥BossGroup循环执行,轮训连接事件(accept),建立与客户端的连接,生成NioSocketChannel,并注册到某个workerNioEventLoop 上的selector
⑦WorkerGroup循环执行,轮训读写事件,在对应的NioSocketChannel处理io事件 ⑧每个WorkerGroup处理业务时,会用到pipeline(管道),管道包含Channel,管道维护很多的处理器