SSL/TLS
SSL/TLS这样的安全协议,他们层叠在其他协议上,用于实现数据安全。为了支持SSL/TLS,java提供了javax.net.ssl包,它的SSLContext和SSLEngine类使实现解密和加密变的简单。Netty通过一个SslHandler的ChannelHandler实现利用了这个API,其中SslHandler内部使用SSLEngine来实现。Netty还提供了使用OpenSSL工具包的SSLEngine实现,这个类比JDK提供的性能更好。如果OpenSSL库可用,可以将Netty配置为默认使用OpenSslEngine。如果不可用Netty将会退回到JDK实现。
在大多数的情况下,SslHandler将是ChannelPipeline中的第一个ChannelHandler。以下是SslHandler常用的方法。
HTTP/HTTPS
HTTP/HTTPS编码器和解码器
HTTP是基于请求/响应模式的。Netty提供了多种编码器和解码器用于简化使用。
一个HTTP请求/响应可能由多个数据部分组成,并且它总是以一个LastHttpContent部分作为结束。FullHttpRequest和FullHttpResponse消息是特殊的子类型,分别代表了完整的请求和响应。所有的HTTP消息都实现了HTTPObject接口。
聚合HTTP消息
由于HTTP的请求和响应可能由许多部分组成,因此需要聚合它们以形成完整的消息。Netty提供了一个聚合器,它可以将多个消息部分合并为FullHttpRequest或者FullHttpResponse消息。如果是客户端则需要在ChannelPipeline中添加HttpCilentCodec。如果是服务端则需要在ChannelPipeline中添加HttpServerCodec。
HTTP压缩
使用HTTP时,建议开启压缩功能可以减少传输数据大小,虽然这会增加一定的CPU的开销。Netty为压缩和解压缩提供了ChannelHandler实现,它们同时支持gzip和deflate编码。如果是客户端则需要在ChannelPipeline中添加HttpContentDecompressor。如果是服务端则需要在ChannelPipeline中添加HttpContentCompressor。
WebSocket
WebSocket是在一个当个的TCP连接上提供双向的通信,结合WebSocketAPI它为网页和远程服务器之间的双向通信提供了一种替代HTTP轮询的方案。Netty提供了WebSocketChannelHandler用于处理有WebSocket定义为“帧”的特殊消息类型。
空闲的连接和超时
检测空闲的连接和超时很重要,Netty为这些功能提供了几个ChannelHandler实现。
解码基于分隔符的协议和基于长度的协议
基于分隔符的协议
基于分隔符的消息协议使用定义的字符来标记的消息或者消息段的开头或者结尾。有RFC文档正式定义的许多协议都是这样(SMTP、POP3、IMAP、Telnet)。私有组织通常也拥有他们自己的专有格式。以下列出的解码器能定义可以提取由任意标记序列分割的帧的自定义解码器。
基于长度的协议
基于长度的协议通过将它的长度编码到帧的头部来定义帧,而不是使用特殊的分隔符来标记它的结束。以下是两种解码器。
写大型数据
由于写操作时非阻塞的,所以即使没有写出所有的数据,写操作也会在完成是返回并通知ChannelFuture。当这种情况发生时,如果仍然不挺的写入,就有内存耗尽的风险。所以在写大型数据时,要准备报处理到远程节点的连接是慢速连接的情况,这种情况会导致内存释放的延迟。
在需要将数据从文件系统复制到用户内存时,可以使用ChunkedWriteHandler,它支持异步写大型数据流,而又不会导致大量的内存消耗。关键是interface ChunkedInput,类型参数B是readChunk()方法返回的类型。Netty预置了4个实现。
领取专属 10元无门槛券
私享最新 技术干货