Netty-基础篇
核心组件
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.提供有关用户自定义事件的通知。