一, Protocol buffers 协议测试
1,简介
- Protocol buffers 是 Google 用于序列化结构化数据的语言中立、平台中立、可扩展机制——相比 XML,但更小、更快、更简单。您只需定义一次数据的结构化方式,然后就可以使用特殊生成的源代码轻松地将结构化数据写入和读取各种数据流,并使用各种语言。
2,pb协议的应用 - dubbo
- Dubbo 提供了从服务定义、服务发现、服务通信到流量管控等几乎所有的服务治理能力,并且尝试从使用上对用户屏蔽底层细节,以提供更好的易用性。
- 定义服务在 Dubbo 中非常简单与直观,可以选择使用与某种语言绑定的方式(如 Java 中可直接定义 Interface),也可以使用 Protobuf IDL 语言中立的方式。无论选择哪种方式,站在服务消费方的视角,都可以通过 Dubbo 提供的透明代理直接编码。
3,pb协议优点
- 紧凑的数据存储
- 快速解析
- 许多编程语言的可用性
- 通过自动生成的类优化功能
4, pb 使用流程
- 定义消息 Message
- 编译消息到各个语言代码 Protocol Compiler
- 在各个语言中构建 Protobuf Runtime
- 在项目中应用 序列化 反序列化 网络传输等
5, pb 使用
(1)安装protoc编译器
-
下载地址: Releases · protocolbuffers/protobuf · GitHub
- protoc-21.5-win64.zip (建议下载该版本)
-
下载完成解压后后,配置环境变量
-
在cmd输入 protoc --version命令查看是否安装成功
(2)将proto文件编译为java文件(在IDEA上操作)
- 在项目下新建一个proto文件夹,里面放入Person.proto文件
- 在Person.proto文件中,定义号java文件的包名和类名
option java_package = "com.ceshiren.auctionEngine"; // 生成的java文件的包名
option java_outer_classname = "AuctionEngineRequest"; // 生成的java文件的类名
(3)命令进入proto目录下,在proto文件夹下生成对应的java文件
- 使用命令: protoc --java_out=. -I. Person.proto
(4)也可以直接指定java文件生成的文件夹和目录
- 使用命令: protoc --java_out=src/main/java/com/ceshiren/auctionEngine src/main/java/proto/Person.proto
- src/main/java/com/ceshiren/auctionEngine 生成文件路径
- src/main/java/proto/Person.proto 指定proto文件
(5)导入对应依赖
<!-- 添加protobuf依赖-->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.21.4</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.21.4</version>
</dependency>
<!-- ESA -->
<dependency>
<groupId>io.esastack</groupId>
<artifactId>restlight-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.esastack</groupId>
<artifactId>commons</artifactId>
</dependency>
<dependency>
<groupId>io.esastack</groupId>
<artifactId>httpclient-core</artifactId>
</dependency>
(6)代码示例
import com.google.protobuf.util.JsonFormat;
import esa.httpclient.core.HttpClient;
import esa.httpclient.core.HttpResponse;
import io.netty.buffer.ByteBufUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@Slf4j
public class searchQsTest {
@Test
void testSearchQsEnforce() throws Exception {
public static final HttpClient client = HttpClient.ofDefault();
// 接口请求参数
MixRequestOuterClass.MixRequest mixRequest = MixRequestOuterClass.MixRequest.newBuilder()
.setMixHeader(mixHeader)
.setMixData(mixData).build();
//发起http请求
HttpResponse httpResponse = client.post(url)
.body(mixRequest.toByteArray())
.addHeader("Content-Type", "application/x-protobuf")
.execute().get();
//接口返回数据断言
Assertions.assertNotNull(httpResponse, "null responsey");
Assertions.assertNotNull(httpResponse.body(), "null http response body");
Assertions.assertEquals(200,httpResponse.status());
//接口返回数据结果打印
byte[] bytes = ByteBufUtil.getBytes(httpResponse.body().getByteBuf());
MixResponseOuterClass.MixResponse result = MixResponseOuterClass.MixResponse.parseFrom(bytes);
log.info("result :" + "\n" + JsonFormat.printer().omittingInsignificantWhitespace().print(result));
}
}