我正在参加「掘金·启航计划」
1、什么是RPC
rpc代指远程过程调用,是一个计算机通信协议,该协议允许运行于一台计算机的程序调用另一台计算机的子程序。它的调用包含了传输协议和编码协议等。
2、什么是gRPC
gRPC是一个高性能、开源和通用的RPC框架,面向移动和基于HTTP/2设计。有双向流、流控、头部压缩、单TCP连接上的多路复用请求等特性。
2.1、gRPC调用模型
- 客户端在程序中调用某方法,发起RPC调用请求。
- 对请求信息使用protobuf进行对象序列化压缩。
- 服务端接收到请求后,解码请求体,进行业务逻辑处理并返回。
- 对响应结果使用protobuf进行对象序列化压缩。
- 客户端接收到服务端的响应,解码返回体。
3、什么是Protobuf
Protobuf是一种与与语言、平台无关,可扩展的序列化结构数据的描述语言,常用于通信协议,数据存储等,相较于XML、JSON它更小、更快。
3.1、基本语法
syntax = "proto3"
package test;
service Test {
rpc Hello (HelloRequest) returns (HelloResponse){}
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string res = 1;
}
- 第一行(非空的非注释行)声明使用
proto3
语法,如果不声明,将默认使用proto2
语法,推荐使用v3版本。 - 定义名为Test的RPC服务,其包含RPC方法Hello,入参为HelloRequest 消息体(message),出参为 HelloResponse 消息体;
- 关键字
message
定义HelloRequest
、HelloResponse
消息体,每个消息体包含三个属性:类型、字段名、字段编号。除类型以外均不可重复。 - 在编写完.proto文件后,我们会进行编译和生成对应语言的proto文件操作。
4、gRPC的调用方式
4.1、Unary RPC:一元RPC
普通的rpc调用,⼀个请求对象对应⼀个返回对象
rpc GetData (ReqData) returns (RepData) {};
4.2、Service-side streaming RPC:服务端流式 RPC
客户端发起一次普通的RPC请求,服务端通过流式响应多次发送数据集,客户端Recv接收数据集。
客户端发出一个请求,但不会立马得到一个响应,而是在服务端与客户端之间建立一个单向的流,服务端可以随时向流中写入多个响应消息,最后主动关闭流,而客户端需要监听这个流,不断获取响应直到流关闭。
应用场景:
客户端向服务端发送一个股票代码,股票端就把该股票的实时数据不断的返回给客户端。
rpc GetStream (ReqData) returns (stream RepData) {};
4.3、Client-side streaming RPC:客户端流式 RPC
客户端流式RPC,单向流,客户端通过流式发起多次RPC请求给服务端,服务端发起一次响应给客户端。
应用场景:
物联网终端向服务器报送数据。
rpc SetStream (stream ReqData) returns (RepData) {};
4.4、Bidirectional streaming RPC:双向流式 RPC
双向流式RPC,双向流,由客户端以流式的方式发起请求,服务端同样以流式的方式响应请求,首个请求一定是Client发起,但具体交互方式(谁先谁后,一次发多少,响应多少,什么时候关闭)根据程序编写的方式来确定。
应用场景:聊天应用。
rpc AllStream (stream ReqData) returns (stream RepData) {};
4.5、gRPC的四种调用方式 grpc-demo
源码地址:grpc-demo