Netty架构及应用场景

Netty是基于NIO/NIO2的异步事件驱动网络应用框架,意在降低网络组件和业务逻辑的耦合度,提供高性能的同时简化网络编程。

Netty相关概念

ChannelHandler:事件处理单元。

Channel:I/O操作接口。

SocketChannel

Netty中SocketChannel代表了一个TCP连接,与其他服务交换数据都将通过SocketChannel。

EventLoop

Netty EventLoop是一个循环,一直在寻找新事件,如Socket请求。事件发生时,事件将被传给相应的处理程序,如ChannelHandler。

一个SocektChannel由一个EventLoop管理,因为,一个EventLoop由一个线程构成,所以,SocketChannel实例也只能由一个线程访问,从Socket读取数据,不必担心同步问题。

注:一个SocektChannel对应一个EventLoop,一个EventLoop管理N个SocektChannel。

EventLoopGroup

Netty EventLoopGroup是一组EventLoop,在多个Channel之间共享。线程池的概念,是对jdk可调度线程池的扩展。

ChannelPipeline

Netty中每个SocketChannel都有一个ChannelPipeline。ChannelPipeline包含了一系列的ChannelHandler实例。当EventLoop从一个SocketChannel读取数据时,数据被传递给ChannelPipeline中第一个ChannelHandler ,ChannelHandler处理数据,然后,可以选择将其转给下个ChannelHandler。

在数据写入操作中,数据在写入SocketChannel之前,也是通过ChannelPipeline进行传递。

ChannelInitializer

ChannelInitializer是一个特殊的ChannelHandler,在SocketChannel创建时,被附加到SocketChannel的ChannelPipeline上,以便初始化SocketChannel。SocketChannel初始化完成后,ChannelInitializer将自己从ChannelPipeline中移除。

ChannelFuture

任务反馈机制,有别于java原生Future,在处理完成时会主动通知。

Encoder和Decoder

Netty编解码器将字节转换成消息对象(Java对象),或将消息对象转换成字节。如,编解码器能将HTTP请求中的原始字节转换为HTTP对象,或将HTTP响应对象转换成原始字节。大多编解码器都基于ByteToMessageDecoder和MessageToByteEncoder。Netty使用ChannelInboundHandler和ChannelOutboundHandler接入编解码处理。

Netty提供了几种不同协议的编解码器,如HTTP、WebSockets、SSL / TLS等。如果想在Netty中使用这些协议,需从ChannelInboundHandler和ChannelOutboundHandler接口下找到对应的实现,添加到ChannelPipeline中。

netty适用范围

Web服务器,聊天服务器,消息代理或自建传输协议的应用程序。