Netty逻辑架构:
Reactor通信调度层:
由一些辅助类完成,比如NioEventLoop、NioSocketChannel/NioServerSocketChannel、各类Buffer、Unsafe以及衍生类,其主要职责就是监听网络的读写和连接操作,负责将网络层的数据读取到内存缓冲区中,然后触发各种事件,这些事件由PipeLine管理Handler进行处理。
职责链ChannelPipeline:
负责事件在职责链中有序传播,可以把ChannelPipeline看成是一个ChandlerHandler的链表,当需要对Channel进行某种处理的时候,Pipeline负责依次调用每一个Handler进行处理。
ChannelPipeline并不是直接管理ChannelHandler,而是通过ChannelHandlerContext来间接管理,这一点通过ChannelPipeline的默认实现DefaultChannelPipeline可以看出来。
业务逻辑编排层(Service ChannelHandler):
这一层分为两类,纯粹的业务逻辑编排和其他的应用层协议插件(用于特定协议相关的会话和链路管理)。
Netty架构质量属性:
一、高性能
Netty实现高性能的方法:
(1)采用异步非阻塞的I/O类库,基于Reactor模式实现,解决传统阻塞I/O的性能问题。
(2)TCP接收和发送缓冲区使用直接内存代替堆内存,避免内存复制,提高读写性能。
(3)通内存池的方式循环利用ByteBuffer,避免频繁创建销毁Buffer带来的性能损耗。
(4)采用环形数组缓冲区实现无锁化并发编程,替代传统的线程安全容器或锁。
(5)可配置的I/O线程数和TCP参数,为不同场景和情况提供相应调优参数。
(6)合理地使用线程安全容器和原子类,提高系统的并发处理能力。
(7)关键资源进行单线程串行化,避免多线程并发访问造成的数据共享和性能损耗问题。
(8)通过引用计数器及时申请释放不再被引用的对象,细粒度的内存管理降低了GC的频率。
二、可靠性
(1)链路有效性监测
一旦链路建立成功后便是长连接,要保证长连接的链路有效性,就需要通过心跳机制周期性的进行链路检测(系统空闲时链路出现问题无法识别出,待到业务高峰期会造成大量业务失败)。
Netty的心跳读写机制分为两种,读空闲超时机制和写空闲超时机制。
读空闲超时机制:连续周期T没有消息可读时,触发超时Handler,用户可以基于读空闲超时发送心跳消息进行链路检测;连续N个周期没有读取到对方的心跳消息,可以主动关闭链路。
写空闲超时机制:连续周期T没有消息要发送时,触发超时Handler,用户可以基于写空闲超时发送心跳消息进行链路检测;连续N个周期没有接收到对方的心跳消息,可以主动关闭链路。
(2)内存保护机制
①通过内存池来重用ByteBuffer,节省内存。
②通过对象引用计数器对Netty的ByteBuffer等内置对象进行细粒度的内存申请和释放,对非法的对象引用进行检测和保护。
③ 可设置内存容量上限,包括ByteBuffer和线程池线程数,防止内存溢出。
(3)优雅停机
当系统退出时,JVM通过注册的ShutdownHook拦截到退出信号量,执行退出操作->释放相关模块资源->清除缓冲区的消息->将待刷新的数据持久化到磁盘或数据库中->等待资源回收和缓冲区消息处理完成。
三、可定制性和可扩展性
ChannelPipeLine基于责任链模式开发,便于业务逻辑拦截、定制和扩展;
关键类库都提供了接口或者抽象类,可以自定义实现接口;
提供大量工厂类按需创建出需要的对象;
提供大量的系统参数供用户按需设置,增强系统的场景定制性;
基于NIO框架可以方便地进行应用层协议定制;