ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

grpc protobuf协议

2021-09-12 07:00:23  阅读:183  来源: 互联网

标签:协议 protobuf package grpc proto RPC 消息 HelloRequest 客户端


grpc protobuf协议

Protocol Buffers 是一个与编程语言无关、与平台无关的可拓展机制,用于序列化结构数据,是一种数据交换格式。

message 定义

message Person {
  string name = 1;
  int32 id = 2;
  bool has_ponycopter = 3;
}

  

数据类型:

double、float、int32、int64、bool、string、bytes、枚举。

三种规则:

  • required:格式正确的消息必须恰好具有此字段之一,即必填字段。
  • optional:格式正确的消息可以包含零个或一个此字段(但不能超过一个,即值是可选的。
  • repeated:在格式正确的消息中,此字段可以重复任意次(包括零次),重复值的顺序将保留,表示该字段可以包含0~N个元素。

由于历史原因,repeated标量数字类型的字段编码效率不高。新代码应使用特殊选项[packed=true]来获得更有效的编码。例如:

repeated int32 samples = 4 [packed=true];

在可选字段中 optional 中,我们可以为其设置一个默认值,当传递消息时如果没有填写此字段,则使用其默认值:

optional int32 result_per_page = 3 [default = 10];
syntax = "proto3";
package tutorial;

import "google/protobuf/timestamp.proto";

  

syntax 指明协议的版本;

package 指明该 .proto 的名称;

import 关键字可以在当前 .proto 中引入其它 .proto 文件,gRPC 基本数据类型中不包含时间格式,可以引入 timestamp.proto


为了兼容各种编程语言,我们协议设置 _package,这样可以支持生成不同语言代码时设置包/库名称。
option go_package = "Test";					// ...
option csharp_package = "MyGrpc.Protos";	// 生成命名空间 namespace MyGrpc.Protos{}
option java_paclage = "MyJava.Protos";		// ...

 protobuf 中除了可以定义 message,也可以定义流式接口

一元 RPC,客户端向服务器发送单个请求并获得单个响应,就像普通的函数调用一样。

rpc SayHello(HelloRequest) returns (HelloResponse);

服务器流式RPC,客户端在其中向服务器发送请求,并获取流以读取回一系列消息。客户端从返回的流中读取,直到没有更多消息为止。gRPC保证在单个RPC调用中对消息进行排序。

客户端 -> 服务端 -> 返回流 -> 客户端 -> 接收流

rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);

客户端流式RPC,客户端在其中编写消息序列,然后再次使用提供的流将其发送到服务器。客户端写完消息后,它将等待服务器读取消息并返回其响应。gRPC再次保证了在单个RPC调用中的消息顺序。

客户端 -> 发送流 -> 服务端 -> 接收流 ->

rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
双向流式RPC,双方都使用读写流发送一系列消息。这两个流独立运行,因此客户端和服务器可以按照自己喜欢的顺序进行读写:例如,服务器可以在写响应之前等待接收所有客户端消息,或者可以先读取消息再写入消息,或读写的其他组合。每个流中的消息顺序都会保留。
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);

标签:协议,protobuf,package,grpc,proto,RPC,消息,HelloRequest,客户端
来源: https://www.cnblogs.com/hnxxcxg/p/15257314.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有