Netty的基本架构详解

服务器
我们会一起俯瞰整个Netty的脉络,以便于对Netty的架构原理有一个整体的认知!

[[408558]]

本文转载自微信公众号「源码学徒」,作者皇甫嗷嗷叫。转载本文请联系源码学徒公众号。

有道无术,术尚可求也!有术无道,止于术!

上一节课我们对Netty有了一个初步的认识,这一节课我们会一起俯瞰整个Netty的脉络,以便于对Netty的架构原理有一个整体的认知!下图是Netty的主要架构骨架:

Netty的主要架构图

EventLoopGroup基本认识

我们需要了解的 EventLoopGroup, Netty对EventLoopGroup做了很多的扩展实现,下图是他的家族图谱:

image-20210421090036067

我们上一节课使用的案例,使用的是NioEventLoopGroup,他是NIO的实现,可以看出来他是MultithreadEventLoopGroup的子类,从名字上可以看出来,NioEventLoopGroup是一个多线程事件循环组,这里你可以把它看作是一个线程池,内部存在多个线程(NioEventLoop),每一个客户端连接的SocketChannel都对应一个线程(NioEventLoop)!

我们上面一直再说NioEventLoop, 我们基于上图可以看出来,他是SingleThreadEventLoop的子类,从名字上也能看出来,他是一个单线程的执行器!我们可以看到,他的父接口事实上也是继承与EventLoopGroup, 也就是说,虽然NIoEventLoop是一个单线程事件循环,但是我们基于接口,也可以把他看作为一个线程池,只不过这个线程池内部只有一个线程!

## Netty的通讯通道

我们需要了解的Netty中的管道种类,这里我们重点分析NIO的实现方式:

image-20210421091642282

我们可以看到,Netty的Socket通讯管道的主要实现方式有两种,NioServerSocketChannel, NioSocketChannel, 这两种实现是Netty对于服务端通道,与客户端通道的不同实现,我们在开发Netty的服务端与客户端的时候,会指定使用管道的类型! 这里面有一个比较重要的点,即NioServerSocketChannel的父类实现是 AbstractNioMessageChannel, NioSocketChannel的父类实现是AbstractNioByteChannel ,这两个实现是后续NIO事件循环的时候判断是处理连接还是处理数据的重要手段,这里留个印象,我们后续会详细说!

Netty的管道流

我们需要了解的Netty的业务执行链,又叫管道流 ChannelPipeline:

我们的Netty代码中都会由类似这种逻辑的代码:

他是Netty能够让我们专注于业务的主要实现方式,他的主要实现是一个双向链表,这里是在链表末尾追加一个Handler业务处理器,Handler的种类大致分为两种:

如上图所示,他有两种实现方式,一个是ChannelInboundHandlerAdapter一个是ChannelOutboundHandlerAdapter, 他们的调用在一个业务流中的执行顺序如下,我们借用一个图示来说明:

当我们调用Socket的读数据的API时,即从Socket管道读取数据时,Pipeline会按照你的添加顺序依次执行 Inbound Handler,当我们读取事件完毕,调用write方法向通道内写入数据的时候,管道流开始调用 Outbound Handler方法,倒序调用!这个倒序调用可能不好理解,我们还是用图来说明:

当调用read方法的时候,顺序调用Inbound节点! 当调用write方法的时候,倒序调用outbount方法!

Netty的Handler事件回调种类

1. ChannelInboundHandler

方法名称 方法作用
handlerAdded 通道被添加  1
channelRegistered JDK注册成功后回调所有Handler的方法  2
channelActive jdkChannel被激活后回调  3
channelRead 通道内有数据可读  4
channelReadComplete 数据读取完毕   5
channelInactive 通道被关闭后回调该方法  6
channelUnregistered 通道被取消注册回调用该方法  7
handlerRemoved 通道被删除  8
userEventTriggered 如果触发了用户事件,则调用该方法。
channelWritabilityChanged 可写的状态改变
exceptionCaught 发生了异常

2. ChannelOutboundHandler

方法名称 方法作用
bind 进行绑定操作后调用。
connect 进行连接操作后调用。
disconnect 进行断开连接操作后调用。
close 进行关闭操作后调用。
deregister 从当前已注册的EventLoop进行注销操作后调用。
read 读数据
write 写数据
flush 刷新到管道

总结

 

通过本篇文章,我们可以了解到Netty中比较重要的几个概念,EventLoopGroup的基本概念、Netty中的通道概念、Netty中的管道流的概念!

 

责任编辑:武晓燕 来源: 源码学徒
相关推荐

2020-07-01 08:05:46

Kubernetes容器开发

2021-12-26 18:20:03

架构Flink设计

2009-06-19 09:34:20

WCF基本架构ASP.NET

2022-05-30 07:54:15

零信任SDP

2016-12-21 14:39:25

云服务

2012-05-16 09:59:30

OpenStack架构

2021-06-18 06:31:55

PyTorchPython深度学习

2014-12-03 09:52:07

IP

2019-06-19 09:00:00

GitLinux开源

2020-10-10 19:37:27

BIO 、NIO 、A

2019-12-09 08:29:26

Netty架构系统

2023-04-07 08:34:31

2010-03-11 13:54:01

Python安装配置

2020-02-26 09:00:00

Chatbot架构模型聊天机器人

2021-06-16 14:18:37

NettyReactor线程模型

2022-03-10 07:58:12

ReactorNetty运转架构

2018-11-05 08:10:30

Netty架构模型

2010-07-12 09:43:38

Symbian开发

2021-05-17 07:22:05

Elasticsear架构存储

2009-12-29 18:29:09

Silverlight
点赞
收藏

51CTO技术栈公众号