傻大方


首页 > 潮·科技 > >

绝!真就一文全懂!Netty线程模型+启动详细分析+内存管理( 二 )

傻大方提要:【绝!真就一文全懂!Netty线程模型+启动详细分析+内存管理( 二 )】boss组用来接受客户端发来的连接 , 在监听一个端口的情况下 , 一个NioEventLoop通过一个NioServerSocketChannel监听端口 , 处理TCP连接 。 worker组则负责对完成...



按关键词阅读:


boss组用来接受客户端发来的连接 , 在监听一个端口的情况下 , 一个NioEventLoop通过一个NioServerSocketChannel监听端口 , 处理TCP连接 。 worker组则负责对完成TCP三次握手的连接进行处理 。
如上图每个NioEventLoopGroup里面包含了多个NioEventLoop , 每个NioEventLoop中包含了一个NIO Selector、一个队列、一个线程;其中线程用来做轮询注册到Selector上的Channel的读写事件和对投递到队列里面的事件进行处理 。
核心组件Channel接口、EventLoop接口Channel 是 Netty 网络操作抽象类 , 它除了包括基本的 I/O 操作 , 如 bind、connect、read、write 之外 , 还包括了 Netty 框架相关的一些功能 , 如获取该 Channe l的 EventLoop 。
在传统的网络编程中 , 作为核心类的 Socket, 它对程序员来说并不是那么友好 , 直接使用其成本还是稍微高了点 。 而Netty 的 Channel 则提供的一系列的 API, 它大大降低了直接与 Socket 进行操作的复杂性 。
Netty 基于事件驱动模型 , 使用不同的事件来通知我们状态的改变或者操作状态的改变 。 它定义了在整个连接的生命周期里当有事件发生的时候处理的核心抽象 。
Channel 为Netty 网络操作抽象类 , EventLoop 主要是为Channel 处理 I/O 操作 , 两者配合参与 I/O 操作 。
绝!真就一文全懂!Netty线程模型+启动详细分析+内存管理文章插图

  • 一个EventLoopGroup包含一个或者多个EventLoop
  • 一个EventLoop在他的生命周期只和一个线程绑定
  • 所有由EventLoop处理的I/O事件都将在它专有的线程上被处理
  • 一个Channel在它的生命周期内只注册于一个EventLoop
  • 一个EventLoop可能会被分配给一个或多个Channel
ChannelFuture接口Netty 为异步非阻塞 , 即所有的 I/O 操作都为异步的 , 因此 , 我们不能立刻得知消息是否已经被处理了 。 Netty 提供了 ChannelFuture 接口 , 通过该接口的 addListener() 方法注册一个 ChannelFutureListener , 当操作执行完成(成功或者失败)时 , 监听就会自动触发返回结果 。
ChannelHandler、ChannelPipelineChannelHandlerChannelHandler 为 Netty 中最核心的组件 , 它充当了所有处理入站和出站数据的应用程序逻辑的容器 。 ChannelHandler 主要用来处理各种事件 , 这里的事件很广泛 , 比如可以是连接、数据接收、异常、数据转换等 。
ChannelHandler 有两个核心子类 ChannelInboundHandler 和 ChannelOutboundHandler , 其中 ChannelInboundHandler 用于接收、处理入站数据和事件 , 而 ChannelOutboundHandler 则相反 。 我们经常通过一个ChannelInboundHandler的实现类来实现业务逻辑的处理 。
ChannelPipelineChannelPipeline 为 ChannelHandler 链提供了一个容器并定义了用于沿着链传播入站和出站事件流的 API 。 一个数据或者事件可能会被多个 Handler 处理 , 在这个过程中 , 数据或者事件经流 ChannelPipeline , 由 ChannelHandler 处理 。 在这个处理过程中 , 一个 ChannelHandler 接收数据后处理完成后交给下一个 ChannelHandler , 或者什么都不做直接交给下一个 ChannelHandler 。
绝!真就一文全懂!Netty线程模型+启动详细分析+内存管理文章插图
当一个数据流进入 ChannlePipeline 时 , 它会从 ChannelPipeline 头部开始传给第一个 ChannelInboundHandler, 当第一个处理完后再传给下一个 , 一直传递到管道的尾部 。 与之相对应的是 , 当数据被写出时 , 它会从管道的尾部开始 , 先经过管道尾部的 “最后” 一个ChannelOutboundHandler , 当它处理完成后会传递给前一个 ChannelOutboundHandler。
当ChannelHandler被添加到ChannelPipeline时 , 它将会被分配一个ChannelHandlerContext , 代表了ChannelHandler和ChannelPipeline之间的绑定 。
编码器和解码器由于网络数据总是一系列的字节 , 通过Netty发送或者接受消息时 , 将会发生一次数据转换:入站消息会被解码 , 由字节转换为另一种格式 , 通常是一个Java对象;出站消息会被编码 , 从当前格式转换为字节 。
Netty提供了编码器的基类MessageToByteEncoder以及解码器的基类ByteToMessageDecoder , Netty提供的所有解码器/编码器适配器类都实现了ChannelInboundHandler或者ChannelOutboundHandler接口 。 如果我们要自定义的编码/解码规则 , 只需要继承基类 , 实现encode()/decode()方法 。
@Overrideprotected void encode(ChannelHandlerContext channelHandlerContext, Object iotPacketRequest,ByteBuf out) {if (null == iotPacketRequest) {return;}String body = JsonUtils.bean2Json(iotPacketRequest);byte[] bodyBytes = body.getBytes(Charset.forName("utf-8"));out.writeShort(IotConnectProperties.MAGIC_CODE);out.writeShort(bodyBytes.length);out.writeBytes(bodyBytes);}


稿源:(未知)

【傻大方】网址:http://www.shadafang.com/c/111J293N2020.html

标题:绝!真就一文全懂!Netty线程模型+启动详细分析+内存管理( 二 )


上一篇:干翻诺基亚的不是苹果,终结汽油车的也不会是特斯拉

下一篇:华为Mate40 Pro实拍样张:没有光学防抖真的很影响吗?