Netty 基本组件小结--Channel、EventLoop、Bootstrap等

Channel按照其字面意思非常容易理解,那就是"管道"。自来水通遍千家万户需要架设管道,暖气也需要架设管道,同样,网络通信也需要架设管道,这个管道就是我们的 Socket 。我们发现,自来水管道中流通的是自来水,暖气管道中流通的是暖气,那么 Socket 中流通的当属我们的字节流了。

说了这么多,那么到底什么是Channel呢?小编理解,Channel就是连接网络Socket和具有 read, write, connect, and bind 能力的组件的一条通道。

一个Channel通常拥有下面几种属性:

1、Channel 本身组件的状态state,比如说是不是处于打开 open 状态,是否处于连接 connected 状态

2、Channel 本身将会跟一个 ChannelConfig 对象相关联,用于对该 Channel 进行配置,比如 接收缓冲区的大小

3、Channel 本身将会跟一个 ChannelPipeline 对象相关联,用于处理I/O事件 events

13465705-bb451eb6bb28574d.png!web

Netty 中的 Channel 在Java NIO基础之上封装了更多的操作。在 Netty 中,所有的I/O操作都是异步的。这意味着我们不能在调用I/O操作之后立即得到I/O操作的结果,因此Netty中提供了一个 ChannelFuture ,每次调用异步I/O之后会返回该对象。

在 Netty 中,Channel是具有继承结构的,我们可以通过调用Channel的 parent() 方法获取, parent() 方法的返回取决于该Channel是怎么创建出来的。比如一个 SocketChannel 由一个 ServerSocketChannel 接收,因此当调用 SocketChannel 的 parent()方法时将返回 ServerSocketChannel

每次当处理完Channel操作时,我们应该显式调用其 close() 和 close(ChannelPromise) 对资源进行释放,这将确保所有资源都以正确的方式释放掉~

二、Netty中Channel的类型有哪些?分别有什么作用?

总的来说,不同的协议,不同用途会对应不同类型的 Channel 。下面贴出 Channel 的接口继承图:

13465705-105c55abf0ed5dbf.png!web

1、 UnixChannel :此类Channel只暴露一些在Unix类操作系统上面才会有的操作

2、 DatagramChannel :一个处理 UDP/IP 协议的 Channel

3、 DuplexChannel :一个拥有两个端点并能在每个端点独立关闭的全双工Channel

4、 Http2StreamChannel :支持 HTTP/2 协议的 Channel

5、 SctpChannel :一个处理 SCTP/IP 协议的Channel

6、 ServerChannel :一个接收新连接然后创建子Channel的Channel组件, ServerSocketChannel 就是一个很好的例子, ServerSocketChannel 接受连接,然后创建出 SocketChannel

三、Netty中Channel和EventLoopGroup、EventLoop之间的关系

13465705-e92a4d5e52173440.png!web

一个 EventLoop 是一条单纯的线程,用于处理注册在其上面的所有I/O事件,也就是说,Channel是需要注册到EventLoop上面去的,而且一个 EventLoop 通常会有多个 Channel 注册,而 EventLoopGroup 则是 EventLoop 的集合。

四、Netty中 EventLoop 等事件线程组件继承图

小编贴出一张简单的继承图,如下所示:

13465705-27e256024766e5ed.png!web

从图中其实可以发现,Netty中线程模型基本上就是从一个叫 EventExecutorGroup , EventExecutorGroup 继承了JDK中的 ScheduledExecutorService 接口,因此在Netty中我们可以利用它做一些定时任务之类的配置。

1、 EventExecutorGroup :负责通过其 next() 方法来创建一系列的 EventExecutor ,除此之外,也负责管理其创建的 EventExecutor 生命周期并提供全局关闭方法。

2、 EventLoopGroup 是一个特殊的 EventExecutorGroup ,主要用于注册 Channel 以便后续在事件循环中使用

3、 EventExecutor 是一个特殊的 EventExecutorGroup ,它提供一些便捷的方法用来判断一个线程是否在一个 EnentLoop 中执行

4、 MultithreadEventExecutorGroup 顾名思义,就是允许任务在多线程中去执行

五、Netty中的 Bootstrap 家族

其实Netty中的 Bootstrap 启动类家族不是很庞大,相当于工具类吧! Bootstrap 和 ServerBootstrap 属于上面第二章节说到的 ServerChannel 范畴,总共有3个大类,类图如下:

13465705-2abe485ac0d3160c.png!web

1、 Bootstrap :用于为客户端打开一条通道 Channel ,通常 bind() 方法用于创建一个基于UDP的无状态的链接,对于通常的TCP链接,我们则使用其 connect() 方法创建

2、 ServerBootStrap :用于在服务端中打开一个 ServerChannel

六、Netty中的 ChannelHandler

13465705-1678f69820716659.png!web

ChannelHandler 可以用来处理I/O事件或者用于接收I/O操作,并将指针指向 ChannelPipeline 中的下一个 Handler 。其中 ChannelPipeline 为 ChannelHandler 提供了一个容器。

ChannelInboundHandler 用于为状态( open close connect )的更改设置相应的回调操作,简而言之, ChannelInboundHandler 拦截和处理入站事件, ChannelOutboundHandler 拦截和处理出站事

欢迎Java工程师朋友们加入Java进阶高级架构群:855355016

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值