Netty 核心组件有哪些?分别有什么作用?
Channel
Channel 接口是 Netty 对网络操作抽象类,它除了包括基本的 I/O 操作,如 bind()、connect()、read()、write() 等。
比较常用的 Channel 接口实现类是 NioServerSocketChannel(服务端)和 NioSocketChannel(客户端),这两个 Channel 可以和 BIO 编程模型中的 ServerSocket 以及 Socket 两个概念对应上。Netty 的 Channel 接口所提供 的 API,大大地降低了直接使用 Socket 类的复杂性。
EventLoop
EventLoop(事件循环)接口可以说是 Netty 中最核心的概念了, EventLoop 的主要作用实际就是负责监听网络事件并调用事件处理器进行相关 I/O 操作的处理。
那 Channel 和 EventLoop 有什么联系呢?
Channel 为 Netty 网络操作(读写等操作)抽象类,EventLoop 负责处理注册 到其上的 Channel 处理 I/O 操作,两者配合参与 I/O 操作。
ChannelFuture
Netty 是异步非阻塞的,所有的 I/O 操作都为异步的。 因此,我们不能立刻得到操作是否执行成功,但是,可以通过 ChannelFuture 接口的 addListener() 方法注册一个 ChannelFutureListener,当操作执行成 功或者失败时,监听就会自动触发返回结果。
并且,还可以通过 ChannelFuture 的 channel() 方法获取关联的 Channel
PUBLIC INTERFACE CHANNELFUTURE EXTENDS FUTURE<VOID>
{ CHANNEL CHANNEL();
CHANNELFUTURE ADDLISTENER(GENERICFUTURELISTENER<? EXTENDS FUTURE<? SUPER VOID>> VAR1);
……
CHANNELFUTURE SYNC() THROWS INTERRUPTEDEXCEPTION;
}
另外,还可以通过 ChannelFuture 接口的 sync()方法让异步的操作变成同步 的。
ChannelHandler 和 ChannelPipeline
下面这段代码使用过 Netty 的小伙伴应该不会陌生,我们指定了序列化编解 码器以及自定义的 ChannelHandler 处理消息。
B.GROUP(EVENTLOOPGROUP)
.HANDLER(NEW CHANNELINITIALIZER<SOCKETCHANNEL>() {
@OVERRIDE
PROTECTED VOID INITCHANNEL(SOCKETCHANNEL CH) {
CH.PIPELINE().ADDLAST(NEW NETTYKRYODECODER(KRYOSERIALIZER, RPCRESPONSE.CLASS));
CH.PIPELINE().ADDLAST(NEW NETTYKRYOENCODER(KRYOSERIALIZER, RPCREQUEST.CLASS));
CH.PIPELINE().ADDLAST(NEW KRYOCLIENTHANDLER()); }
});
ChannelHandler 是消息的具体处理器。他负责处理读写操作、客户端连接等事情。
ChannelPipeline 为 ChannelHandler 的链,提供了一个容器并定义了用于 沿着链传播入站和出站事件流的 API 。当 Channel 被创建时,它会被自动地 分配到它专属的 ChannelPipeline。
可以在 ChannelPipeline 上通过 addLast() 方法添加一个或者多个 ChannelHandler ,因为一个数据或者事件可能会被多个 Handler 处理。当 一个 ChannelHandler 处理完之后就将数据交给下一个 ChannelHandler 。