前言
我在上篇博文中简单介绍了一下protobuf,由于protobuf是Netty默认的序列化协议,再说它的性能也很高,接下来就详细的说一下protobuf协议!
引入
Netty为什么要提供编解码框架
作为一个高性能的异步、NIO通信框架,编解码框架是Netty的重要组成部分。
Netty逻辑架构图
从网络读取的inbound消息,需要经过解码,将二进制的数据报转换成应用层协议消息或者业务消息,才能够被上层的应用逻辑识别和处理;同理,用户发送到网络的outbound业务消息,需要经过编码转换成二进制字节数组(对于Netty就是ByteBuf)才能够发送到网络对端。
编码和解码功能是NIO框架的有机组成部分,无论是由业务定制扩展实现,还是NIO框架内置编解码能力,该功能是必不可少的。
为了降低用户的开发难度,Netty对常用的功能和API做了装饰,以屏蔽底层的实现细节。编解码功能的定制,对于熟悉Netty底层实现的开发者而言,直接基于ChannelHandler扩展开发,
Netty针对编解码功能,它既提供了通用的编解码框架供用户扩展,又提供了常用的编解码类库供用户直接使用。在保证定制扩展性的基础之上,尽量降低用户的开发工作量和开发门槛,提升开发效率。
Netty预置的编解码功能列表如下:base64、Protobuf、JBoss Marshalling等。
下图来自Netty官网:GitHub地址—>codec源码
注:Netty默认的编解码协议是protobuf
protobuf的数据类型
protobuf 数据类型 | 描述 | Java 类型 |
---|---|---|
bool | 布尔类型 | boolean |
double | 64位浮点数 | double |
float | 32为浮点数 | float |
int32 | 32位整数 | int |
int64 | 无符号32位整数 | long |
uint32 | 64位整数 | int |
uint64 | 64为无符号整 | long |
sint32 | 32位整数,处理负数效率更高 | int |
sint64 | 64位整数 处理负数效率更高 | long |
fixed32 | 32位无符号整数 | int |
fixed64 | 64位无符号整数 | long |
sfixed32 | 32位整数、能以更高的效率处理负数 | int |
sfixed64 | 64为整数 | long |
string | 只能处理 ASCII字符 | String |
bytes | 用于处理多字节的语言字符、如中文 | ByteString |
enum | 可以包含一个用户自定义的枚举类型uint32 | enum |
message |