文章目录

  • 前言
  • Netty 架构概览
    • 核心组件:
    • 多线程模型:
  • 代码示例:
    • 1. Channel 接口:
    • 2. EventLoop
    • 3. ChannelPipeline
  • 总结

前言

为了方便大家理解,我每个文章都会画出逻辑图,以方便大家理解,大家可以结合着图来进行学习

Netty 架构概览

核心组件:

Channel、EventLoop、ChannelPipeline 的概念和作用:
1. Channel
概念:在 Netty 中,Channel 是数据的传输载体,代表了一个开放的连接。它可以是网络套接字,也可以是文件或其他资源的连接。Channel 提供了异步的 I/O 操作,支持多种协议,如 TCP、UDP。
作用:执行读取和写入操作。
提供异步事件通知机制,例如连接建立、连接关闭等。
允许用户自定义的 ChannelHandler 处理网络事件。
2. EventLoop
概念:EventLoop 是 Netty 的核心机制之一,用于处理所有的 I/O 事件和任务。每个 Channel 都会被分配给一个 EventLoop,负责处理该 Channel 上的所有事件。
作用:处理注册到它上面的所有 Channel 的 I/O 事件。
提供了定时任务的调度功能。
是单线程或多线程的执行环境,具体取决于 EventLoopGroup 的配置。
运行机制:每个 EventLoop 都运行在自己的线程中,负责处理分配给它的 Channel 上的所有事件。
EventLoop 通过事件轮询(event loop)机制,不断从 Channel 的事件队列中取出事件,并执行相应的处理逻辑。
3. ChannelPipeline
概念:ChannelPipeline 是 Netty 的另一个核心组件,它是由一系列 ChannelHandler 组成的管道,用于处理入站和出站的事件和数据。
作用:提供了一种灵活的处理机制,允许用户自定义处理逻辑。
通过添加和移除 ChannelHandler 来修改数据处理的流程。
每个 Channel 都有自己的 ChannelPipeline,使得处理逻辑可以针对具体的 Channel 进行定制。
运行机制:当数据通过 Channel 时,它会被 ChannelPipeline 中的一系列 ChannelHandler 按照顺序处理。
每个 ChannelHandler 负责处理特定的事件或数据转换。数据从 Channel 的头部进入 ChannelPipeline,并逐步经过每个 ChannelHandler,最终到达尾部。

多线程模型:

1. Boss Group 和 Worker Group:
Boss Group:
Boss Group 是用来接收客户端连接的线程组。
在服务端启动时,Boss Group 负责监听端口,接收客户端的连接请求。
Boss Group 中的每个线程都运行在一个独立的线程中,负责监听一个端口。
Worker Group:
Worker Group 是用来处理已经注册到 Boss Group 中的连接的线程组。
每个 Boss Group 接收到的连接都会被注册到 Worker Group 中的某个 Event Loop 上。
Worker Group 中包含多个 Event Loop,每个 Event Loop 独立运行在一个线程中,处理一组连接上的所有 I/O 事件。
2. Event Loop:
Event Loop:
每个 Event Loop 都负责处理一个或多个连接上的所有事件,包括读取数据、写入数据、连接建立、连接关闭等。
每个连接都会被分配到一个 Event Loop 上,保证在同一个连接上的事件都在同一个线程中顺序执行。
Event Loop 采用事件轮询机制,通过循环不断地从连接的事件队列中获取事件,并执行相应的处理逻辑。
3. 多线程的优势:
减小锁的竞争: Netty 的设计中,Boss Group 和 Worker Group 是独立的线程组,它们之间没有共享的状态,因此减小了锁的竞争,提高了并发性能。
任务划分明确: Boss Group 负责接收连接,Worker Group 负责处理连接上的事件,这样任务在不同的线程组中划分得很明确,避免了线程争抢任务的问题。
水平扩展: 可以根据实际需求配置更多的 Boss Group 和 Worker Group,实现水平扩展,提高系统的并发处理能力。
高效的事件驱动: Netty 的事件驱动模型保证了在异步非阻塞的基础上,通过合理的线程划分和事件处理,提高了网络应用程序的性能。
提示:以下是本篇文章正文内容,下面案例可供参考

代码示例:

1. Channel 接口:

1.1 Channel 接口定义:
Channel 是网络连接的抽象,它负责数据的读写,提供了对底层传输细节的抽象。一个 Channel 对应着一个网络连接,可以是客户端与服务器之间的连接或者服务器与客户端之间的连接。

import io.netty.channel.*;import io.netty.util.AttributeMap;public interface Channel extends AttributeMap, ChannelOutboundInvoker, Comparable<Channel> {// 获取与 Channel 相关联的 EventLoopEventLoop eventLoop();// 获取 Channel 的配置信息ChannelConfig config();// 获取 Channel 的唯一标识符ChannelId id();// Channel 的生命周期管理方法boolean isOpen();boolean isActive();ChannelMetadata metadata();// 关闭 ChannelChannelFuture close();ChannelFuture closeFuture();// ... 其他方法 ...}

1.2 AbstractChannel 抽象类:
AbstractChannel 是 Channel 接口的抽象实现,负责创建关联的 ChannelPipeline 和 EventLoop。

public abstract class AbstractChannel extends DefaultAttributeMap implements Channel {private final ChannelId id;private final ChannelPipeline pipeline;private final EventLoop eventLoop;protected AbstractChannel(Channel parent) {this.id = newId();this.pipeline = new DefaultChannelPipeline(this);// 创建与 Channel 关联的默认 ChannelPipelinethis.eventLoop = initEventLoop();// 初始化与 Channel 关联的 EventLoop}public ChannelId id() {return id;}public EventLoop eventLoop() {return eventLoop;}public ChannelPipeline pipeline() {return pipeline;}// ... 其他方法 ...protected abstract ChannelId newId();// 抽象方法,由子类提供生成唯一标识符的逻辑protected abstract EventLoop initEventLoop();// 抽象方法,由子类提供初始化 EventLoop 的逻辑}

2. EventLoop

2.1 EventLoop 接口定义:
EventLoop 是一个用于处理事件和任务的执行引擎,它负责监听 Channel 上的各种事件,如读取、写入、连接等。EventLoop 通过单线程或多线程的方式执行任务队列中的事件。

public interface EventLoop extends EventExecutorGroup {ChannelFuture register(Channel channel);// 将 Channel 注册到 EventLoop 上// ... 其他方法 ...}

2.2 SingleThreadEventLoop 抽象类:
SingleThreadEventLoop 是 EventLoop 接口的一个抽象实现,它表示一个单线程的事件循环。它通过不断轮询任务队列,执行任务。

public abstract class SingleThreadEventLoop extends AbstractEventExecutor implements EventLoop {private final Queue<Runnable> tasks = new LinkedBlockingQueue<>();protected void run() {while (!isShuttingDown()) {Runnable task = tasks.poll();if (task != null) {task.run();}}}public ChannelFuture register(Channel channel) {// ... 具体的注册逻辑 ...}// ... 其他方法 ...}

3. ChannelPipeline

3.1 ChannelPipeline 接口定义:
ChannelPipeline 表示一个 Channel 上的处理链,它由一系列的 ChannelHandler 组成,每个 ChannelHandler 负责处理特定类型的事件或执行特定的任务。

public interface ChannelPipeline extends Iterable<Entry<String, ChannelHandler>> {ChannelPipeline addLast(String name, ChannelHandler handler);// 向 ChannelPipeline 尾部添加 ChannelHandler// ... 其他方法 ...}

3.2 DefaultChannelPipeline 类:
DefaultChannelPipeline 是 ChannelPipeline 接口的默认实现,它负责维护处理链,并提供方法添加、移除、查找 ChannelHandler。

public class DefaultChannelPipeline implements ChannelPipeline {private final AbstractChannel channel;private final Map<String, ChannelHandler> handlers = new LinkedHashMap<>();public DefaultChannelPipeline(AbstractChannel channel) {this.channel = channel;}public ChannelPipeline addLast(String name, ChannelHandler handler) {// ... 具体的添加逻辑 ...}// ... 其他方法 ...}

下面是示例代码,展示了如何使用上述的 AbstractChannel 类以及相关的 EventLoop 和 ChannelPipeline:

public class YourSpecificChannel extends AbstractChannel {public YourSpecificChannel(Channel parent) {super(parent);// 在这里你可以执行一些其他初始化工作}@Overrideprotected ChannelId newId() {return DefaultChannelId.newInstance();}@Overrideprotected EventLoop initEventLoop() {return new NioEventLoopGroup().next();}public static void main(String[] args) {YourSpecificChannel channel = new YourSpecificChannel(null);ChannelPipeline pipeline = channel.pipeline();pipeline.addLast("handler1", new CustomHandler1());pipeline.addLast("handler2", new CustomHandler2());// ... 其他操作 ...}}

在这个示例中,YourSpecificChannel 是你的具体 Channel 实现类,通过继承 AbstractChannel 获得了 newId() 和 initEventLoop() 方法的实现。在 main 方法中,创建了一个 YourSpecificChannel 实例,获取了其 ChannelPipeline 并添加了两个自定义的 ChannelHandler。

总结

在 Netty 中,Channel、EventLoop 和 ChannelPipeline 是构建高性能网络应用程序的核心组件。它们相互协作,提供了一个灵活且可扩展的框架,使得开发者能够轻松处理底层网络通信细节,同时保持代码的清晰和可维护性。
Channel(通道): 表示一个底层的网络连接,是数据的出入口。Channel 提供了对底层传输细节的抽象,包括连接的建立、读写数据等操作。每个 Channel 都有一个唯一的标识符 ChannelId,并与一个 EventLoop 和一个 ChannelPipeline 相关联。Channel 是整个网络通信的基础。
EventLoop(事件循环): 是一个处理事件和任务的执行引擎。EventLoop 负责监听 Channel 上发生的各种事件,如数据读取、写入、连接建立等,并通过单线程或多线程的方式执行相应的任务。每个 Channel 都与一个特定的 EventLoop 相关联,确保在同一线程中处理相关联 Channel 的事件,从而避免了多线程并发问题。
ChannelPipeline(通道管道): 是一个包含一系列 ChannelHandler 的处理链,负责处理传入和传出的数据。ChannelPipeline 将数据的处理过程抽象为一系列的处理器,每个处理器都负责特定类型的事件或任务。通过在 ChannelPipeline 中添加、删除、替换处理器,开发者可以轻松地定制数据的处理流程。ChannelPipeline 为网络应用程序提供了一种灵活的、可扩展的处理模型。
总体而言,Channel 负责数据的传输,EventLoop 管理事件的处理,而 ChannelPipeline 定义了数据的处理流程。它们共同构成了 Netty 强大而灵活的网络编程框架,使得开发者能够更专注于业务逻辑的实现,而无需过多关注底层的网络通信细节。

这里我只做了简单介绍,netty是一个庞大的架构,之后的文章我会分开模块对其进行分析
这里作为目录方便大家学习(后续持续更新中):
学习netty-通俗易懂版本
学习Netty(一)——Netty 架构概览
学习Netty(二)——Netty 启动过程与初始化
学习Netty(三)——Channel 和 EventLoop
学习Netty(四)——ChannelPipeline 和 ChannelHandler
学习Netty(五)——ByteBuf 的设计和使用
学习Netty(六)——编解码器的实现
学习Netty(七)——Selector 和事件模型
学习Netty(八)——性能优化和底层实现细节
学习Netty(九)——代码实现
学习Netty(十)——高级功能和扩展