什么是 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;
}

// 强类型契约 — 编译时类型检查,杜绝运行时错误
强类型契约 — 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 协议将响应发送到网络
客户端 步骤 1-3 请求 网络 步骤 4 请求 服务端 步骤 5-7 客户端 步骤 11-13 响应 网络 步骤 10 响应 服务端 步骤 8-9 共 13 个步骤 请求 1→4→5 | 响应 8→10→11

优缺点分析

优点

高性能 High Performance
语言无关 Language Agnostic
强类型接口 Strongly Typed Interfaces
流式支持 Streaming Support
高效数据序列化 Efficient Serialization

缺点

复杂度和学习曲线 Complexity & Learning Curve
社区比 REST 小 Smaller Community
防火墙和代理限制 Firewall & Proxy Limits
可读性有限 Limited Human Readability