grpc
gRPC 一开始由 google 开发,开源的远程过程调用(RPC)系统
grpc 支持同步和异步调用
简单模式下, 调用函数就像本地调用一样, 直接传输数据
流式调用将信息以数据量的方式,发送或者接受,
gRPC 客户端调用成功的判断是独立的本地的, 因此可能存在客户端与服务端判断不一致的情况
例如,您可以在服务器端成功完成RPC,但在客户端失败。在客户端发送所有请求之前,服务器也可以决定完成
grpc是基于HTTP2协议的封装
gRPC 请求和应答消息流中一般的消息顺序:
请求 → 请求报头 *有定界符的消息 EOS
应答 → 应答报头 *有定界符的消息 EOS
应答 → (应答报头 *有定界符的消息 跟踪信息) / 仅仅跟踪时
proto文件
第一步是定义要在proto文件中序列化的数据的结构:这是一个带.proto扩展名的普通文本文件。协议缓冲区数据被构造为 消息,其中每个消息是包含一系列称为字段的名称 - 值对的信息的逻辑记录
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
二.定义一个服务, 指定其可以被远程调用的方法及其参数和返回类型
相当于定义一个接口类型的服务
gRPC 默认使用 protocol buffers 作为接口定义语言,来描述服务接口和有效载荷消息结构
定义:
service HelloService {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
required string greeting = 1;
}
message HelloResponse {
required string reply = 1;
}
两种类型调用
- 简单模式:
rpc SayHello(HelloRequest) returns (HelloResponse){
}
- 流式调用
- 服务端支持流式
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){
}
- 客户端支持流式:
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {
}
- 双向流式:双方使用读写流发送一系列消息。这两个流独立运行,因此客户端和服务器可以按照自己喜欢的顺序进行读写:例如,服务器可以在写入响应之前等待接收所有客户端消息,