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

摘要:
EventLoop是一种程序设计结构,等待以及分发事件。NioEventLoop,是一个Netty工作线程,又不仅仅是一个Netty工作线程。标准的netty线程模型中我们讲过Netty的标准线程池模型,池子里的每个线程对象就是一个NioEventLoop对象。在NettyNioEventLoop中,包就含一个Selector,它的操作对象是Channel。ChannelPipeline是一种职责链,可以对其中流动的数据进行过滤、拦截处理,是一种插拔式的链路装配器。

一、Channel

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

Channel是一个门面,封装了包括网络I/O及相关的所有操作。

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

Netty中的这些知识点,你需要知道!第1张

一个Channel对应一个物理连接,是基于物理连接上的操作包装。

二、EventLoop

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

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

Netty中的这些知识点,你需要知道!第2张

NioEventLoop,是一个Netty工作线程,又不仅仅是一个Netty工作线程。

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

说它不仅仅是一个Netty线程,因为它实现了很多功能,我们可以看下它的继承图:

Netty中的这些知识点,你需要知道!第3张

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

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

Netty中的这些知识点,你需要知道!第4张

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

Netty中的这些知识点,你需要知道!第5张

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

三、Unsafe

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

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

1、register:注册Channel

2、deregister:取消注册

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

4、connect:建立连接

5、disconnect:断开连接

6、close:关闭连接

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

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

四、AdaptiveRecvByteBufAllocator

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

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

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

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

Netty的这种“智能化”处理,可以说是相当有用的:

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

Netty中的这些知识点,你需要知道!第6张

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

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

五、ChannelPipeline

Pipeline 管道,Channel的数据流通管道,在这个管道中,可以做很多事情。

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

Netty中的这些知识点,你需要知道!第7张

1、ChannelPipline是一个容器

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

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

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

3、ChannelPipline 是线程安全的

ChannelPipline使用synchronized实现线程安全,业务线程可以并发的操作ChannelPipline。但需要注意的是,Handler是非线程安全的

六、HandlerAdapter

Adapter是一种适配器,对于用户自定义的Handler,可以通过继承HandlerAdapter,来规避不必要的接口实现

Netty中的这些知识点,你需要知道!第8张

免责声明:文章转载自《Netty中的这些知识点,你需要知道!》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHP pdf转png windows版本CocoaPods管理本地库简单步骤下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

springboot配置 Druid , yml格式

datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mp?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai u...

C#中回滚TransactionScope的使用方法和原理

TransactionScope只要一个操作失败,它会自动回滚,Complete表示事务完成  实事上,一个错误的理解就是Complete()方法是提交事务的,这是错误的,事实上,它的作用的表示本事务完成,它一般放在try{}的结尾处,不用判断前台操作是否成功,如果不成功,它会自己回滚。 在.net 1.1的时代,还没有TransactionScope类...

Java 程序员常用的个Linux命令

1. 查找文件 find / -name filename.txt 根据名称查找/目录下的filename.txt文件。 2. 查看一个程序是否运行 ps –ef|grep tomcat 查看所有有关tomcat的进程 3. 终止线程 kill -9 19979 终止线程号位19979的线程 4. 查看文件,包含隐藏文件 ls -al 5. 当前工作目录...

Linux线程属性总结

线程属性标识符:pthread_attr_t 包含在 pthread.h 头文件中。 [c] view plaincopy  //线程属性结构如下:   typedef struct   {       int                   etachstate;      //线程的分离状态       int              ...

性能测试三十二:监控之Java线程监控

线程的五种状态* 新建:new* 运行:runnable* 等待:waitting(无限期等待),timed waitting(限期等待)* 阻塞:blocked* 结束:terminated 线程的两种监控方法一,jvisualvm,图形界面的方式监控之前先对jvm加监控参数,在tomcat的bin目录下,catalina.sh文件中,第二行添加:JA...

Android 异步框架 RxJava2

观察者模式的概念 RxJava是android的异步框架,官方介绍是可观测的序列,组成异步基于事件程序的库。特点是观察者模式,基于事件流的链式调用,随着异步操作调度过程复杂的情况下,程序逻辑也变得越来越复杂,但RxJava依然能够保持简洁。 简单的说观察者A与被观察者B建立订阅关系,当被观察者B发生某种改变时,立即通知观察者A 添加依赖 compile '...