gRPC和protobuf的使用和了解(附源码)

112 阅读3分钟

我正在参加「掘金·启航计划」

1、什么是RPC

rpc代指远程过程调用,是一个计算机通信协议,该协议允许运行于一台计算机的程序调用另一台计算机的子程序。它的调用包含了传输协议和编码协议等。

2、什么是gRPC

gRPC是一个高性能、开源和通用的RPC框架,面向移动和基于HTTP/2设计。有双向流、流控、头部压缩、单TCP连接上的多路复用请求等特性。

2.1、gRPC调用模型

  1. 客户端在程序中调用某方法,发起RPC调用请求。
  2. 对请求信息使用protobuf进行对象序列化压缩。
  3. 服务端接收到请求后,解码请求体,进行业务逻辑处理并返回。
  4. 对响应结果使用protobuf进行对象序列化压缩。
  5. 客户端接收到服务端的响应,解码返回体。

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;
}
  1. 第一行(非空的非注释行)声明使用proto3语法,如果不声明,将默认使用proto2语法,推荐使用v3版本。
  2. 定义名为Test的RPC服务,其包含RPC方法Hello,入参为HelloRequest 消息体(message),出参为 HelloResponse 消息体;
  3. 关键字message定义HelloRequestHelloResponse消息体,每个消息体包含三个属性:类型、字段名、字段编号。除类型以外均不可重复。
  4. 在编写完.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