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

原文地址:https://www.cnblogs.com/brandonli/p/9906508.html

时间: 2024-08-28 00:45:59

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

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

 本章分析Nio Channel的数据读取功能的实现. Channel读取数据需要Channel和ChannelHandler配合使用,netty设计数据读取功能包括三个要素:Channel, EventLoop和ChannelHandler.Channel有个read方法,这个方法不会直接读取数据,它的作用是通知持有当前channel的eventLoop可以从这个这个channel读取数据了,这个方法被调用之后eventLoop会在channel有数据可读的时候从channel读出数据然后把数

netty源码解解析(4.0)-21 ByteBuf的设计原理

????io.netty.buffer包中是netty ByteBuf的实现.ByteBuf是一个二进制缓冲区的抽象接口,它的功能有: 可以随机访问.顺序访问. 支持基本数据类型(byte, short, int, long, float, double)的序列化和反序列化. 不限制底层原始的数据类型,可以是byte[], NIO Buffer, String, IO Stream, 直接内(C语言中可以表示为指向一块内置起始地址的指针void*, 内存的长度), 等等. 为什么需要ByteBu

netty源码解解析(4.0)-6 线程模型-IO线程EventLoopGroup和NIO实现(一)

接口定义 io.netty.channel.EventLoopGroup extends EventExecutorGroup 方法 说明 ChannelFuture register(Channel channel) 把一个channel注册到一个EventLoop ChannelFuture register(Channel channel, ChannelPromise promise); 同上 io.netty.channel.EventLoop extends OrderedEvent

netty源码解解析(4.0)-8 ChannelPipeline的设计

io.netty.channel.ChannelPipeline 设计原理 上图中,为了更直观地展示事件处理顺序, 故意有规律地放置两种handler的顺序,实际上ChannelInboundHandler和ChanneOutboundHandler的顺序可以是任意,取决于用户调用add方法把handler方在哪里. ChannelPipeline的特性: 1. 它是一个双向链表 2. 每个节点持有一个ChannelHandler实例,这个实例可以是ChannelInboundHandler类型

netty源码解解析(4.0)-16 ChannelHandler概览

本章开始分析ChannelHandler实现代码.ChannelHandler是netty为开发者提供的实现定制业务的主要接口,开发者在使用netty时,最主要的工作就是实现自己的ChannelHandler.ChannelHandler在设计上需要和ChannelPipeline配合共同实现pipeline的事件传递能力,这要求ChannelHandler需要实现一些固定的基本功能.由于这个原因,如果让用户自己完整地实现,会显得比较麻烦.为此netty实现类一系列的类来帮助开发者以简单的方式实

netty源码解解析(4.0)-23 ByteBuf内存管理:分配和释放

ByteBuf内存分配和释放由具体实现负责,抽象类型只定义的内存分配和释放的时机. 内存分配分两个阶段: 第一阶段,初始化时分配内存.第二阶段: 内存不够用时分配新的内存.ByteBuf抽象层没有定义第一阶段的行为,但定义了第二阶段的方法: public abstract ByteBuf capacity(int newCapacity) 这个方法负责分配一个长度为newCapacity的新内存. 内存释放的抽象实现在AbstractReferenceCountedByteBuf中实现,这个类实

netty源码解解析(4.0)-24 ByteBuf基于内存池的内存管理

PooledByteBuf的初始化过程分为两个步骤:创建实例:初始化内存.这两个步骤的代码如下: 507383170 protected PooledByteBuf(Recycler.Handle recyclerHandle, int maxCapacity) { super(maxCapacity); this.recyclerHandle = recyclerHandle; } void init(PoolChunk<T> chunk, long handle, int offset,

JAVA框架底层源码剖析系列Spring,Mybatis,Springboot,Netty源码深度解析

<Spring源码深度解析>从核心实现和企业应用两个方面,由浅入深.由易到难地对Spring源码展开了系统的讲解,包括Spring的设计理念和整体架构.容器的基本实现.默认标签的解析.自定义标签的解析.bean的加载.容器的功能扩展.AOP.数据库连接JDBC.整合MyBatis.事务.SpringMVC.远程服务.Spring消息服务等内容. <Spring源码深度解析>不仅介绍了使用Spring框架开发项目必须掌握的核心概念,还指导读者如何使用Spring框架编写企业级应用,并

【Spring源码深度解析系列 】Spring整体架构

一.Spring的整体架构和模块 二.模块分类: 1.Core Container Core Container包含有Core .Beans.Context.和Expression  Language模块 2.Data Access/Integration Data Access/Integration包含有JDBC.ORM.OXM.JMS和Transaction模块 3.Web Web层包含了Web.Web-Servlet.Web-Struts.Web-Porlet模块. 4.AOP 5.Te