protobuf的复杂结构

简介: protobuf的复杂结构

前言

在写proto文件的时候,想要百度一下都有哪些内容,但是找到的都是那个经典的官方样例,互相之间抄来抄去,所以这里干脆把git上的相关源码,和实际使用经历结合总结下来,给一潭死水里注入一点活力吧。

常用关键字

1. syntax:指定proto文件使用的语法版本。
2. package:指定生成的代码所在的包名。
3. import:导入其他proto文件。
4. option:设置特定的选项。
5. message:定义消息类型。
6. enum:定义枚举类型。
7. service:定义服务接口。
8. rpc:定义远程过程调用方法。
9. oneof:定义互斥字段,只能选择其中一个字段。
10. map:定义映射类型,类似于字典。
11. repeated:定义重复字段,可以有多个值。
12. required:定义必需字段,必须有值。
13. optional:定义可选字段,可以有值也可以为空。
14. extensions:定义扩展字段。
15. extend:扩展已有的消息类型或枚举类型。

每个关键字的使用示例

  1. syntax:
syntax = "proto3";
  1. package:
package mypackage;
  1. import:
import "google/protobuf/timestamp.proto";
  1. option:
option java_package = "com.example.mypackage";
  1. message:
message Person {
  string name = 1;
  int32 age = 2;
  repeated string phone_numbers = 3;
}
  1. enum:
enum PhoneType {
  MOBILE = 0;
  HOME = 1;
  WORK = 2;
}
  1. service:
service MyService {
  rpc GetData (GetDataRequest) returns (GetDataResponse);
}
  1. rpc:
rpc GetData (GetDataRequest) returns (GetDataResponse);
  1. oneof:
message Person {
  string name = 1;
  oneof phone_number {
    string mobile = 2;
    string home = 3;
    string work = 4;
  }
}


  1. map:
message Person {
  string name = 1;
  map<string, string> phone_numbers = 2;
}
  1. repeated:
message Person {
  string name = 1;
  repeated string phone_numbers = 2;
}
  1. required:
required:
  1. optional:
message Person {
  optional string name = 1;
  optional int32 age = 2;
}
  1. extensions:
extend Person {
  extensions 100 to 199;
  optional string email_address = 100;
}
  1. extend:
extend google.protobuf.Timestamp {
  optional string timezone = 1000;
}

复杂结构

下面是一些示例,展示了proto文件中的嵌套、数组和以结构体为值的映射的用法:

  1. 嵌套示例:
syntax = "proto3";

message Address {
  string street = 1;
  string city = 2;
  string state = 3;
}

message Person {
  string name = 1;
  int32 age = 2;
  Address address = 3;
}

在上面的示例中,Address是一个嵌套在Person中的消息类型。

  1. 数组示例:
syntax = "proto3";

message Person {
  string name = 1;
  repeated string phone_numbers = 2;
}

在上面的示例中,phone_numbers字段是一个字符串数组。

  1. 以结构体为值的映射示例:
syntax = "proto3";

message Person {
  string name = 1;
  map<string, Address> addresses = 2;
}

message Address {
  string street = 1;
  string city = 2;
  string state = 3;
}

在上面的示例中,addresses字段是一个以字符串为键、Address结构体为值的映射。

  1. 自定义枚举值:
syntax = "proto3";

enum PhoneType {
  MOBILE = 0;
  HOME = 1;
  WORK = 2;
  CUSTOM = 3;
}

在上面的示例中,我们定义了一个自定义的枚举值CUSTOM。

  1. 扩展字段:
syntax = "proto3";

message Person {
  string name = 1;
  extensions 100 to 199;
}

extend Person {
  optional string email = 100;
}

在上面的示例中,我们使用extend关键字扩展了Person消息类型,添加了一个可选的email字段。

  1. 服务定义和RPC方法:
syntax = "proto3";

service MyService {
  rpc GetData (GetDataRequest) returns (GetDataResponse);
  rpc UpdateData (UpdateDataRequest) returns (UpdateDataResponse);
}

message GetDataRequest {
  string id = 1;
}

message GetDataResponse {
  string data = 1;
}

message UpdateDataRequest {
  string id = 1;
  string newData = 2;
}

message UpdateDataResponse {
  bool success = 1;
}

上面的示例中,我们定义了一个名为MyService的服务,其中包含了两个RPC方法:GetData和UpdateData。每个RPC方法都有对应的请求消息和响应消息。


分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za



目录
相关文章
|
3月前
|
监控 前端开发 数据可视化
Github 12.3kstar, 3分钟起步做中后台?Go+Vue 脚手架,把权限、代码生成、RBAC 都封装好了
Go-admin 是基于 Gin + Vue 的中后台脚手架,集成 Casbin RBAC 权限、JWT 鉴权、GORM 数据库操作与 Swagger 文档,内置用户、角色、菜单等管理模块。提供代码生成器与表单构建器,支持多租户与多前端框架(Element UI/Arco/Ant Design),3 分钟快速搭建企业级后台,助力高效交付。
254 4
|
测试技术 计算机视觉 Python
使用 PyAutoGUI 进行屏幕截图并裁剪图片
PyAutoGUI 是一个用于自动化鼠标和键盘操作的 Python 库,支持屏幕截图。结合 Pillow 库,可以实现屏幕截图的裁剪。本文介绍如何使用这两个库截取屏幕区域并裁剪图像,包括安装库、截取屏幕、保存图片、裁剪图片的完整示例代码。
818 2
|
机器学习/深度学习 数据采集 人工智能
智能化运维:AI在IT运维中的应用探索###
随着信息技术的飞速发展,传统的IT运维模式正面临着前所未有的挑战。本文旨在探讨人工智能(AI)技术如何赋能IT运维,通过智能化手段提升运维效率、降低故障率,并为企业带来更加稳定高效的服务体验。我们将从AI运维的概念入手,深入分析其在故障预测、异常检测、自动化处理等方面的应用实践,以及面临的挑战与未来发展趋势。 ###
|
安全 Nacos 数据库
探索 Nacos反序列化漏洞CNVD-2023-45001
Nacos 2.1.0版本遭遇高危反序列化漏洞(CNVD-2023-45001),允许攻击者通过7848端口执行远程代码。影响1.4.0至1.4.6及2.0.0至2.2.3版本。建议用户升级至2.2.3,下载链接:https://github.com/alibaba/nacos/releases/tag/2.2.3。升级过程平滑,数据库无须调整,仅需按文档(https://nacos.io/zh-cn/docs/v2/guide/user/auth.html)配置鉴权。重视安全修复,确保系统安全。
1325 7
 探索 Nacos反序列化漏洞CNVD-2023-45001
|
Nacos 数据中心 Docker
Docker 部署 Nacos 集群
Docker 部署 Nacos 集群
|
XML 安全 Java
【分布式技术专题】「单点登录技术架构」一文带领你好好对接对应的Okta单点登录实现接口服务的实现落地
【分布式技术专题】「单点登录技术架构」一文带领你好好对接对应的Okta单点登录实现接口服务的实现落地
856 0
|
人工智能 开发框架 JavaScript
SpringCloud微服务实战——搭建企业级开发框架(三十一):自定义MybatisPlus代码生成器实现前后端代码自动生成
理想的情况下,代码生成可以节省很多重复且没有技术含量的工作量,并且代码生成可以按照统一的代码规范和格式来生成代码,给日常的代码开发提供很大的帮助。但是,代码生成也有其局限性,当牵涉到复杂的业务逻辑时,简单的代码生成功能无法解决。   目前市面上的代码生成器层出不穷,大多数的原理是基于已有的代码逻辑模板,按照一定的规则来生成CRUD代码。至于更为复杂的代码生成大家都在人工智能领域探索
1292 55
SpringCloud微服务实战——搭建企业级开发框架(三十一):自定义MybatisPlus代码生成器实现前后端代码自动生成
|
存储 缓存 Prometheus
技术阅读摘要 - 2.OpenTelemetry技术概览
本系列的第二讲,我原先计划聊一下OpenTracing这个技术,但计划赶不上变化,我发现OpenTracing的官网上已经声明:这部分的技术将迁移到OpenTelemetry。
501 0