本章包括:
1、使用SSL/TLS让Netty应用更加安全;
2、使用Netty构建HTTP/HTTPS应用;
3、处理空闲连接和超时;
4、解码基于分隔符或定长消息的协议;
5、写大数据;
6、序列化数据;
使用SSL/TLS让Netty应用更加安全
Java为SSL/TLS提供了SslContext和SslEngine抽象,Netty扩展了SslEngine并添加了更适用于Netty应用的功能。
它包含了一个包装了SslEngine的叫做SsHandler的ChannelHandler来处理通信的加密/解密。
1、加密的入站数据被SslHandler拦截,并被解密;
2、加密数据被SslHandler解密,传递给下一个ChannelHandler处理;
3、原始数据被传递给SslHandler;
4、SslHandler加密数据并将它发送出去;
*注意:大多数情况下,SslHandler都应当是ChannelPipeline中的第一个handler。
使用Netty构建HTTP/HTTPS应用
HTTP Decoder和Encoder
名称 | 描述 |
HttpRequestEncoder | 将HttpRequest和HttpContent从消息编码为字节流 |
HttpResponseEncoder | 将HttpResponse和HttpContent从消息编码为字节流 |
HttpRequestDecoder | 将HttpRequest和HttpContent从字节流解码为消息 |
HttpResponseDecoder | 将HttpResponse和HttpContent从字节流解码为消息 |
HTTP消息集成
HttpObjectAggregator,会将HTTP消息段集成为完整的FullHttpRequest或FullHttpResponse,再传递给ChannelPipeline中的下一个ChannelHandler。
HTTP消息压缩
压缩会增加CPU负载。
Netty通过两个ChannelHandler提供“gzip”和“deflate”支持:一个用于压缩,一个用于解压。
HttpContentCompressor、HttpContentDecompressor。
使用HTTPS
只需要在ChannelPipeline的第一位添加SslHandler。
使用WebSockets(HTTP协议的最新扩展)
WebSockets支持双向的数据交换,而无需请求-响应模式。
1、客户端;
2、服务器;
3、客户端通过HTTP/HTTPS发起WebSockets握手,等待响应;
4、连接升级为WebSockets;
SPDY
目的是让内容传递的速度更快,主要靠以下处理实现:
-GZIP压缩一切内容;
-加密一切内容;
-每个连接支持复数传输;
-为不同传输优先级提供支持;
处理空闲连接和超时
名称 | 描述 |
IdleStateHandler | 在连接空闲太长时间时触发IdleStateEvent事件,供应用处理 |
ReadTimeoutHandler | 在超时时间内没有读到数据则抛出ReadTimeoutException,并关闭连接 |
WriteTimeoutHandler | 在超时时间内没有写入数据则抛出WriteTimeoutException,并关闭连接 |
解码基于分隔符或定长消息的协议
基于分隔符的协议
名称 | 描述 |
DelimiterBasedFrameDecoder | 根据给定的分隔符提取帧的解码器 |
LineBasedFrameDecoder | 根据\r\n分隔符提取帧的解码器,速度比DelimiterBasedFrameDecoder要快 |
1、字节流;
2、从流中提取的第一个帧;
3、从流中提取的第二个帧;
基于定长消息的协议
名称 | 描述 |
FixedLengthFrameDecoder | 使用定长提出帧的解码器 |
LengthFieldBasedFrameDecoder | 根据编码在帧头部的长度提取帧的解码器 |
1、字节流;
2、每8bytes提出为一个帧;
1、长度被编码到帧的头部信息中;
2、长度为头部信息编码中长度的内容;
3、除去含长度信息的头部的帧;
写大数据
使用“零拷贝”方式,减少不必要的内存拷贝(从内核空间>应用程序空间),从而最大化性能。
这仅在不需要对传输数据做处理的情况下有效,否则Netty还是会将数据拷贝到应用程序空间并处理(数据预处理,再传输)。
ChunkedInput实现,待补充。
序列化数据
JDK提供的序列化/反序列化编解码器
名称 | 描述 |
CompatibleObjectDecoder | 使用JDK序列化机制的解码器,可用于对端非Netty的应用 |
CompatibleObjectEncoder | 使用JDK序列化机制的编码器,可用于对端非Netty的应用 |
CompactObjectDecoder | 使用在JDK的序列化机制之上自定义的序列化解码器 |
CompactObjectEncoder | 使用在JDK的序列化机制之上自定义的序列化编码器 |
JBoss Marshalling序列化(比JDK序列化快3倍,并且更紧凑)
名称 | 描述 |
CompatibleMarshallingDecoder | 使用JDK序列化机制的解码器,可用于对端非Netty的应用 |
CompatibleMarshallingEncoder | 使用JDK序列化机制的编码器,可用于对端非Netty的应用 |
MarshallingDecoder | 使用自定义序列化机制的解码器 |
MarshallingEncoder | 使用自定义序列化机制的编码器 |
ProtoBuf序列化
google开源的,用于结构化数据的快速紧凑的编/解码,提供了不同开发语言绑定,非常适用于跨语言项目。
名称 | 描述 |
ProtobufDecoder | 使用ProtoBufs解码消息 |
ProtobufEncoder | 使用ProtoBufs编码消息 |
ProtobufVarint32FrameDecoder | ? |