Netty-基础篇

发布时间 2023-11-16 23:21:56作者: 轻寒

核心组件

EventLoopGroup

概念:由一个或多个EventLoop组成的组,用于处理所有的Channel的I/O操作,可以将其看作是一个线程池。

1.包含多个EventLoop。

2.EventLoopGroup将为每个新创建的Channel分配一个EventLoop。在每个Channel的整个生命周期内,所有的操作都将由相同的Thread执行。

3.每个EventLoop将处理分配给它的所有Channel的所有事件和任务。每个EventLoop都和一个Thread关联。

EventLoop — 控制流、多线程处理、并发

概念:事件循环器,用于处理所有I/O事件和请求。Netty的I/O操作都是异步非阻塞的,它们由EventLoop处理并以事件的方式触发回调函数。

1.一个 EventLoop 在它的生命周期内只和一个 Thread 绑定。

2.所有由 EventLoop 处理的 I/O 事件都将在它专有的 Thread 上被处理。

3.一个 Channel 在它的生命周期内只注册于一个 EventLoop。

4.一个 EventLoop 可能会被分配给一个或多个 Channel。

ChannelPipeline

概念:由一组ChannelHandler组成的管道,用于处理Channel上的所有I/O 事件和请求,Netty中的数据处理通常是通过将一个数据包装成一个ByteBuf对象,并且通过一个 ChannelPipeline来传递处理,以达到业务逻辑与网络通信的解耦。

ChannelPipeline 提供了 ChannelHandler 链的容器,并定义了用于在该链上传播入站 和出站事件流的 API。当 Channel 被创建时,它会被自动地分配到它专属的 ChannelPipeline。

ChannelHandler 安装到 ChannelPipeline 中的过程:

1.一个ChannelInitializer的实现被注册到了ServerBootstrap中。

2.当 ChannelInitializer.initChannel()方法被调用时,ChannelInitializer 将在 ChannelPipeline 中安装一组自定义的 ChannelHandler。

3.ChannelInitializer 将它自己从 ChannelPipeline 中移除。

Channel——socket

概念:用于网络通信的通道,可以理解为Java NIO中的SocketChannel。

1.基本的 I/O 操作(bind()、connect()、read()和 write())依赖于底层网络传输所提 供的原语。

2.Channel 也是拥有许多 预定义的、专门化实现的广泛类层次结构的根。

ChannelFuture — 异步通知。

概念:异步操作的结果,可以添加监听器以便在操作完成时得到通知。

因为一个操作可能不会 立即返回,所以我们需要一种用于在之后的某个时间点确定其结果的方法。为此,Netty 提供了 ChannelFuture 接口,其 addListener()方法注册了一个 ChannelFutureListener,以 便在某个操作完成时(无论是否成功)得到通知。

ChannelHandler——适配器

概念:用于处理Channel上的I/O事件和请求,包括编码、解码、业务逻辑等,可以理解为NIO中的ChannelHandler。

入起点-ChannelInboundHandlerAdapter。

出起点-ChannelOutboundHandlerAdapter。

结构:

1.channelActive()——在到服务器的连接已经建立之后将被调用。

2.channelRead()——当从服务器接收到一条消息时被调用。

3.exceptionCaught()——在处理过程中引发异常时被调用。

典型用途:

1.将数据从一种格式转换为另一种格式。

2.提供异常的通知。

3.提供Channel变为活动或者非活动的通知。

4.提供当Channel注册到EventLoop或者EventLoop注销时的通知。

5.提供有关用户自定义事件的通知。