构建Netty4通道的体系化思维,这些方法你应该关注

简介: 构建Netty4通道的体系化思维,这些方法你应该关注

Netty4 网络篇到目前为止即将进入收官之作,Netty4中关于事件传播机制、服务端、客户端启动流程、读、写事件的处理基本都介绍完了,本文将重点关注一下Netty 通道的其他核心API的实现逻辑,构建完备的网络通道知识体系,为深入理解NIO成为可能。


本文将以NioSocketChannel为例展示如下方法的实现细节。


  1. boolean isWritable()
  2. Channel read()
  3. ChannelFuture write(Object msg)
  4. ChannelFuture close()


1、boolean isWritable()


判断通道是否可写,其实现如下图所示:


f2b381e51a8e74f539329c7e45da291d.png

在Netty中为了避免写缓存区无限制的写入导致内存溢出,引入了高低水位线机制,当积压数据超过设置的阔值后会设置为不可写,该方法就是判断通道是否可写。


当写缓存区中的容量超过写缓存区的高水位线时,默认为64K,则写缓存区则变为不可写,只有当写事件触发后,将写缓存区中的数据刷写到通道后,然后剩余待写字节数低于低水位线时,默认32K,则恢复可写状态。


2、Channel read()


这里看不是从网络中读取数据,而是注册读事件

842c2eb24d3578cdd8ca1a849b99b033.png

根据事件传播机制,outbound事件传播机制,最终的事件处理器为HeadContext。


我们再来复习一下AbstractChannel的内部类AbstractUnsafe的beginRead方法的实现细节。

557bc4751ab5633e250d177d205cfaab.png


针对NIO的注册事件,Netty给出了最佳实践


  • 首先要判断注册键(SelectionKey)是否有效。
  • 然后通过注册键获取已注册的集合interstOps(按位表示)
  • 通过位运算设置对应位的值,将表示读事件对应的位设置为1,表示注册读书事件。


3、ChannelFuture write(Object msg)


7c7b3638c36157092f6a2ac10f5d214e.png


write是outbound事件,从tail开始传播,会经过用过定义的outbound事件处理器,例如编码器,然后最终抵达HeadContext,接下来我们重点关注HeadContext#write方法,最终会调用AbstractChannel的内部类AbstractUnsafe的write方法。

086ed1ceff79bd2d7bb22fcf2439a871.png

Channel的write方法,只是将数据写入到OutboundBuffer中,即放入到通道的写缓存区中。


4、ChannelFuture close()


调用该方法并不是关闭通道,而是获取一个Future,通常会注册回调事件,当通道真正被关闭时触发。


close事件类型为OutBound,从Tail开始最终会传播到HeadContext中。


其最最终具体实现在AbstractChannel的内部类AbstractUnsafe的close方法,接下来对其进行详细分析。

6dfeb724adcddc511f9a614dff896598.png

Step1:如果通道的待写缓存区为空,没有需要处理的数据,本次调用,只需增加监听器并tong;如果关闭已经完成,对本次调用,只需设置成功标识即可。

a8e33c45ee734aadf3eb69fdceeb00eb.png

Step2:执行真正的关闭并传播相应的事件,其实现关键点:


  • 调用doClose0关闭底层的网络通道
  • 关闭通道的写缓存区
  • 传播 channelInactive(非激活)事件与通道取消注册事件。


5、总结


本文主要的目的是让大家再次感受一下网络通道中其他方法的实现细节,再次体会事件传播机制,并了解各个方法的触发时机以及处理核心要点。

9262f7f1b12171509988b175a6cb8311.png





相关文章
|
5月前
|
前端开发 网络协议
Netty实战巅峰:从零构建高性能IM即时通讯系统,解锁并发通信新境界
【8月更文挑战第3天】Netty是一款高性能、异步事件驱动的网络框架,适用于开发高并发网络应用,如即时通讯(IM)系统。本文将指导你利用Netty从零构建高性能IM程序,介绍Netty基础及服务器/客户端设计。服务器端使用`ServerBootstrap`启动,客户端通过`Bootstrap`连接服务器。示例展示了简单的服务器启动过程。通过深入学习,可进一步实现用户认证等功能,打造出更完善的IM系统。
207 1
|
6月前
|
前端开发 Java 数据处理
使用Netty构建高性能的网络应用
使用Netty构建高性能的网络应用
|
6月前
|
前端开发 Java 数据处理
使用Netty构建高性能的网络应用
使用Netty构建高性能的网络应用
|
8月前
|
前端开发 Java API
构建异步高并发服务器:Netty与Spring Boot的完美结合
构建异步高并发服务器:Netty与Spring Boot的完美结合
|
8月前
|
安全 Java 容器
Netty通道的容器属性Attribute
Netty中的Channel通道类,有类似于Map的容器功能,可以通过“key-value”键值对的形式来保存任何Java Object的值。一般来说可以存放一些与通道实例相关联的属性,比如说服务期端的ServerSession会话实例。
|
网络协议 前端开发 Java
Netty异步NIO框架(一)java服务端与客户端实现聊天 websocket通道
Netty异步NIO框架(一)java服务端与客户端实现聊天 websocket通道
|
缓存 NoSQL 安全
Netty 通道怎么区分对应的用户?
前言 考虑一个功能业务,在web程序中向指定的某个用户进行实时通讯
221 0
Netty 通道怎么区分对应的用户?
|
缓存 前端开发 网络协议
Netty4 ChannelHandler 概述(通道篇)
Netty4 ChannelHandler 概述(通道篇)
Netty4 ChannelHandler 概述(通道篇)
|
设计模式 缓存 网络协议
Netty4 Channel 概述(通道篇)
Netty4 Channel 概述(通道篇)
Netty4 Channel 概述(通道篇)