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的使用可以被概括为:

  1. 通过Protobuf来定义接口和数据类型
  2. 编译Protobuf文件生成目标语言的实际代码,其中的对象用于提供通信功能
  3. 使用目标语言编写gRPC客户端和服务端代码,通常需要继承(2)中生成的代码对象
  4. 分别运行客户端和服务端,实现通信

未完待续

posted @ 2022-03-03 21:32  neumy  阅读(132)  评论(0编辑  收藏  举报