1. gRPC 基础概念

gRPC 是 Google 开源的高性能远程过程调用(RPC)框架,基于 HTTP/2 协议传输,使用 Protocol Buffers 作为接口定义语言(IDL)与序列化工具。它支持多种编程语言,在微服务架构、移动端-服务端通信、IoT 等场景中广泛应用。本章从定义、对比、序列化协议、服务类型四个维度建立 gRPC 的基础认知。

1.1 gRPC 定义

gRPC 的全称是 gRPC Remote Procedure Calls,其核心思想是:客户端像调用本地函数一样直接调用远端服务器上的方法,框架负责参数序列化、网络传输、反序列化及错误处理。gRPC 默认使用 Protocol Buffers(protobuf)定义服务接口和消息结构,通过 protoc 编译器生成客户端桩(Stub)和服务器骨架(Skeleton)代码。

关键特性:
  • 基于 HTTP/2 多路复用、头部压缩、服务器推送
  • 默认使用 Protocol Buffers 二进制序列化,体积小、速度快
  • 支持四种通信模式(Unary / Server Streaming / Client Streaming / Bidirectional Streaming)
  • 内置认证、流量控制、超时、取消等机制
  • 跨语言互操作:同一 .proto 文件可生成 Go、Java、Python、C++ 等代码

1.2 gRPC 与 REST 对比

REST 是资源导向的 HTTP API 风格,gRPC 是函数/服务导向的 RPC 框架。两者在协议、序列化、性能、适用场景上有显著差异。下表从多个维度进行对比:

对比维度 gRPC REST
底层协议 HTTP/2(必须) HTTP/1.1 或 HTTP/2
消息格式 Protocol Buffers(二进制) JSON / XML / 纯文本
接口定义 .proto 文件(强类型、代码生成) OpenAPI / 手动文档(弱类型)
通信模式 Unary + 三种流式模式 请求-响应(单向)
浏览器支持 需 gRPC-Web 代理 原生支持
性能(吞吐/延迟) 高(二进制、多路复用) 中(文本、连接开销)
适用场景 微服务内部通信、实时流、IoT 公开 API、Web 前端、缓存友好
选型建议: 内部服务间通信优先选 gRPC,追求低延迟和高吞吐;对外公开 API 或需要浏览器直接调用时,REST + JSON 仍是更通用的选择。

1.3 Protocol Buffers 简介

Protocol Buffers(简称 protobuf)是 Google 开发的与语言无关、平台无关的序列化结构化数据机制。开发者通过 .proto 文件定义消息结构和服务接口,然后使用 protoc 编译器生成目标语言的代码。

一个典型的 .proto 文件示例:

syntax = "proto3";

package helloworld;

// 定义请求消息
message HelloRequest {
  string name = 1;
}

// 定义响应消息
message HelloReply {
  string message = 1;
}

// 定义服务
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

protobuf 相比 JSON 的核心优势:

  • 体积小: 二进制编码,无冗余字段名,典型体积为 JSON 的 1/3 ~ 1/10
  • 速度快: 序列化/反序列化无需反射解析,CPU 开销低
  • 强类型: 字段类型、编号、默认值在编译期确定,减少运行时错误
  • 向后兼容: 字段编号机制支持新增/废弃字段而不破坏现有代码

1.4 gRPC 四大服务类型

gRPC 基于 HTTP/2 的流式能力,定义了四种服务通信模式。理解这些模式是设计 gRPC 接口和后续压测模型的基础。

  1. Unary RPC(一元 RPC): 客户端发送一个请求,服务器返回一个响应。语义与普通函数调用一致,是最常用的模式。
  2. Server Streaming RPC(服务端流式 RPC): 客户端发送一个请求,服务器返回一个响应流(多条消息)。适用于大文件下载、事件推送、日志流等场景。
  3. Client Streaming RPC(客户端流式 RPC): 客户端发送一个请求流(多条消息),服务器返回一个响应。适用于批量上传、数据聚合、长连接上报等场景。
  4. Bidirectional Streaming RPC(双向流式 RPC): 客户端和服务器各自独立发送流,双方可以同时读写。适用于实时聊天、游戏同步、协同编辑等场景。

下表总结了四种模式的特征:

模式 客户端请求 服务器响应 典型场景
Unary 1 条消息 1 条消息 用户登录、查询订单
Server Streaming 1 条消息 N 条消息(流) 实时监控、日志推送
Client Streaming N 条消息(流) 1 条消息 批量上传、传感器数据聚合
Bidirectional Streaming N 条消息(流) N 条消息(流) 实时聊天、协同编辑
gRPC 四大服务类型通信模式 Unary RPC Client Server 请求 响应 Server Streaming RPC Client Server 请求 响应流 响应流 Client Streaming RPC Client Server 请求流 请求流 响应 Bidirectional Client Server 请求流 响应流 说明: Unary 为单请求-单响应;Server Streaming 为单请求-多响应;Client Streaming 为多请求-单响应;Bidirectional 为多请求-多响应(独立流)。 gRPC 与 REST 协议栈对比 gRPC 协议栈 Service Definition (.proto) Protocol Buffers (序列化/反序列化) HTTP/2 (多路复用、流控、头部压缩) TCP / TLS REST 协议栈 OpenAPI / 手动文档 JSON / XML (文本序列化) HTTP/1.1 或 HTTP/2 TCP / TLS 关键差异: gRPC 强制使用 HTTP/2 + Protobuf,支持流式通信和强类型接口定义;REST 通常使用 HTTP/1.1 + JSON, 浏览器原生支持但缺乏流式能力和强类型契约。gRPC 在内部服务通信中性能优势明显。