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扩展实现自定义的事件传递和处理流程。

netty源码解解析(4.0)-1 核心架构的更多相关文章

  1. netty源码解解析(4.0)-11 Channel NIO实现-概览

      结构设计 Channel的NIO实现位于io.netty.channel.nio包和io.netty.channel.socket.nio包中,其中io.netty.channel.nio是抽象实 ...

  2. netty源码解解析(4.0)-10 ChannelPipleline的默认实现--事件传递及处理

    事件触发.传递.处理是DefaultChannelPipleline实现的另一个核心能力.在前面在章节中粗略地讲过了事件的处理流程,本章将会详细地分析其中的所有关键细节.这些关键点包括: 事件触发接口 ...

  3. netty源码解解析(4.0)-17 ChannelHandler: IdleStateHandler实现

    io.netty.handler.timeout.IdleStateHandler功能是监测Channel上read, write或者这两者的空闲状态.当Channel超过了指定的空闲时间时,这个Ha ...

  4. netty源码解解析(4.0)-18 ChannelHandler: codec--编解码框架

    编解码框架和一些常用的实现位于io.netty.handler.codec包中. 编解码框架包含两部分:Byte流和特定类型数据之间的编解码,也叫序列化和反序列化.不类型数据之间的转换. 下图是编解码 ...

  5. netty源码解解析(4.0)-20 ChannelHandler: 自己实现一个自定义协议的服务器和客户端

    本章不会直接分析Netty源码,而是通过使用Netty的能力实现一个自定义协议的服务器和客户端.通过这样的实践,可以更深刻地理解Netty的相关代码,同时可以了解,在设计实现自定义协议的过程中需要解决 ...

  6. netty源码解解析(4.0)-15 Channel NIO实现:写数据

    写数据是NIO Channel实现的另一个比较复杂的功能.每一个channel都有一个outboundBuffer,这是一个输出缓冲区.当调用channel的write方法写数据时,这个数据被一系列C ...

  7. netty源码解解析(4.0)-14 Channel NIO实现:读取数据

     本章分析Nio Channel的数据读取功能的实现. Channel读取数据需要Channel和ChannelHandler配合使用,netty设计数据读取功能包括三个要素:Channel, Eve ...

  8. netty源码解解析(4.0)-4 线程模型-概览

    netty线程体系概览 netty的高并发能力很大程度上由它的线程模型决定的,netty定义了两种类型的线程: I/O线程: EventLoop, EventLoopGroup.一个EventLoop ...

  9. netty源码解解析(4.0)-12 Channel NIO实现:channel初始化

    创建一个channel实例,并把它register到eventLoopGroup中之后,这个channel然后处于inactive状态,仍然是不可用的.只有在bind或connect方法调用成功之后才 ...

随机推荐

  1. AVH IP网络广播系统

    AVH  IP网络广播系统特点:        IP网络广播系统是基于当前已广泛使用的以太网网络平台,充分利用网络平台,如用户处已有网络平台,则无需再布线,完全不同于纯模拟广播.调频寻址广播和数控广播 ...

  2. Maven学习 四 Eclipse与Maven结合的配置

    本问承接Maven学习 三 第一步:配置本地仓库 (1)默认配置 查看 本地仓库的位置是在一个叫做setting.xml的配置文件中设置,如果我们不配置,会使用开发工具自己集成的一个setting.x ...

  3. Alpha项目冲刺

    一.团队成员 学号 姓名 211606361 何承华(队长) 211606356 陈宇 211606360 丁培辉 211606333 温志铭 211606343 杨宇潇 211606391 张主强 ...

  4. lwip-动态内存管理

    动态内存管理涉及两类重要函数,内存分配函数,内存释放函数,如C语言中的malloc和free. 内存分配的本质是:在事先准好一大块内存堆(可以理解为一个很大的数组)中分配合适的空间,然后将该空间起始地 ...

  5. ubuntu16.04安装最新版docker、docker-compose、docker-machine

    安装前说明: 本文将介绍在ubuntu16.04系统下安装和升级docker.docker-compose.docker-machine. docker:有两个版本:docker-ce(社区版)和do ...

  6. [bug]”System.InvalidProgramException:公共语言运行时检测到无效程序“解决方案

    Visual Studio 2017版本15.8.x运行某些程序会报这样的错误:“System.InvalidProgramException:公共语言运行时检测到无效程序” 此问题的临时解决方案: ...

  7. Lerning Entity Framework 6 ------ Handling concurrency With SQL Server Database

    The default Way to handle concurrency of Entity Framework is using optimistic concurrency. When two ...

  8. Codeforces gym102152 K.Subarrays OR

    传送:http://codeforces.com/gym/102152/problem/K 题意:给定$n(n\le10^5)$个数$a_i(a_i\le10^9)$,对于任一个子数组中的数进行或操作 ...

  9. Java 虚拟机的内存结构

    Java虚拟机运行时数据区 整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的J ...

  10. Shell-9--条件测试