Protocol Buffers 协议 .proto 文件的编写指南及注意事项

Protocol Buffers(简称protobuf)是Google提供的一种数据序列化协议(轻便高效)

编写 .proto 文件是定义 gRPC 服务和消息结构等的关键步骤。以下是详细指南,包括编写 .proto 文件的基本语法和注意事项。

1. 基本语法

一个 .proto 文件通常包括以下部分:

  1. 语法声明:指定使用的 Protocol Buffers 语法版本。
  2. 包声明:定义包名,用于避免命名冲突。
  3. 消息类型:定义请求和响应的消息结构。
  4. 服务定义:定义 gRPC 服务及其方法。

2. 基本结构

以下是一个简单的 .proto 文件结构:

syntax = "proto3"; // 使用 Protocol Buffers 语法版本 3package example; // 定义包名// 定义请求消息类型
message HelloRequest {string name = 1; // 字段类型 字段名 = 字段编号;
}// 定义响应消息类型
message HelloResponse {string message = 1;
}// 定义 gRPC 服务
service Greeter {rpc SayHello (HelloRequest) returns (HelloResponse); // 方法名 (请求消息类型) 返回 (响应消息类型)
}

3. 字段类型

.proto 文件支持多种基本类型和复杂类型:

  • 基本类型
    • double: 双精度浮点数
    • float: 单精度浮点数
    • int32: 32 位整数
    • int64: 64 位整数
    • uint32: 无符号 32 位整数
    • uint64: 无符号 64 位整数
    • sint32: 有符号 32 位整数
    • sint64: 有符号 64 位整数
    • fixed32: 固定长度 32 位整数
    • fixed64: 固定长度 64 位整数
    • sfixed32: 有符号固定长度 32 位整数
    • sfixed64: 有符号固定长度 64 位整数
    • bool: 布尔值
    • string: 字符串
    • bytes: 字节序列
  • 复杂类型
    • message: 消息类型,用于嵌套结构
    • enum: 枚举类型

4. 字段编号

字段编号用于唯一标识消息中的字段,取值范围是 1 到 2^29-1。避免使用 19000-19999 的编号,因为这些编号在 Protocol Buffers 中被保留用于未来扩展。

5. 示例

以下是一个更复杂的示例,包含嵌套消息和枚举类型:

syntax = "proto3";package example;// 嵌套消息类型
message Address {string street = 1;string city = 2;string state = 3;string zip = 4;
}// 枚举类型
enum PhoneType {MOBILE = 0;HOME = 1;WORK = 2;
}// 嵌套消息类型
message PhoneNumber {string number = 1;PhoneType type = 2;
}// 定义联系人消息类型
message Contact {string name = 1;Address address = 2;repeated PhoneNumber phones = 3; // repeated 表示数组或列表
}// 定义请求消息类型
message GetContactRequest {string id = 1;
}// 定义响应消息类型
message GetContactResponse {Contact contact = 1;
}// 定义 gRPC 服务
service ContactService {rpc GetContact (GetContactRequest) returns (GetContactResponse);
}

6. 注意事项

  1. 字段编号:确保每个字段有唯一的编号,并避免使用保留编号。
  2. 可选和重复字段:默认情况下,字段是可选的。使用 repeated 关键字定义数组或列表。
  3. 命名规范:使用驼峰命名法(camelCase)命名字段,使用帕斯卡命名法(PascalCase)命名消息类型和服务名。
  4. 保持兼容性:如果需要对 .proto 文件进行修改,尽量保持向后兼容。不要修改或删除已有的字段编号,可以添加新的字段编号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/39260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 中的代理

docker 中的代理设置分为两类:docker 使用代理访问网络;docker container 使用代理访问网络。因此要注意区分。 使用代理下载镜像 第一种情况比较适合当下不能直接访问docker官方镜像库的情况。 # 创建配置文件;设置是针对 daemon&#xf…

关于Mysql的InnoDB引擎在长期添加和删除情况下引起的性能问题

场景一: 公司的大数据平台,每天都会从别的节点中同步数据到某个表中,同时这个表要进行大量的删除和添加 问题:在这个表只有2W多条数据的时候,使用一个count(*)语句,数据查询花费了近10秒 原因&#xff1…

idea Git操作

1、代码拉取(左上角) 或 2、代码push(左上角) 3、切换分支(右下角) 4、分支管理 5、当前分支和某一个分支对比差异 6、当前分支某一个提交需要恢复成提交前状态(revert) 7、其他分…

基于Hadoop平台的电信客服数据的处理与分析④项目实现:任务15:数据生产

任务描述 电信数据生产是一个完整且严密的体系,这样可以保证数据的鲁棒性。在本项目的数据生产模块中,我们来模拟生产一些电信数据。同时,我们必须清楚电信数据的格式和数据结构,这样才能在后续的数据产生、存储、分析和展示环节…

泛微开发修炼之旅--30 linux-Ecology服务器运维脚本

文章链接:30 linux-ecology服务器运维脚本

基于debian发行版的AvaotaOS下的dpkg和apt工具使用方法详解

在 Linux 系统中,使用源代码进行软件编译能够实现高度定制化的设置,但对于Linux发行版的用户来说,并不是每个人都具备源代码编译的能力。这一点成为了Linux发行商面临的一个软件管理难题,因为这影响了软件在Linux平台上的发行和推…

【初阶数据结构】深入解析循环队列:探索底层逻辑

🔥引言 本篇将介绍如何实现循环队列并实现过程需要注意的事项,虽然篇幅较小,但是其中逻辑还是值得引人思考的,循环队列可以采用数组或链表实现,这篇将采用数组实现循环队列 🌈个人主页:是店小二…

mdb转gdb实现过程介绍(2)三种方式实现GDB数据库的读、写,并将实现方式与ArcGIS环境共存配置

一、内容提示 通过解析mdb地理数据库,获取了图层之间的组织结构、空间参考、表字段属性等信息。 下一步,就是将数据输出到GDB中。 下面详细介绍python3.9版本,读写GDB数据的方法: (1)使用ArcPy创建GDB、读写…

vant拍摄视频上传以及多张图片上传

数据定义 data() {return {fileList: [],vedioList: [],formData: ,fileTypes: image/png,image/jpeg,image/jpg,image/jpeg,} }, beforeMount() {this.formData new FormData() },拍摄视频上传 <van-uploaderv-if"radio 1"v-model"vedioList"accep…

如何在恶意软件攻击后恢复已删除的照片

您是否尝试访问 PC 上的照片&#xff0c;但无法打开或丢失&#xff1f;您的 PC 可能正面临恶意软件攻击。 通常&#xff0c;当恶意软件进入系统时&#xff0c;它会与硬盘上的文件交互并破坏或感染它们。您的 PC 的防火墙和防病毒程序通常足以从 PC 中删除这些恶意文件。然而&a…

Flutter CTO 2024 报告出炉解读,看看有没有你关心的问题

Flutter CTO 2024 是由 LeanCode 主导进行的一次技术调查报告&#xff0c;本次报告数据来自 70 多个国家的 300 名 CTO、CIO 和技术主管&#xff0c;报告包含了 52 个问题、 7 次人物面对面访谈和 10 多位合作伙伴的协助 。 报告里 85% 的受访者拥有超过 5 年的⼯作经验&#…

redis实用技能

为什么要使用redis及其使用场景 大部分场景是应对高并发高性能场景才会使用,就是访问量已经超过mysql所能承受的,需要做缓存,帮助mysql分流。或者一些复杂查询,mysql执行很慢没法优化,可以做缓存提速(做缓存)做认证服务的时候需要存储用户的session信息,使用redis数据有…

LineageOs-21.0系统编译问题

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【Python】迭代器、生成器、表达式

列表推导式 列表推导式是Python中快速生成列表的一种方法&#xff0c;它允许你使用可迭代对象快速生成一个列表&#xff0c;可以替代简单的循环语句。 基本结构&#xff1a;[expression for item in iterable if condition] expression&#xff1a;基于迭代变量&#xff0c;…

机器学习:预测评估8类指标

机器学习&#xff1a;8类预测评估指标 R方值、平均值绝对误差值MAE、均方误差MSE、均方误差根EMSE、中位数绝对误差MAD、平均绝对百分误差MAPE、可解释方差分EVS、均方根对数误差MLSE。 一、R方值 1、说明&#xff1a; R方值&#xff0c;也称为确定系数或拟合优度&#xff…

多语言模型(Multilingual Models)用于推理(Inference)

在深入探讨多语言模型&#xff08;Multilingual Models&#xff09;用于推理&#xff08;Inference&#xff09;的详细内容时&#xff0c;我们需要首先理解多语言模型的基本概念、它们如何工作、为什么它们在现代自然语言处理&#xff08;NLP&#xff09;中变得如此重要&#x…

excel PivotTable 透视表

开发数据导出excel功能&#xff0c;设置导出透视表 数据源&#xff1a; 透视表&#xff1a; 使用插件EPPlus 数据源&#xff1a; IF OBJECT_ID(tempdb..#temptable) IS NOT NULLDROP TABLE #temptable; CREATE TABLE #temptable ( [PROJECT] varchar(50), [PRODUCT_CODE] var…

springboot双学位招生管理系统-计算机毕业设计源码93054

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

ruoyi-cloud登录接口实现滑块验证码

一、前言 ruoyi项目默认的验证码是这样的 今天来尝试增加滑块验证码&#xff0c;我们用到的是tianai-captcha。 文档地址&#xff1a;http://doc.captcha.tianai.cloud/ 源码地址&#xff1a;https://gitee.com/tianai/tianai-captcha 下面来看具体的步骤。 二、后端 在g…

从游戏到营销:抽卡机小程序的多维度应用探索

在数字化时代&#xff0c;小程序作为一种轻量级、即用即走的应用形态&#xff0c;正逐步渗透到人们生活的方方面面。其中&#xff0c;抽卡机小程序以其独特的趣味性和互动性&#xff0c;不仅在游戏领域大放异彩&#xff0c;更在营销领域展现出广阔的应用前景。本文将从游戏起源…