一、gRPC的概念
gRPC是Google推出的一个开源高性能的轻量级RPC框架,可以在任何环境中运行。它可以有效地连接数据中心内和跨数据中心的服务,并提供可插拔的支持,以实现负载平衡,跟踪,健康检查和身份验证。它还适用于分布式计算的最后一英里,用于将设备,移动应用程序和浏览器连接到后端服务。
与许多RPC系统一样,gRPC基于定义服务的思想,指定可以使用其参数和返回类型远程调用的方法。它默认使用protocol buffers作为接口定义语言(IDL)来描述服务接口和有效负载消息的结构。
service HelloService { rpc SayHello (HelloRequest) returns (HelloResponse); } message HelloRequest { string greeting = 1; } message HelloResponse { string reply = 1; }
gRPC允许定义4种类型的服务方法:
- 一元RPC,客户端向服务器发送单个请求并返回单个响应,就像正常的函数调用一样。
rpc SayHello(HelloRequest) returns (HelloResponse){
}
- 服务器流式RPC,客户端向服务器发送请求并获取流以读取消息序列
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){
}
- 客户端流式RPC,客户端再次使用提供的流写入一系列消息并将其发送到服务器
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {
}
- 双向流式RPC,双方使用读写流发送一系列消息。
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){
}
通过定义.proto文件,gRPC提供protocol buffer compile plugins来生成客户端和服务端的代码。在服务器端,服务器实现服务声明的方法,并运行gRPC服务器来处理客户端调用。 gRPC基础结构解码传入请求,执行服务方法并对服务响应进行编码。而在客户端有一个称为存根的本地对象,它实现与服务端相同的方法,客户端可以在本地上调用这些方法。gRPC支持同步和异步调用。
二、RPC的生命周期
客户端在存根/客户端对象上调用方法后,客户端将元数据,方法名称和指定的截止时间(如果适用)通知到服务端,客户端已调用此RPC。然后,服务器可以立即发送回自己的初始元数据(必须在任何响应之前发送),或者等待客户端的请求消息 。一旦服务端接收到客户端的请求信息就会做出响应,然后将响应与状态详细信息(状态代码和可选状态消息)以及可选的尾随元数据一起返回(如果成功)到客户端。如果状态为OK,则客户端获取响应,从而完成客户端的调用。