Netty In Action 读书笔记 - 第八章 内置ChannelHandlers和Codecs

本章包括:
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值