本文基于视频:gRPC课程,涵盖了 1 到 5 集内容。
该视频比较短小精悍,小哥口音有点奇怪,但是还算吐字清楚。
1. The motivation of gRPC
gRPC 试图解决应用之间的 通信 问题。通常,前端和后端程序用不同的语言编写,微服务可能也是用不同的语言编写。他们间需要一个共同的协议来处理:
- 通信方式:如 Basic,SOAP,消息队列
- 认证机制:如 Basic,OAuth,JWT
- 消息载荷类型:如 JSON,XML,binary
- 数据模型
- 错误处理
该协议应该非常效率,因为:
- 微服务间的信息交换非常多
- 手机网络带宽限制
gRPC 就在这些需求下应运而生。
2. gRPC 是什么
gRPC 是一个开源的多功能 RPC 框架。
RPC 指 Remote Procedure Call,是一种调用其他主机上运行的程序的协议,之前在做 MIT 6.824 时已经有接触,使用 RPC 就像可以直接从客户端调用服务端的代码。
如上图所示,client 有一个自动生成的 "Stub" 提供 server 端的可调用函数。"Stub" 会调用 gRPC 框架并管理通信上的细节。
生成 Stub
gRPC 默认使用 protocol buffers 来生成 Stub。这是一种接口定义语言(Interface Definition Language, IDL)。
首先,定义 RPC 使用的服务和消息类型,protocol buffer 是一种强类型的协议,因此它要求指定参数、返回值的类型。
// The greeter service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
之后, protocol buffer compiler 可以利用这些定义生成指定语言的代码(golang, cpp, java, etc)。
3. gRPC 的优势
使用 http2
gRPC 使用 http2 作为底层通信协议。
http2 是 2015 年面世的新版本,相较于 1997 年的 http1.1,它的主要特色是:
-
使用二进制而非文本
- 更好的性能
- 传输更轻量级,解码更安全
- 与 protocol buffer 兼容性好
-
使用HPACK 压缩 header
- 更少的 overhead,更优性能
-
多路复用
- 可以通过一个 TCP 连接 并行 发送多个请求/回复
- 降低延迟,提高网络利用率
-
服务器推送
- 客户端发送一个请求后,服务器预判客户端需要什么资源,并主动发送响应。表现为一个请求,多个响应。
- 减少 round-trip 延迟
HTTP/2 | HTTP/1.1 | |
---|---|---|
Transfer Protocol | binary | text |
Headers | compressed | plain text |
Multiplexing | yes | no |
Request per connection | Multiple | 1 |
Server push | Yes | No |
这个网站可以测试 http2 的性能,我的结果是相比 http1.1 加载时间减少了50%以上。
gRPC v.s. REST
Feature | gPRC | REST |
---|---|---|
协议 | HTTP/2 | HTTP/1.1 |
有效载荷 | Protobuf (二进制, 小巧) | JSON(文本, 冗长) |
API | .proto(强类型) | OpenAPI(宽松) |
代码生成 | 内置的 protoc | 第三方工具,如 swagger |
安全性 | TLS/SSL | TLS/SSL |
流 | 双向的 | 只能客户端发起 |
浏览器支持 | 需要 gRPC-web 在 HTTP/1 和 HTTP/2 之间做转换 | 支持 |
可以看出,gRPC 在除了浏览器支持外都有更好的表现。因此 gRPC 特别适合用于:
微服务(低延迟、高网络流量、强 API 合约)
-
多语言环境
- gRPC 有原生的代码生成工具
-
点对点实时通信
- gRPC 支持双向流
-
网络资源有限的系统(如手机)
- gRPC 有轻量级的消息格式
有疑问加站长微信联系(非本文作者)