Netty核心组件
1.简介
Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
Netty的核心组件如下。
2.Bootstrap、ServerBootstrap(引导器)
Bootstrap和ServerBootstrap是引导类,一个用于客户端,一个用于服务端,它主要对应用程序进行配置,并使其运行起来的过程。Netty处理引导的方式是使你的应用程序和网络层相隔离。
Bootstrap、ServerBootstrap常用方法:
//配置两个服务器端的EventLoop public ServerBootstrap group(EventLoopGroup parentGroup,EventLoopGroup childGroup) //设置客户端的一个EventLoop public B group(EventLoopGroup group) //设置一个服务器端的通道实现 public B channel(Class<? extends C> channelClass) //ServerChannel添加配置 public <T> B option(ChannelOption<T> option,T value) //给接受到的通道添加配置 public<T> ServerBootstrap childOption(ChannelOption<T> childOption,T value) //设置业务处理类,也就是自定义的handler public ServerBootstrap childHandle(ChannelHandler childHandler) //设置服务器端占有的端口号 public ChannelFuture bind(int inetPort) //设置客户端连接服务器端 public ChannelFuture connect(String inetHost,int inetPort)
3.LoopGroup、EventLoopGroup
Netty基于事件驱动模型,使用不同的事件来通知我们状态的改变或者操作状态的改变。它定义了在整个连接的生命周期里当有事件发生的时候处理的核心抽象。
Channel 为Netty网络操作抽象类,EventLoop主要是为Channel 处理 IO 操作,两者配合参与 IO 操作。
Channel、EventLoop、Thread、EventLoopGroup之间的关系:
- 一个EventLoopGroup包含一个或多个EventLoop。
- 一个EventLoop在它的生命周期内只能与一个Thread绑定。
- 所有EnventLoop处理的IO事件都将在它专有的Thread上被处理。
- 一个Channel在它的生命周期内只能注册与一个EventLoop。
- 一个 EventLoop可被分配至一个或多个Channel 。
当一个连接到达时,Netty就会注册一个Channel,然后从EventLoopGroup中分配一个EventLoop绑定到这个Channel上,在该Channel的整个生命周期中都是有这个绑定的EventLoop来服务的。
4.Channel(通道)
Netty中的Channel与JDK的Channel有所区别,Netty的Channel在JDK的基础上进行了封装并赋予了更多的功能。
Channel是一种关联网络套接字或能够进行IO 操作(例如读取,写入,连接和绑定)的组件的组件。
Channel为用户提供如下操作:
- 通道的当前状态(例如,它是否打开?是否已连接?)。
- 通道的ChannelConfig配置参数(例如,接收缓冲区大小)。
- 通道支持的IO操作(例如,读取,写入,连接和绑定)。
- 处理所有与该通道关联的IO事件和请求的ChannelPipeline。
Channel主要衍生几个类型的接口:
- Http2StreamChannel:支持HTTP/2协议的Channel。
- ServerChannel:一个接收新连接然后创建子Channel的Channel组件, ServerSocketChannel就是一个很好的例子, ServerSocketChannel接受连接,然后创建出SocketChannel。
- SctpChannel:一个处理 SCTP/IP 协议(流控制传输协议 (Stream Control Transmission Protocol))的 Channel。
- DatagramChannel:一个处理 UDP/IP 协议的Channel。
- DuplexChannel:一个拥有两个端点并能在每个端点独立关闭的全双工Channel。
Channel的特性:
- 所有I/O操作都是异步的:这不意味着任何IO调用都将立即返回,不能保证所请求的I/O操作已在调用结束时完成。相反,你将获得返回一个ChannelFuture实例,该实例将在请求的IO操作成功,失败或取消时通知你。
- 分层的:Channel可以有一个parent(父级},具体取决于创建方式。例如,ServerSocketChannel接受的SocketChannel将返回ServerSocketChannel作为其在parent上的父级。层次结构的语义取决于Channel所属的transport实现。
- 向下访问特定于传输的操作:某些传输会公开特定于传输的其他操作。将Channel向下转换为子类型以调用此类操作。例如,对于旧的 IO 数据报传输,DatagramChannel提供了多播加入/离开操作。
- 释放资源:一旦完成Channel,调用#close或#close(ChannelPromise)释放所有资源。这样可以确保以适当的方式释放所有资源,即文件句柄。
Channel的状态:
- channelUnRegistered:频道创建后但未注册到一个EventLoop。
- channelRegistered:频道注册到一个EventLoop。
- channelActive:channel的活动的(连接到了它的远程对等),现在可以接收和发送数据了。
- channelInactive:channel没有连接到远程对等。
5.ChannelFuture(监听器)
Netty中所有的IO操作都是异步的,不能立刻得知消息是否被正确处理。
但是可以过一会等它执行完成或者直接注册一个监听,具体的实现就是通过Future和ChannelFutures,他们可以注册一个监听,当操作执行成功或失败时监听会自动触发注册的监听事件。
6.ChannelHandler(通道处理器)
ChannelHandler是Netty中最核心的组件,它充当了所有处理入站和出站数据的应用程序逻辑的容器。ChannelHandler主要用来处理各种事件,这里的事件很广泛,比如可以是连接、数据接收、异常、数据转换等。
ChannelHandler有两个核心子类ChannelInboundHandler、ChannelOutboundHandler,其中ChannelInboundHandler用于接收、处理入站数据和事件,而ChannelOutboundHandler则相反。
7.ChannelPipeline
ChannelPipeline为ChannelHandler链提供了一个容器并定义了用于沿着链传播入站和出站事件流的API。一个数据或者事件可能会被多个Handler处理,在这个过程中,数据或者事件经流ChannelPipeline,由ChannelHandler处理。在这个处理过程中,一个 ChannelHandler 接收数据后处理完成后交给下一个ChannelHandler,或者什么都不做直接交给下一个ChannelHandler。