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

1、Channel

Channel是一个接口,并且是一个很大的接口,咱们称之为“大而全”,囊括了server端及client端接口所须要的接口。html

Channel是一个门面,封装了包括网络I/O及相关的全部操做。安全

Channel聚合了包括网络读写、链路管理、网络链接信息、获取EventLoop、Pipeline等相关功能类;统一分配,调度实现相应场景的功能。网络

一个Channel 对应一个物理链接,是基于物理链接上的操做包装。并发

2、EventLoop

EventLoop,Event意为事件、Loop意为环,EventLoo即为事件环框架

EventLoop是一种程序设计结构等待以及分发事件。oop

NioEventLoop,是一个Netty工做线程,又不只仅是一个Netty工做线程。性能

标准的netty线程模型 中咱们讲过Netty的标准线程池模型,池子里的每一个线程对象就是一个NioEventLoop对象。或负责接受链接,或负责网络I/Ospa

说它不只仅是一个Netty线程,由于它实现了不少功能,咱们能够看下它的继承图:线程

它的上方有两个枝丫,一个线程属性,一个EventLoop,它是Netty的Reactor线程设计

既然是Reactor线程,那么首先咱们须要一个多路复用器。在Netty NioEventLoop中,包就含一个 Selector,它的操做对象是Channel。

NioEventLoop的主要逻辑在它的run()方法,方法体内是一个无限循环 for (;;),循环体内实现Loop功能。这也是通用的NIO线程实现方式。

Loop 从任务队列里获取任务,而后检查多路复用器中就绪的Channel进行处理。

3、Unsafe

Netty中的Unsafe,一个Channel内部聚合接口,用以处理实际的网络I/O读写。固然,取Unsafe命名,源码中释义:提供的网络相关的操做方法,永远不该该被开发人员操做使用。

它是Channel的一个辅助接口,主要方法:

一、register:注册Channel

二、deregister:取消注册

三、bind:绑定地址,服务端绑定监听特定端口;客户端指定本地绑定Socket地址。

四、connect:创建链接

五、disconnect:断开链接

六、close:关闭链接

七、write:调度写,将数据写入buffer,并未真正进入Channel

八、flush:将缓冲区中的数据写入Channel

4、AdaptiveRecvByteBufAllocator

动态缓冲区分配器,源码说明:根据实时的反馈动态的增长或者减小预需的缓冲区大小。

若是一次分配的缓冲区被填满了,则调高下一次分配的缓冲区大小。

若是连续两次实际使用的容量低于分配的缓冲区大小特定比例,则减少下一次分配的缓冲区大小。

其它情景,保持分配大小不变。

Netty的这种“智能化”处理,能够说是至关有用的:

一、首先,实际的应用场景千差万别,同一场景下不一样时刻的缓冲区需求也是实时变化(一句话能够是一个字,也多是1000个字),这就须要Netty动态调整缓冲分配大小以适应不一样的业务场景,时刻场景

二、其次,过大的没必要要的内存分配,会致使Buffer处理性能降低;太小的内存分配,则会致使频繁的分配释放。这都是一个优良的网络框架不该该有的。 

三、最后,动态的调整最直接的好处就是内存的的高效使用,必定程度上作到了按需分配。 

5、ChannelPipeline

Pipeline 管道,Channel的数据流通管道,在这个管道中,能够作不少事情。

ChannelPipeline 是一种职责链,能够对其中流动的数据进行过滤、拦截处理,是一种插拔式的链路装配器

一、ChannelPipline是一个容器

支持查询、添加、删除、替换等容器操做。

二、ChannelPipline支持动态的添加和删除 Handler

ChannelPipline的这种特性给了咱们至关的想象空间,例如动态的添加系统拥塞保护Handler,敏感数据过滤Handler、日志记录Handler、性能统计Handler等。

三、ChannelPipline 是线程安全的

ChannelPipline使用 synchronized 实现线程安全,业务线程能够并发的操做ChannelPipline。但须要注意的是,Handler是非线程安全的

6、HandlerAdapter

Adapter是一种适配器,对于用户自定义的Handler,能够经过继承HandlerAdapter,来规避没必要要的接口实现

相关文章
相关标签/搜索