0%

netty常用概念

channel

Channel接口是Netty对网络操作的抽象类,代表一个到实体(如硬件设备、网络套接字、文件等等)的开放连接,包含基本的读写操作。常用的Channel接口实现类包括NioServerSocketChannel和NioSocketChannel。这两个相当于BIO编程模型中的ServerSocket以及Socket两个概念。

Future

Netty是异步非阻塞的,所有的IO操作都是异步的,因此无法立即得到操作是否执行成功。通过Future提供了一种在操作完成时通知应用程序的方法,这个对象可以看作是一个异步操作的结果的占位符。

Netty提供了自己的实现ChannelFuture,其中addListener()方法可以注册一个ChannelFutureListener,当操作执行完成时,会自动触发返回结果。还可以通过sync()方法将异步的操作转换为同步的。

ChannelHandler

Netty使用不同的事件来通知我们状态的改变或者是操作的状态。ChannelHandler 是消息的具体处理器。他负责处理读写操作、客户端连接等事情。

ChannelPipeline是ChannelHandler构成的链条,可以通过ChannelPipeline的add()方法添加ChannelHandler。

Netty也提供了预定义的ChannelHandler实现,包括实现HTTP,TLS的ChannelHandler。

Eventloop

EventLoop 的主要作用实际就是负责监听网络事件并调用事件处理器进行相关 I/O 操作的处理。

EventLoopGroup 包含多个 EventLoop。

当客户端连接服务端时,bossGroup会处理客户端连接请求。当客户端处理完成后,会将这个连接提交workerGroup来处理,然后workerGroup负责处理其 IO 相关操作。

Bootstrap

Bootstrap 是客户端的启动引导类,通过connect()方法连接到远程的主机和端口,作为TCP连接的客户端,也可以通过bind()方法绑定一个本地端口,作为UDP协议通信中的一端。

ServerBootstrap是服务端的启动引导类,使用bind放大绑定到本地端口上,等待客户端的连接。

线程模型

Netty线程模型基于Reactor模式设计开发。Reactor 模式基于事件驱动,采用多路复用将事件分发给相应的Handler处理。Netty主要靠NioEventLoopGroup线程池来实现具体的线程模型的。在实现服务端的时候,一般会初始化两个线程组,分别为bossGroup用于接受连接以及workerGroup负责具体的处理。其中bossGroup和workerGroup可以共用同一个EventLoopGroup。

长连接与心跳机制

短连接指的是server与client端建立连接以后,读写完成之后就关闭掉连接,如果下次还需要继续发送消息,那么就要重新建立连接。

长连接说的就是 client 向 server 双方建立连接之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。长连接的可以省去较多的 TCP 建立和关闭的操作,降低对网络资源的消耗。

在保存长连接的过程中,如果遇到断网等情况,需要使用到心跳机制判断对方是否已经掉线。如果client与server之间在一定时间内没有数据交互时,会发送一个特殊的数据包给对方,当接收方收到这个数据报文后, 也立即发送一个特殊的数据报文。当某一端收到心跳消息以后,就可以知道对方仍然在线,确保TCP连接的有效性。