1、编码和解码
2、Google Protobuf 介绍
3、案例--netty 使用 protobuf 序列化
3.1、编写 .proto 文件
3.2、自动生成代码
3.3、netty 通过 Protobuf 传递消息
4、netty 使用 protobuf 传输多种类型对象
1、编码和解码 <--返回目录
编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码。
codec(编解码器) 的组成部分有两个:decoder(解码器) 和 encoder(编码器)。encoder 负责把业务数据转换成字节码数据,decoder 负责把字节码数据转换成业务数据。
netty 提供的 StringEncoder/StringDecoder 是对字符串数据进行编解码;ObjectEncoder/ObjectDecoder 是对 Java 对象进行编解码。
ObjectEncoder/ObjectDecoder 可以用来实现 POJO 对象或各种业务对象的编解码,底层使用的是 Java 序列化技术,而 Java 序列化技术本身效率不高,并存在如下问题:
- 无法跨语言
- 序列化后的体积太大,是二进制编码的 5 倍多
- 序列化性能低
所以,引出新的解决方案:Google 的 Protobuf。
2、Google Protobuf 介绍 <--返回目录
参考文档:https://developers.google.com/protocol-buffers/docs/proto
Protobuf 是 Google 发布的开源项目,全称 Google Protocol Buffers,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化或者说序列化。它很适合做数据存储或 RPC 数据交换格式。
支持跨平台/跨语言,支持绝大数语言,例如 c++,c#, Java, python 等。‘
Protobuf 自动生成代码:
- 使用 Protobuf 编译器自动生成代码,Protobuf 是将类的定义使用 .proto 文件进行描述。在 IDEA 中编写 .proto 文件时,会自动提示是否下载 .protot 编写插件(protobuf support 插件),可以让语法高亮。
- 然后通过 protoc.exe 编译器根据 .proto 自动生成 .java 文件
自动生成 .java 文件 参考:(注意 .proto 文件放在 src/main/proto 目录下)
3、案例--netty 使用 protobuf 序列化 <--返回目录
需求:
1)客户端可以发送一个 User POJO 对象到服务器(通过 protobuf 编码);
2)服务端能接收 User POJO 对象,并显示信息(通过 protobuf 解码);
3.1、编写 .proto 文件 <--返回目录
src/main/proto/User.proto
syntax = "proto3"; option java_package = "com.oy.protobuf"; option java_outer_classname = "UserModel";// 生成的外部类名,同时也是文件名 // protobuf 使用 message 管理数据 message User { // 会在 UserModel 里面生成一个内部类 User,即是真正发送的 POJO 对象 int32 id = 1; string name = 2; }
3.2、自动生成代码 <--返回目录
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>netty-helloworld</artifactId> <version>1.0-SNAPSHOT</version> <properties> <java.version>1.8</java.version> <grpc.version>1.14.0</grpc.version> <protobuf.version>3.3.0</protobuf.version> </properties> <dependencies> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.22.Final</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>${grpc.version}</version> </dependency> <!--<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>${protobuf.version}</version> </dependency>--> </dependencies> <build> <extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.5.0.Final</version> </extension> </extensions> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.5.1</version> <configuration> <protocArtifact>com.google.protobuf:protoc:3.5.1:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.14.0:exe:${os.detected.classifier}</pluginArtifact> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>