netty高性能web服务器介绍

1. 什么是netty

Netty是一个异步的事件驱动网络应用框架。

它的主要用途是构建高性能协议服务器,并通过基于隔离和松耦合的网络和业务逻辑组件的NIO(非阻塞输入输出)技术实现这一点。它可以实现广为人知的Http协议或者我们自定义的协议。

2. netty的核心概念

netty是一个非阻塞式框架,和阻塞式IO相比,它拥有更高的吞吐量。理解非阻塞式IO是掌握Netty的核心组件以及他们之间的关系的关键所在。

2.1 Channel(通道)

Channel是NIO的基石,它代表了一个拥有IO(读和写)处理能力的开放连接。

2.2 Future

对于Netty来说,Channel中的每一个连接都是非阻塞的。

这意味着每个操作在调用之后都会立刻返回。标准Java库中有一个Future的接口,但是它并不能方便的完成Netty的意图,因为我们只能通过这个接口去查询操作是否已完成或者阻塞当前线程直到操作完成。

基于上面的原因,Netty实现了自己的ChannelFuture接口。我们可以通过回调函数告诉ChannelFuture,一旦操作完成,将要执行的操作。

2.3 事件和处理器

Netty使用了基于事件驱动的应用模式,因此数据处理的管道(pipeline)本质上是贯穿处理器(handler)的一连串事件的链(chain)。事件和处理器类似于数据的流入以及流出。流入事件可以是下面的几种:

  • 通道的激活和失活
  • 读事件
  • 异常事件
  • 用户事件

流出事件则比较简单,一般类似于打开或者关闭连接以及写入数据。

Netty应用包含了几个网络和应用的逻辑事件以及他们对应的处理器。channel事件处理器可以使用的基础接口分别是ChannelHandler和它的祖先ChannelOutboundHandler和ChannelInboundHandler。

Netty提供了大量的ChannelHandler接口的实现类。值得注意的是,适配器只是空的实现,例如ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter。我们可以继承这些适配器当我们只需要处理所有事件集合中的子集。

同样,Netty包含了某些指定协议的具体实现,比如Http。HttpRequestDecoder,HttpResponseEncoder,HttpObjectAggregator。你可以通过Netty的javaDoc去了解他们的用法。

2.4 编码器和解码器

当我们使用网络协议时,我们需要对数据进行序列化和反序列化。出于这个目的,Netty引进了一个特殊的解码拓展类ChannelInboundHandler,它可以对进来的数据进行解码。大多数解码器的基类是ByteToMessageDecoder。

为了编码出去的数据,Netty也提供了一个特殊的编码实现类ChannelOutboundHandler。MessageToByteEncoder是大多数编码实现类的基类。通过编码器和解码器,我们可以将信息从字节序列转换成java对象,反之亦然。