gRPC和Protobuf的笔记(未完待续)
通过gRPC和Protobuf实现简单分布式应用
技术简介
gRPC框架
gRPC框架是一个新式的中立的高性能通信框架。gRPC框架中的客户端 就像调用本地服务一样调用远程服务。
gRPC的中立性,体现在语言中立、平台中立、开源上。
gRPC的优点在于:
- 基于HTTP/2实现,具有更高的通信效益
- 支持多种语言
- 支持使用Protobuf来定义服务并生成框架的目标代码
Protobuf序列化协议
Protobuf是一种数据序列化协议,用于将数据进行序列化和反序列化以支持通信过程。gRPC使用Protobuf来定义“服务”这一概念。
Protobuf的优点在于:
- 通信消息被序列化经过编译的二进制字节,性能好效率高,相比于JSON的序列化快8倍,消息体积小60%~80%
- 独立于平台和语言,可以在
.proto
文件中使用跨平台接口定义语言(IDL)来定义服务,然后直接使用Protobuf编译器生成gRPC框架所需的客户端和服务端代码 - 提供严格的调用接口约束
- 支持向前和向下兼容,新加字段可以采用默认值(向前兼容,通过default关键字实现),也可以直接忽略(向后兼容,通过optional关键字实现)
通信时,传递的消息是由Protobuf中的关键字 message 消息 这一数据结构进行打包,然后编译为二进制的码流后进行传输和存储。在定义消息时,每个字段会对应一个数字,也就是 标识号,其中1~15之间的标识号在编码时占用一个字节,16~2047之间的标识号占用两个字节。
message HelloRequest {
required string title = 1; // 该字段必须有值,根据类型Protobuf会自动指定默认值
optional string content = 2; // 该字段可以为空。具体来说Protobuf会使用一个bool变量来标记该字段是否有值
repeated string author = 3; // 该字段可以重复。具体来说Protobuf会使用一个count变量来标记该字段有几个
}
远程服务所提供的接口,是通过Protobuf中的关键字 service 服务这一结构来描述的。
service HelloService {
rpc Hello(HelloRequest) returns(HelloResponse);
}
Protobuf通常有proto2和proto3两种语法规则可选,需要在.proto
文件开头使用syntax
关键字声明使用的版本。不同版本的语法略有不同,比如proto3中默认字段为required,且使用oneof取代repeated,等等。
syntax "proto2";
技术实现
gRPC的使用可以被概括为:
- 通过Protobuf来定义接口和数据类型
- 编译Protobuf文件生成目标语言的实际代码,其中的对象用于提供通信功能
- 使用目标语言编写gRPC客户端和服务端代码,通常需要继承(2)中生成的代码对象
- 分别运行客户端和服务端,实现通信
未完待续