Netty(十六)——总体之览

       在前边我们查看了Netty核心类功能及一些源码的查看分析,这篇我们从总体架构的视角来看看Netty是什么样的,方便更好的理解。先简单总结一下Netty的核心类:

ByteBuf

网络数据的基本单位总是字节,Java NIO 提供了ByteBuffer作为它的字节容器,但是其过于复杂且繁琐。Netty的ByteBuf替代ByteBuffer,一个强大的实现,即解决了JDK API的局限性,又为网络应用程序的开发者提供了更好的API。

Channel

Netty网络操作抽象类,聚合了一组功能,包括但不限于网络的读写,客户端发起连接,主动关闭连接,链路关闭,获取通信双方的网络地址等,也可以获取本身的EventLoop,获取缓冲分配区的ByteBufAllocator和pipeline等。

ChannelPipeline

利用职责链模式,是Channel的数据在此管道中进行传递扭转。

ChannelHandler

具体业务处理,挂在ChannelPipeline,在数据传递扭转的过程中,在不同的节点进行不同的业务处理。

EventLoop

Netty通过Reactor多线程模式,通过线程池分离、多路复用、异步回调,串行处理等方式使Netty的性能大大提高。

Future

利用多线程的异步调用,异步通知,来取代同步返回,使性能大大提高。

       总结一句话:Reactor模式中线程池中的线程EventLoop,将消息内容从Channel中获取,存在缓冲区ByteBuf中,在ChannelPipeline进行流转,被不同的ChannelHandler进行相对业务的处理,利用Future进行异步回调通知,将处理好的消息,写入到Channel进行发射出去。

      下边看下这篇的简单思维导图:

      一,Netty逻辑架构:看下经典的这张图:

       1,Reactor通讯调度层:

       由Reacotr线程NioEventLoop及其父类,NioSocketChannel/NioServerSocketChannel及其父类,ByteBuf、Unsafe等等各种类来组合完成。主要解决了监听网络的读写和连接操作,将网络层的数据读取到缓冲区中,然后触发各种网络事件,例如:连接创建、连接激活,读事件,写事件等,并将这些触发事件发送到Pipeline中,进行后期的流转处理。

       2,职责链层——ChannelPipeline:

       负责事件在职责链中有序的传播,同时可以动态的编排职责链,可以选择监听和处理自己关心的事件,拦截向前、向后传播的事件。

       3,业务逻辑编排层——ChannelHandler:

       业务逻辑编排层通常有两类:一是纯粹的业务处理逻辑编排;二是其他应用层协议插件,用于特定协议相关的会话和链路管理(暂时理解不够)。这层也是我们开发人员关心并编写实现的。

      二,架构质量保证:

       1,高性能设计:

高性能设计

 1,采用异步非阻塞的I/O类库,基于Reactor模式实现,解决了传统BIO模式下一个服务端无法平滑的处理线性增长的客户端问题;

2,TCP接收和发送缓冲区使用直接内存代替堆内存,避免内存复制,提升I/O读取和写入的性能;

3,支持通过利用内存池的方式循环利用ByteBuf,避免了频繁创建和销毁ByteBuf带来的性能损耗;

4,可配置的I/O线程和TCP参数,为不同化用户场景提供定制化的参数调优,满足不同的性能场景;

5,采用环形数组缓冲区实现无锁化并发编程,代替传统的线程安全容器或者锁;

6,合理使用线程安全容器,原子类等,提升系统的并发处理能力;

7,关键资源处理采用单线程串行化处理方式,避免多线程并发访问,带来的锁竞争和额外的CPU资源消耗;

8,通过引用计数器及时申请释放不再被引用的对象,细粒度的内存管理,降低了GC的频率,减少了频繁GC带来的延时和CPU损耗

       2,可靠性设计:

可靠性设计

1,链路有效性检测:

a,读空闲超时心跳检测机制;

b,写空闲超时心跳检测机制

c,用户订阅相关事件,自定义处理机制

2,内存保护机制:

a,通过对象引用计数器对Netty的ByteBuf等内置对象进行细粒度的内存申请和释放,对非法的对象引用进行检测和保护;

b,通过内存池来重用ByteBuf,节省内存;

c,可设置的内存容量上限,包括ByteBuf、线程池线程数等。

3,优雅停机:

Netty中线程、Channel、Unsafe、ChannelPipeline、ChannelHandler等关闭的时候都会释放占用的相关资源。例如将缓冲区的消息处理完或者清空,将待刷新的数据持久化到磁盘或者数据库中等结束后,在进行退出。

       3,可定制性:

可定制性设计
1,责任链模式:ChannelPipeline,便于业务逻辑的拦截、定制和扩展。
2,基于接口的开发:关键的类库都提供了接口或者抽象类,用户可以方便的自定义实现相关的接口而替代原生的。
3,提供了大量的工厂类,通过重载这些工厂类可以按需创建用户实现的对象。
4,提供了大量的系统参数供用户按需配置,增强系统的场景适应性。

       4,可扩展性:用户可以方便的利用Netty扩展自己的东西。

       当然Netty当中对多线程的运用也是炉火纯青,synchronized、lock、volatitle、CAS,线程的交互,线程的相互交互控制等。

       综上,为Netty的总体大概,学习其优点,学习其设计思想,学习其设计时思考问题的点。好了,继续……

       

猜你喜欢

转载自blog.csdn.net/liujiahan629629/article/details/84995804