首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一文了解Netty整体流程

本文基于版本 4.1.46,同时只描述类而不展示具体源码。

Netty 的整体流程

Netty 的整体流程相对来说还是比较复杂的,初学者往往会被绕晕。所以这里总结了一下整体的流程,从而对 Netty 的整体服务流程有一个大致的了解。从功能上,流程可以分为服务启动、建立连接、读取数据、业务处理、发送数据、关闭连接以及关闭服务。整体流程如下所示(图中没有包含关闭的部分):

服务启动

服务启动时,我们以 example 代码中的 EchoServer 为例,启动的过程以及相应的源码类如下:

: 创建 selector

: 创建 serverSocketChannel 以及初始化

:从 boss group 中选择一个 NioEventLoop 开始注册 serverSocketChannel

: 将 server socket channel 注册到选择的 NioEventLoop 的 selector

: 绑定地址端口开始启动

: 注册 OP_READ 事件

上述启动流程中,1、2、3 是由我们自己的线程执行的,即 mainThread,4、5、6 是由 Boss Thread 执行。相应时序图如下:

建立连接

服务启动后便是建立连接的过程了,相应过程及源码类如下:

NioEventLoop 中的 selector 轮询创建连接事件(OP_ACCEPT)

创建 socket channel

从worker group 中选择一个 NioEventLoop 开始注册 socket channel

将 socket channel 注册到选择的 NioEventLoop 的 selector

注册 OP_ACCEPT 事件

同样,上述流程中 1、2、3 的执行仍由 Boss Thread 执行,直到 4、5 由具体的 Work Thread 执行。

读写与业务处理

连接建立完毕后是具体的读写,以及业务处理逻辑。以 EchoServerHandler 为例,读取数据后会将数据传播出去供业务逻辑处理,此时的 EchoServerHandler 代表我们的业务逻辑,而它的实现也非常简单,就是直接将数据写回去。我们将这块看成一个整条,流程如下:

轮询创建读取事件(OP_READ)

nioSocketChannel 开始读取数据

把读取到的数据传播出去供业务处理

在这个例子中即 EchoServerHandler 的执行

调用 write 方法

调用 flush 准备数据

调用 flush 发送数据

在这个过程中读写数据都是由 Work Thread 执行的,但是业务处理可以由我们自定义的线程池来处理,并且一般我们也是这么做的,默认没有指定线程的情况下仍然由 Work Thread 代为处理。

关闭连接

服务处理完毕后,单个连接的关闭是什么样的呢?

NioEventLoop 中的 selector 轮询创建读取事件(OP_READ),这里关闭连接仍然是读取事件

当字节

关闭 socketChannel

清理消息:不接受新信息,fail 掉所有 queue 中消息

关闭多路复用器的 key

时序图如下:

关闭服务

最后是关闭整个 Netty 服务:

关闭 channel,取消 selectionKey

取消定时任务

关闭 selector

时序图如下,为了好画将 NioEventLoop 拆成了 2 块:

至此,整个 Netty 的服务流程就结束了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201222A09KAE00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券