关于Netty核心组件浅薄的理解

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

我一开始学习Netty和了解Netty也是很迷茫,因为它里面很复杂,那个时候我一行代码看不懂,然后我阅读了很多关于Netty的书籍,我结合书中的理论加实际的源码部分,使我对Netty组件有了一个基本的了解,理解多少,我就写多少,以帮助后续想了解Netty的人在了解Netty的路上更高效。

本文介绍一些Netty的核心组件

Netty的核心组件

Channel

Channel可以看成是java Nio的一个基本组成部分,这里你可以把它当成是入站或者出站的数据载体,源码对Channel的解释如下。

 A nexus to a network socket or a component which is capable of I/O
* operations such as read, write, connect, and bind.
复制代码

使用Channel给我们提供了读、写、连接和绑定操作。

回调

Netty在内部使用了回调来处理信息,就是说:当一个方法被调用或者一个连接被创立时,Netty会使用回调来告知我们相关信息。

Netty并没有使用JDK提供的interface java.util.concurrent.Future,而是自己进行了内部实现,ChannelFuture

ChannelFuture提供了几种能够注册一个或者多个ChannelFutureListener实例的额外的方法。

监听器的回调方法operationComplete(),将会在对应的操作完成时被调用。

每个Netty的出站I/O操作都将返回一个ChannelFuture,正如我们前面所提到过的一样,Netty完全是异步和事件驱动的。

源码里演示了一个ChannelFuture的例子:这里bind方法不会阻塞。 image.png

事件和ChannelHandler

Netty本身是基于事件驱动的,这意味着它能基于已经发生的事件做出不同的操作动作,这些动作可能是:

  • 记录日志;
  • 数据转换;
  • 流控制;
  • 应用程序逻辑。

Netty里面可能由入站数据或者状态更改触发的事件包括:

  • 连接已被激活或者连接失活;
  • 数据读取;
  • 用户事件;
  • 错误事件。

有入站还可能有出站事件,出站事件是未来某个事件触发后形成的结果,包括:

  • 打开或者关闭到远程节点的连接;
  • 将数据写到或者冲刷到套接字。

每个事件都可以被分发给ChannelHandler类中的某个用户实现的方法。 每个事件都会经过很多的ChannelHandler进行处理,这些Handler都封装在这个pipeline里面。

Selector和EventLoop

Selector是Netty里面对所有事件进行抽象的集合,在我们的服务启动的时候创建,然后是需要把我们选择的Channel注册到我们选择的这个EventLoop的Selector上。

每个EventLoop可以处理的事件包括:

  • 注册感兴趣的事件;
  • 将事件派发 给ChannelHandler;
  • 安排进一步的动作。

EventLoop本身只由一个线程驱动,其承担着处理一个Channel的所有事件的任务,这种强大而又简单的设计使我再一次感叹道Netty设计的魅力。

猜你喜欢

转载自juejin.im/post/7030978868861206541