什么是 gRPC?
Google Remote Procedure Call — 高性能、开源的通用 RPC 框架
gRPC · PROTOCOL BUFFERS · HTTP/2
本地调用 vs 远程过程调用
本地调用流程
进程 (Process)
订单管理模块
本地函数调用
支付模块
RPC 调用流程
服务器 A — 订单服务
RPC 网络调用
服务器 B — 支付服务
数据格式 — Protocol Buffers
order.proto
syntax = "proto3";
message Order {
string order_id = 1;
required double price = 2;
string user_id = 3;
repeated string products = 4;
optional string description = 5;
}
// 强类型契约 — 编译时类型检查,杜绝运行时错误
message Order {
string order_id = 1;
required double price = 2;
string user_id = 3;
repeated string products = 4;
optional string description = 5;
}
// 强类型契约 — 编译时类型检查,杜绝运行时错误
强类型契约 — Strongly Typed Contracts
使用场景
微服务
Microservice
服务间高效通信
实时更新
Live Update
流式数据推送
物联网
IoT
轻量高效传输
多语言环境
Polyglot Env
跨语言无缝调用
gRPC 数据传输流程 — 完整 13 步骤
HOW DO WE TRANSMIT DATA VIA gRPC?
gRPC 完整通信流程
客户端 (Client)
1
客户端应用发起请求
Client App — 发起订单请求
orderClient.placeOrder(order)
2
序列化请求
gRPC Client Stub 使用 Protocol Buffers 序列化
对象 → 二进制
3
发送 HTTP/2 请求
通过 HTTP/2 协议将请求发送到网络
响应阶段
11
接收 HTTP/2 响应
客户端通过 HTTP/2 接收服务端响应
12
反序列化响应
gRPC Client Stub 使用 Protocol Buffers 反序列化
二进制 → 对象
13
获得响应结果
客户端应用程序获得订单确认响应
OrderConfirmation ✓
⬇ 请求方向
4
网络传输
TCP/IP
10
网络传输
TCP/IP
⬆ 响应方向
服务端 (Server)
5
接收 HTTP/2 请求
服务端通过 HTTP/2 接收客户端请求
6
反序列化请求
gRPC Server Stub 使用 Protocol Buffers 反序列化
二进制 → 对象
7
服务端处理请求
Server App — 执行业务逻辑
server.placeOrder(order)
响应阶段
8
序列化响应
gRPC Server Stub 使用 Protocol Buffers 序列化响应
对象 → 二进制
9
发送 HTTP/2 响应
通过 HTTP/2 协议将响应发送到网络
优缺点分析
优点
高性能
High Performance
语言无关
Language Agnostic
强类型接口
Strongly Typed Interfaces
流式支持
Streaming Support
高效数据序列化
Efficient Serialization
缺点
复杂度和学习曲线
Complexity & Learning Curve
社区比 REST 小
Smaller Community
防火墙和代理限制
Firewall & Proxy Limits
可读性有限
Limited Human Readability