grpc protobuf协议
grpc protobuf协议
Protocol Buffers 是一个与编程语言无关、与平台无关的可拓展机制,用于序列化结构数据,是一种数据交换格式。
message 定义
1 2 3 4 5 | 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]
来获得更有效的编码。例如:
1 | repeated int32 samples = 4 [packed=true]; |
在可选字段中 optional 中,我们可以为其设置一个默认值,当传递消息时如果没有填写此字段,则使用其默认值:
1 | optional int32 result_per_page = 3 [default = 10]; |
1 2 3 4 | syntax = "proto3" ; package tutorial; import "google/protobuf/timestamp.proto" ; |
syntax 指明协议的版本;
package 指明该 .proto 的名称;
import 关键字可以在当前 .proto 中引入其它 .proto 文件,gRPC 基本数据类型中不包含时间格式,可以引入 timestamp.proto
。
1 | < br >为了兼容各种编程语言,我们协议设置 < code class="highlighter-hljs hljs language-undefined">_package</ code >,这样可以支持生成不同语言代码时设置包/库名称。 |
1 2 3 | option go_package = "Test" ; // ... option csharp_package = "MyGrpc.Protos" ; // 生成命名空间 namespace MyGrpc.Protos{} option java_paclage = "MyJava.Protos" ; // ... |
protobuf 中除了可以定义 message,也可以定义流式接口
一元 RPC,客户端向服务器发送单个请求并获得单个响应,就像普通的函数调用一样。
1 | rpc SayHello(HelloRequest) returns (HelloResponse); |
服务器流式RPC,客户端在其中向服务器发送请求,并获取流以读取回一系列消息。客户端从返回的流中读取,直到没有更多消息为止。gRPC保证在单个RPC调用中对消息进行排序。
客户端 -> 服务端 -> 返回流 -> 客户端 -> 接收流
1 | rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse); |
客户端流式RPC,客户端在其中编写消息序列,然后再次使用提供的流将其发送到服务器。客户端写完消息后,它将等待服务器读取消息并返回其响应。gRPC再次保证了在单个RPC调用中的消息顺序。
客户端 -> 发送流 -> 服务端 -> 接收流 ->
1 | rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);< br >< strong >双向流式RPC</ strong >,双方都使用读写流发送一系列消息。这两个流独立运行,因此客户端和服务器可以按照自己喜欢的顺序进行读写:例如,服务器可以在写响应之前等待接收所有客户端消息,或者可以先读取消息再写入消息,或读写的其他组合。每个流中的消息顺序都会保留。 |
1 | rpc BidiHello(stream HelloRequest) returns (stream HelloResponse); |
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/15257314.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-09-12 firedac获取自增长字段值
2018-09-12 msgpack配合FIREDAC传输多表数据
2018-09-12 msgpack传文件
2016-09-12 处理任务队列的工作线程的创建
2016-09-12 IOCP实现的任务队列
2016-09-12 TList实现的任务队列
2014-09-12 FIREDAC直连ORACLE数据库