gRPC核心概念与通信机制
基本概述
gRPC是一种跨语言、跨平台的远程过程调用框架,采用客户端/服务器通信模型。客户端可直接调用远程服务方法如同本地操作,底层通过Protocol Buffers进行数据结构序列化。
服务接口通过.proto文件定义,支持四种通信模式以适应不同传输需求。
服务定义模式
使用Protocol Buffers IDL定义服务接口:
service GreetingService {
rpc SendGreeting (MessageRequest) returns (MessageResponse);
}
message MessageRequest {
string content = 1;
}
message MessageResponse {
string feedback = 1;
}
通信模式
1. 一元调用
标准请求-响应模式,适用于简单交互场景:
rpc SendMessage(MessageRequest) returns (MessageResponse){}
2. 服务端流式传输
适用于服务器推送大规模数据集:
rpc StreamResponses(MessageRequest) returns (stream MessageResponse){}
3. 客户端流式传输
适用于客户端批量上传数据:
rpc ReceiveMessages(stream MessageRequest) returns (MessageResponse) {}
4. 双工流式传输
支持双向异步实时通信:
rpc BiDirectionalComm(stream MessageRequest) returns (stream MessageResponse){}
通信过程控制
超时管理
客户端可通过deadline参数设定最大等待时间,触发DEADLINE_EXCEEDED错误。
流程终止
分为四种终止状态:
- 成功完成:正常响应返回
- 超时终止:响应超时阈值
- 主动取消:客户端/服务端中断
- 异常失败:网络或系统错误
元数据传递
通过键值对形式传递认证信息等附加数据:
headers {
authorization: "Bearer xxxxx"
}
安全机制
传输层加密
默认采用SSL/TLS通道加密保障传输安全。
认证体系
- SSL/TLS:服务端证书校验
- OAuth 2.0:令牌认证机制
注:Google OAuth2凭证仅限Google服务使用
HTTP/2协议实现
请求结构
HEADERS帧:
:method = POST
:path = /service/method
grpc-timeout = 500ms
DATA帧:
{压缩标志}{消息长度}{载荷数据}
响应处理
成功响应:
HEADERS → :status 200
DATA → {有效载荷}
TRAILERS → grpc-status 0
错误处理:
TRAILERS → grpc-status {错误码}
| HTTP/2错误码 | gRPC状态码 |
|---|---|
| REFUSED_STREAM(7) | UNAVAILABLE(14) |
| CANCEL(8) | CANCELLED(1) |
| ENHANCE_YOUR_CALM(11) | RESOURCE_EXHAUSTED(8) |
连接管理
连接保活
通过PING帧检测连接状态,超时触发调用终止。
优雅关闭
服务端发送GOAWAY帧指示停止接收新请求。