写点什么

Netty 编解码方案之 Protobuf 介绍

  • 2021 年 11 月 11 日
  • 本文字数:1002 字

    阅读完需:约 3 分钟

ObjectDecoder,对 Java 对象进行解码



Netty 本身自带的 ObjectDecoder 和 ObjectEncoder 可以用来实现 POJO 对象或各种业务对象的编码和解码,底层使用的仍是 Java 序列化技术 , 而 Java 序列化技术本身效率就不高,存在如下问题


  1. 无法跨语言

  2. 序列化后的体积太大,是二进制编码的 5 倍多。

  3. 序列化性能太低

2.Google Protobuf

Protobuf 是 Google 发布的开源项目,全称 Google Protocol Buffers,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC[远程过程调用 remote procedure call ] 数据交换格式 。目前很多公司 http+json -> tcp+protobuf


参考文档 : https://developers.google.com/protocol-buffers/docs/proto


Protobuf 是以 message 的方式来管理数据的.


支持跨平台、跨语言,即[客户端和服务器端可以是不同的语言编写的] (支持目前绝大多数语言,例如 C++、C#、Java、python 等)


高性能高可靠性


使用 protobuf 编译器能自动生成代码,Protobuf 是将类的定义使用.proto 文件进行描述。说明,在 idea 中编写 .proto 文件时,会自动提示是否下载 .ptotot 编写插件. 可以让语法高亮。然后通过 protoc.exe 编译器根据.proto 自动生成.java 文件


protobuf 使用示意图


3.具体使用

1.导入依赖

要使用protobuf 我们需要导入相关的 jar 文件


<dependency>


<groupId>com.google.protobuf</groupId>


<artifactId>protobuf-java</artifactId>


<version>3.6.1</version>


</dependency>

2.创建 proto 文件

创建Student.proto文件。在 IEDA 中会提示安装相关的插件,如下



直接点击即可




安装完成后重启 idea 即可,然后再看 proto 类型的文件,会有对应的 logo,语法也会相应的高亮。



文件内容:


syntax = "proto3";// 设置相关版本


option java_outer_classname = "StudentPojo"; // 生成的外部类名称,同时也是文件名


// protobuf 使用 message 管理数据


message Student{ // 会在 StudentPojo 外部类生成一个内部类 Student,这个是真正发送的 POJO 对象


int32 id = 1; // Student 类中有一个属性 名称为 id 类型为 int32 1 表示 属性序号


string name = 2; // 2 也表是属性序号 不是值


}

3.生成对于的 POJO 对象

通过 proto.exe 文件来生成对于的 POJO 文件,如下



命令:


proto.exe --java_out=. Student.proto


然后将文件拷贝到项目中

4.客户端服务器操作

接下来我们实现一个 netty 的通信,发送的是一个 POJO 对象,然后通过 protobuf 来实现对应的编解码操作


服务端解码

评论

发布
暂无评论
Netty编解码方案之Protobuf介绍