gRPC 简介
gRPC是一个高性能、通用的开源 RPC 框架,其由 Google 主要面向移动应用开发并基于HTTP/2协议标准而设计,基于 ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。
由于 gRPC 基于 HTTP/2 标准设计,所以相对于其他 RPC 框架,gRPC 带来了更多强大功能,如双向流、头部压缩、多复用请求等。这些功能给移动设备带来重大益处,如节省带宽、降低 TCP 链接次数、节省 CPU 使用和延长电池寿命等。同时,gRPC 还能够提高了云端服务和 Web 应用的性能。gRPC 既能够在客户端应用,也能够在服务器端应用,从而以透明的方式实现客户端和服务器端的通信和简化通信系统的构建。
在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
语言支持
目前 gRPC 官方提供了多种语言环境的使用支持,具有非常强大的通用性,其所支持的语言环境包括:
- C++
- Java
- Python
- Go
- Ruby
- C#
- Node.js
- Android Java
- Object-C
- PHP
- Dart
应用场景
gRPC 已经应用在 Google 的云服务和对外提供的 API 中,其主要应用场景如下:
- 低延迟、高扩展性、分布式的系统
- 同云服务器进行通信的移动应用客户端
- 设计语言独立、高效、精确的新协议
- 便于各方面扩展的分层设计,如认证、负载均衡、日志记录、监控等
ProtoBuf
gRPC 使用 ProtoBuf 来定义服务,ProtoBuf 是由 Google 开发的一种数据序列化协议(类似于 XML/JSON)。ProtoBuf 能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。不过,当前 gRPC 仅支持 Protobuf ,且不支持在浏览器中使用。
数据类型
Protocol Buffer 协议提供了多种数据类型,可以用于描述对应不同语言下的数据类型,以实现跨语言的数据通信。
其实数据类型在不同语言环境下的类型对照表如下。
.proto 类型 | 说明 | C++ 类型 | Java 类型 | Python 类型 | Go 类型 | C# 类型 |
---|---|---|---|---|---|---|
double | 双精度 | double | double | float | float64 | double |
float | 浮点 | float | float | float | float32 | float |
int32 | 变长32位整型 | int32 | int | int | int32 | int |
int64 | 变长64位整型 | int64 | long | int/long | int64 | long |
uint32 | 变长32位无符号整型 | uint32 | int | int/long | uint32 | uint |
uint64 | 变长64为无符号整型 | uint64 | long | int/long | uint64 | ulong |
sint32 | 有符号的变长32位整型 | int32 | int | int | int32 | int |
sint64 | 有符号的变长64位整型 | int64 | long | int/long | int64 | long |
fixed32 | 定长32位无符号整型 | uint32 | int | int/long | uint32 | uint |
fixed64 | 定长64位无符号整型 | uint64 | long | int/long | uint64 | ulong |
sfixed32 | 定长32为有符号整型 | int32 | int | int | int32 | int |
sfixed64 | 定长64位有符号整型 | int64 | long | int/long | int64 | long |
bool | 布尔 | bool | boolean | bool | bool | bool |
string | UTF-8 或 ASCII 字符串 | string | String | str/unicode | string | string |
bytes | 任意字节数据 | string | ByteString | str | []byte | ByteString |
命名规范
message 采用 PascalCase 命名,首字母大写。字段名采用下划线分隔的 snake_case 命名。
message SongServerRequest {
required string song_name = 1;
}
枚举类型采用 PascalCase 法。每个枚举值采用 UPPER_CASE 命名。
enum Foo {
FIRST_VALUE = 0;
SECOND_VALUE = 1;
}
服务名和方法名都采用 PascalCase 命名。
service FooService {
rpc GetSomething(FooRequest) returns (FooResponse);
}
在 RPC 中使用
如果要使用 RPC(远程过程调用)系统的消息类型,可以在 .proto 文件中定义 RPC 服务接口,protocol buffer 编译器将使用所选语言生成服务接口代码和桩 (stubs)。
service SearchService {
rpc Search (SearchRequest) returns (SearchResponse);
}
然后通过 message 可以来定义对应调用过程的参数参数结构。
更多关于 ProtoBuf 的相关内容可以参考 google 官方提供的相关文档。
参考文档:
- https://www.infoq.cn/article/2015/03/grpc-google-http2-protobuf
- https://developers.google.com/protocol-buffers/docs/overview
- https://developers.google.com/protocol-buffers/docs/proto3
最后修改于 2019-04-13