netty原理图(理解Netty的原理图)
理解Netty的原理图
Netty是一个高性能、异步事件驱动的网络通信框架。它的设计灵活且易于使用,支持多种协议,适用于构建高性能的网络通信应用程序。Netty使用的是Java语言,底层采用NIO(non-blocking I/O) 的方式实现。
NIO原理图
在理解Netty之前,我们需要先理解Java NIO(Non-blocking IO)的基本原理。
在传统的Java I/O中,每一个连接都需要一个线程来处理。这种方式本质上是一种同步处理方式,相对来说效率比较慢,尤其当并发数上升的时候,在系统资源占用和线程调度等方面都会带来压力。而 NIO 则完全不同,它提供了基于事件驱动的异步方式,可以大大地提升并发性能,同时占用的系统资源也会更少。
下面是Java NIO 的工作原理图:
![Java NIO 原理图](https://i.imgur.com/h9sLdMd.png)在这个流程中,客户端通过 selector 注册一个 socket,selector 会监听这个 socket,当有事件发生时,它会通知对应的处理器进行处理。当客户端发送请求时,服务器会使用 channel 进行处理,从 channel 中读取数据,处理完之后再通过通道将处理结果返回给客户端。
Netty的原理图
Netty的原理图像下图所示:
![Netty工作原理图](https://i.imgur.com/jvzRsNj.png)Netty的工作原理与NIO非常相似,都是基于事件驱动的异步处理器。在Netty中,所有的连接都是通过Channel来进行处理的,Channel是一个可以进行双向数据传输的抽象类。在处理器中,她会注册所有的 Channel,等待事件的发生。当有事件发生时,处理器会交给对应的Handler进行处理。
Netty设计良好,整个架构非常清晰。Netty的组件之间的关系是非常松散
的,每个组件都只关注自己的核心功能,而不会对其他组件进行干涉。当需要对Netty进行定制时,只需要添加相应的处理器即可。
Netty核心技术
1. Channel
Netty的Channel能够适应多种协议,比如HTTP、WebSocket等等。其通常包括输入(Inbound)与输出(Outbound)两个方向。比如,当我们从HTTP客户端向服务器发送一个HTTP请求时,客户端是输入方向,服务器是输出方向。
在Netty中,所有的输入和输出都会被封装成事件传递给下一个处理器,经过一系列过滤器后,一直到真正的处理器(Handler)来执行处理逻辑。这些事件包括:连接建立、连接关闭、数据写入,数据读取等等。
2. EventLoop
EventLoop是一个线程执行器,用于处理事件。在Netty中,每个Channel在绑定到一个EventLoop时都会创建一个EventLoop处理器,用于处理对应的事件。不同的Channel可以指派处理器到相同的EventLoop中。这样,我们就可以确保在多个 Channel 中,每个Channel都可以被绑定到同一个 EventLoop 中处理。
3. PipeLine
PipeLine是一串处理器的对象集合。在Netty中,你可以很容易地将多个处理器配置在一个PipeLine中,以达到特定的业务需求。数据会在这些处理器中按照指定的顺序流动,最后流到客户端或服务端。
每个PipeLine可以包含许多不同类型的处理器。这些处理器可以是数据编码器(Encoder)、数据解码器(Decoder)、业务处理器(Handlers)等等。每个Channel都至少包含一个PipeLine。
小结
相比于传统的多线程I/O,Netty具有更高的性能和可扩展性。Netty可以从网络通信角度看待Socket,把网络通信的常规操作分解为不同的阶段,构造出Pipeline处理对象。作为一种支持多种协议并易于定制的高性能网络通信框架,Netty重度使用了NIO/Event-driven模型,设计优秀,使用简单,因此深受开发者的喜爱。