1. 概述
Netty 是由JBOSS 提供的一个Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络IO 程序。
Netty 是一个基于NIO 的网络编程框架,使用Netty 可以帮助你快速、简单的开发出一个网络应用,相当于简化和流程化了NIO 的开发过程。作为当前最流行的NIO 框架,Netty 在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,知名的Elasticsearch 、Dubbo 框架内部都采用了Netty。
2. netty整体设计
2.1 线程模型
单线程模型
服务器端用一个线程通过多路复用搞定所有的IO 操作(包括连接,读、写等),编码简单,清晰明了,但是如果客户端连接数量较多,将无法支撑,咱们前面的NIO 案例就属于这种模型。
线程池模型
服务器端采用一个线程专门处理客户端连接请求,采用一个线程池负责IO 操作。在绝大多数场景下,该模型都能满足使用。
Netty模型
比较类似于上面的线程池模型,Netty 抽象出两组线程池,BossGroup 专门负责接收客户端连接,WorkerGroup 专门负责网络读写操作。NioEventLoop 表示一个不断循环执行处理任务的线程,每个NioEventLoop 都有一个selector,用于监听绑定在其上的socket 网络通道。NioEventLoop 内部采用串行化设计,从消息的读取->解码->处理->编码->发送,始终由IO 线程NioEventLoop 负责。
- 一个NioEventLoopGroup 下包含多个NioEventLoop
- 每个NioEventLoop 中包含有一个Selector,一个taskQueue
- 每个NioEventLoop 的Selector 上可以注册监听多个NioChannel
- 每个NioChannel 只会绑定在唯一的NioEventLoop 上
- 每个NioChannel 都绑定有一个自己的ChannelPipeline
2.2 异步模型
FUTURE, CALLBACK 和HANDLER
Netty 的异步模型是建立在future 和callback 的之上的。callback 大家都比较熟悉了,这里重点说说Future,它的核心思想是:假设一个方法fun,计算过程可能非常耗时,等待fun返回显然不合适。那么可以在调用fun 的时候,立马返回一个Future,后续可以通过Future去监控方法fun 的处理过程。在使用Netty 进行编程时,拦截操作和转换出入站数据只需要您提供callback 或利用future 即可。这使得链式操作简单、高效, 并有利于编写可重用的、通用的代码。Netty 框架的目标就是让你的业务逻辑从网络基础应用编码中分离出来、解脱出来。