1. 编解码技术
1.1 netty自身提供的编解码器
- StringDecoder StringEncoder 字符串解码编码器
- ObjectDecoder ObjectEncoder 对象解码编码器
- 底层都基于 JAVA 序列化,从 JDK 1.1 版本就提供,只需实现 java.io.Serializable并生成序列ID即可。
- JAVA序列化的目的,网络传输及持久化。
- Java序列化从JDK 1.1版本就己经提供,它不需要添加额外的类库,只需实现 java.io.Serializable并生成序列ID即可,但是在远程服务调用(RPC)时,很少宜接使用Java序列化进行消息的编解码和传输, 这又是什么原因呢?
- 无法跨语言,编码后其他语言无法正常解码
- 编码后的码流太大
- 性能差
1.2 业界主流的编解码框架
- MessagePack 编解码
MessagePack是一个高效的二进制序列化框架,它像JSON 一样支持不同语言间的数 据交换,但是它的性能更快,序列化之后的码流也更小。
编解码高效,性能高;
序列化之后的码流小;
支持跨语言。
- Google Protobuf 编解码
Google的Protobuf在业界非常流行,很多商业项目选择Protobuf作为编解码框架。
在谷歌内部长期使用,产品成熟度髙:
跨语言、支持多种语言,包括C++、Java和Python:
编码后的消息更小,更加冇利于存储和传输:
编解码的性能非常高:
支持不同协议版本的前向兼容:
支持定义可选和必选字段。
- JBoss Marshalling 编解码
JBoss Marshalling是一个Java对象序列化包,对JDK默认的序列化框架进行了优化, 但又保持跟java.io.Serializablc接口的兼容,同时増加了 -些可调的参数和附加的特性, 这些参数和特性可通过工厂类进行配置。
2. Google Protobuf 编解码
客户端产生业务数据,经过 ProtobufEncoder 编码器编码,客户端接受后通过 ProtobufDecoder 解码。
2.1 编写.proto文件
//版本
syntax = "proto3";
// 生成的外部类型名称
option java_outer_classname = "StudentPOJO";
// protobuf 使用 message 管理数据
message Student{
// 会在 StudentPOJO 外部类生成内部类, 真正发送的 pojo 对象
// 1 标识属性序号,不代表值
int32 id = 1;
string name = 2;
}
// https://developers.google.com/protocol-buffers/docs/proto 文档
google protobuf 会根据此文件生成对应的 java类,此内部类对相应 message 定义的内容。
StudentPOJO 需要通过 protoc.exe 生成,protoc.exe --java_out=. Student.proto
public final class StudentPOJO {
private StudentPOJO() {
}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistryLite registry) {
}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistry registry) {
registerAllExtensions(
(com.google.protobuf.ExtensionRegistryLite) registry);
}
public interface StudentOrBuilder extends
// @@protoc_insertion_point(interface_extends:Student)
com.google.protobuf.MessageOrBuilder {
/**
* <pre>
* 1 标识属性序号,不代表值
* </pre>
*
* <code>int32 id = 1;</code>
*/
int getId();
/**
* <code>string name = 2;</code>
*/
java.lang.String getName();
/**
* <code>string name = 2;</code>
*/
com.google.protobuf.ByteString
getNameBytes();
}
public static final class Student extends com.google.protobuf.GeneratedMessageV3 implements StudentOrBuilder {
private static final