netty源码解解析(4.0)-1 核心架构

netty是java开源社区的一个优秀的网络框架。使用netty,我们可以迅速地开发出稳定,高性能,安全的,扩展性良好的服务器应用程序。netty封装简化了在服务器开发领域的一些有挑战性的问题:jdk nio的使用;多线程并发;扩展性。它还提供了多种应用层协议的支持:http/https/websock, protobuf, 自定义协议, 简化了服务器协议的开发。
netty是一个基于事件驱动的框架,它把事件分成两种类型:输入事件(inbound)和输出事件(outbound), 整个框架都是围绕事件处理进行设计的,以下是netty的核心架构:

上图中涉及到了netty的六个核心对象:
Channel: 一个I/O操作的对象,所有的inbound事件都是由Channel产生,outbound事件最终都会有Channel处理(如果outbound事件没有被用户注册的handler丢弃的话)。
ChannelPipeline: 有一个ChannelPipeline实例属于一个Channel实例,它是事件传播的管道,从Channel实例接收inbound事件,把outbound事件提交给Channel。
ChannelHandlerContext: 这是一个双向链表结构,它的多个实例组成了一个双向链表,并有ChannelPipeline负责维护。 在ChannelPipeline的默认实现中,这个链默认添加了Head和Tail节点, Head节点同时实现ChannelOutboundHandler和ChannelInboundHandler接口,Head节点比较特殊,它会最终把事件交给Channel处理。Tail节点实现了ChannelInboundHandler接口,使用Channel触发的inbound事件会首先传到这里处理。
ChannelHandler: 这里是netty的扩展接口,也是真正实现服务器通讯协议和业务功能功能的地方。ChannelHandler有两种类型:处理输入事件的ChannelinboundHandler和处理输出事件的ChannelOutboundHandler。用户的ChannelHandler要实现这两个接口中的任意一个或全部。当用户向ChannelPipeline注册自己的ChannelHandler时,ChannelPipleline会创建一个相应的ChannelHandlerContext实例,并让这个实例持有用户注册的ChannelHandler实例。然后把这个实例添加到双向链表中。用户注册的ChannelHandler的类型决定了这个实例的类型,进而决定了这个实例能够处理的事件类型。
EventLoopGroup: 在Channel上执行I/O的线程组,netty把这个线程组中的线程定义为I/O线程,后面会讲到,有些特定的事件必须在I/O线程中处理。
EventExecutorGroup: 用来执行ChannelHandlerContext和ChannelHandler中回调方法的线程。在用户向ChannelPipeline中注册一个ChannelHanlder时,如果指定了一个EventExecutorGroup,那么它和它对应的ChannelHandlerContext都会在指定的EventExecutorGroup执行,否则,在Channel的EventLoopGroup中执行。
 
以上是netty核心架构中的核心核心对象,netty提供的所有能力都是通过对这些核心对象的扩展实现的。例如:
NioSocketChannel和NioServerSocketChannel扩展了Channel, NioEventLoopGroup扩展了EventLoopGroup, netty通过这一组扩展实现了对JDK NIO的封装。
ProtoBufDecoer和ProtoBufEncoder扩展ChannelHandler实现了对potobuf协议的支持。
HttpObjectDecoder和HttpObjectEncoder扩展ChannelHandler实现了对http协议的支持。
此外开发者还可通过对EventLoopGroup和EventExecutorGroup扩展实现不一样的线程模型,满足特定业务场景的需求。
还可以对ChannelPipleline和ChannelHandlerContext扩展实现自定义的事件传递和处理流程。

猜你喜欢

转载自www.cnblogs.com/brandonli/p/9906508.html
今日推荐