一、什么是 grpc 和 protobuf
1.1 grpc
gRPC 是由 Google 开发的一个高效、开源的远程过程调用(RPC)框架,用于在分布式系统中进行通信。它是基于 HTTP/2 协议,支持多种语言,能够让不同的系统或应用程序(即使使用不同的编程语言)进行高效的通信。
1.1.1 主要特点
- 高性能:gRPC 基于 HTTP/2 协议,支持流式传输、请求多路复用、头部压缩等特性,这些使得 gRPC 比传统的 HTTP/1.x 更加高效。
- 跨语言支持:gRPC 支持多种编程语言(如 C++, Java, Go, Python, Ruby, Node.js 等),使得不同语言开发的系统能够无缝通信。
- 支持同步和异步调用:gRPC 提供了同步和异步的调用方式,可以根据需求选择使用。
- 内置支持流式传输:gRPC 支持单向流和双向流,可以非常方便地实现实时通信。
- 自动生成代码:通过定义服务接口,gRPC 自动生成客户端和服务端的代码,减少手动编写的工作量。
1.1.2 典型应用场景
- 微服务架构中的服务之间的高效通信。
- 跨平台、跨语言的分布式系统通信。
- 实时数据传输或流处理。
1.2 protobuf
Protocol Buffers(简称 Protobuf)是 Google 开发的一种高效的序列化结构数据的机制,类似于 XML 或 JSON,但比它们更紧凑、更高效。Protobuf 用于数据的定义、传输和持久化,通常与 gRPC 一起使用。
1.2.1 主要特点
- 紧凑高效:Protobuf 使用二进制格式来存储数据,相比于 JSON 或 XML,它占用更少的空间,传输更快,解析也更高效。
- 平台和语言无关:Protobuf 支持多种语言(如 C++, Java, Python, Go 等)并能在不同平台间进行无缝传输。
- 结构化数据:数据的定义通过
.proto
文件进行,可以清晰地指定数据的类型、字段以及数据结构。 - 向后兼容与向前兼容:Protobuf 支持字段的增删和修改时,不影响已经存在的消息结构。新版本和旧版本可以兼容地进行通信。
1.2.2 工作原理
- 定义数据结构:你需要创建一个
.proto
文件来定义数据结构和服务接口。例如:syntax = "proto3"; message Person { string name = 1; int32 id = 2; string email = 3; } service Greeter { rpc SayHello (Person) returns (Person); }
-
编译
.proto
文件:使用protoc
编译器,将.proto
文件转化为目标语言的代码。 -
生成代码