Netty中的这些知识点,你需要知道

一、Channel
Channel是一个接口,而且是一个很大的接口,我们称之为“大而全”,囊括了server端及client端接口所需要的接口 。
Channel是一个门面,封装了包括网络I/O及相关的所有操作 。
Channel聚合了包括网络读写、链路管理、网络连接信息、获取EventLoop、Pipeline等相关功能类;统一分配,调度实现相应场景的功能 。

Netty中的这些知识点,你需要知道

文章插图
 
一个Channel 对应一个物理连接,是基于物理连接上的操作包装 。
二、EventLoopEventLoop,Event意为事件、Loop意为环,EventLoo即为事件环 。
EventLoop是一种程序设计结构,等待以及分发事件 。
Netty中的这些知识点,你需要知道

文章插图
 
NioEventLoop,是一个Netty工作线程,又不仅仅是一个Netty工作线程 。
标准的netty线程模型 中我们讲过Netty的标准线程池模型,池子里的每个线程对象就是一个NioEventLoop对象 。或负责接受连接,或负责网络I/O 。
说它不仅仅是一个Netty线程,因为它实现了很多功能,我们可以看下它的继承图:
Netty中的这些知识点,你需要知道

文章插图
 
它的上方有两个枝丫,一个线程属性,一个EventLoop,它是Netty的Reactor线程 。
既然是Reactor线程,那么首先我们需要一个多路复用器 。在Netty NioEventLoop中,包就含一个 Selector,它的操作对象是Channel 。
Netty中的这些知识点,你需要知道

文章插图
 
NioEventLoop的主要逻辑在它的run()方法,方法体内是一个无限循环 for (;;),循环体内实现Loop功能 。这也是通用的NIO线程实现方式 。
Netty中的这些知识点,你需要知道

文章插图
 
 
Loop 从任务队列里获取任务,然后检查多路复用器中就绪的Channel进行处理 。
三、UnsafeNetty中的Unsafe,一个Channel内部聚合接口,用以处理实际的网络I/O读写 。当然,取Unsafe命名,源码中释义:提供的网络相关的操作方法,永远不应该被开发人员操作使用 。
它是Channel的一个辅助接口,主要方法:
1、register:注册Channel
2、deregister:取消注册
3、bind:绑定地址,服务端绑定监听特定端口;客户端指定本地绑定Socket地址 。
4、connect:建立连接
【Netty中的这些知识点,你需要知道】5、disconnect:断开连接
6、close:关闭连接
7、write:调度写,将数据写入buffer,并未真正进入Channel
8、flush:将缓冲区中的数据写入Channel
四、AdaptiveRecvByteBufAllocator动态缓冲区分配器,源码说明:根据实时的反馈动态的增加或者减少预需的缓冲区大小 。
如果上一次分配的缓冲区被填满了,则调高下一次分配的缓冲区大小 。
如果连续两次实际使用的容量低于分配的缓冲区大小特定比例,则减小下一次分配的缓冲区大小 。
其它情景,保持分配大小不变 。
Netty的这种“智能化”处理,可以说是相当有用的:
1、首先,实际的应用场景千差万别,同一场景下不同时刻的缓冲区需求也是实时变化(一句话可以是一个字,也可能是1000个字),这就需要Netty动态调整缓冲分配大小以适应不同的业务场景,时刻场景 。
Netty中的这些知识点,你需要知道

文章插图
 
2、其次,过大的不必要的内存分配,会导致Buffer处理性能下降;过小的内存分配,则会导致频繁的分配释放 。这都是一个优良的网络框架不应该有的 。
3、最后,动态的调整最直接的好处就是内存的的高效使用,一定程度上做到了按需分配 。
五、ChannelPipelinePipeline 管道,Channel的数据流通管道,在这个管道中,可以做很多事情 。
ChannelPipeline 是一种职责链,可以对其中流动的数据进行过滤、拦截处理,是一种插拔式的链路装配器 。
Netty中的这些知识点,你需要知道

文章插图
 
1、ChannelPipline是一个容器支持查询、添加、删除、替换等容器操作 。
2、ChannelPipline支持动态的添加和删除 HandlerChannelPipline的这种特性给了我们相当的想象空间,例如动态的添加系统拥塞保护Handler,敏感数据过滤Handler、日志记录Handler、性能统计Handler等 。
3、ChannelPipline 是线程安全的ChannelPipline使用 synchronized 实现线程安全,业务线程可以并发的操作ChannelPipline 。但需要注意的是,Handler是非线程安全的 。


推荐阅读