当前位置: 首页 > article >正文

【C/C++】入门grpc的idl

文章目录

  • grpc idl 简单介绍
    • 1. 文件结构组织规范
      • 文件命名
      • 包结构:
      • 推荐:一个文件只定义一个 service,如果 service 很复杂,可拆分多个 proto 文件。
    • 2. 消息定义规范
      • 命名风格
      • 字段编号:
      • 示例:
    • 3. 服务与 RPC 设计规范
      • 命名规范
      • 请求和响应推荐
      • 示例
    • 4. 枚举与默认值
    • 5. 可扩展性设计建议
    • 6. 错误处理推荐(跨语言)
    • 7. 注释和文档生成
    • 8. gRPC REST 网关支持(可选)
    • 9. 通用封装结构推荐(可选)
    • 10. 目录结构推荐(大型项目)
    • 总结:Checklist(编码规范)

grpc idl 简单介绍

在 gRPC 中,IDL(接口定义语言)是通过 Protocol Buffers(.proto 文件) 来定义的。为了保证你的 gRPC 接口具有清晰、可维护、可扩展、跨语言兼容等特性,编写 .proto 文件时应遵循一系列编码规范和最佳实践。

下面是 gRPC/Protobuf .proto 文件的编码指导,包括命名规范、结构组织、字段使用建议、版本控制等:


1. 文件结构组织规范

文件命名

  • 使用 小写 + 下划线 命名:如 user_service.proto
  • 文件名应能体现模块或服务名称。

包结构:

syntax = "proto3";package myapp.user;  // 多层命名空间,避免冲突option go_package = "github.com/yourorg/yourproject/gen/userpb";  // Go 等语言需要指定导入路径

推荐:一个文件只定义一个 service,如果 service 很复杂,可拆分多个 proto 文件。


2. 消息定义规范

命名风格

  • 消息/服务/枚举使用 PascalCase:如 UserRequestUserResponseUserService
  • 字段使用 snake_case:如 user_idemail_address

字段编号:

  • 使用 1 ~ 15 编号范围保留给高频使用字段(性能更高)。
  • 不要修改已发布字段的编号。

示例:

message UserRequest {int64 user_id = 1;string email = 2;
}

3. 服务与 RPC 设计规范

命名规范

  • Service 命名应体现业务领域,如 UserServiceAuthService
  • 方法名使用 PascalCase,如 GetUserCreateUser

请求和响应推荐

  • 请求消息以 XxxRequest 结尾,响应以 XxxResponse 结尾。

示例

service UserService {rpc GetUser (UserRequest) returns (UserResponse);rpc CreateUser (CreateUserRequest) returns (CreateUserResponse);
}

4. 枚举与默认值

  • 枚举的第一个值必须为 0,通常命名为 ENUM_UNSPECIFIEDUNKNOWN
  • 避免使用 magic numbers。
enum UserStatus {USER_STATUS_UNSPECIFIED = 0;USER_ACTIVE = 1;USER_INACTIVE = 2;
}

5. 可扩展性设计建议

  • 不要删除字段编号,即使字段废弃了,也应保留编号(可加注释标记 deprecated)。
  • 留空编号以备将来使用。
  • 使用 reserved 关键字保留字段名或编号,防止冲突:
message User {reserved 3, 4;          // 保留编号reserved "old_field";   // 保留字段名
}

6. 错误处理推荐(跨语言)

gRPC 使用 Status 返回错误,建议定义自定义错误码:

import "google/rpc/status.proto";
import "google/rpc/code.proto";service AuthService {rpc Login(LoginRequest) returns (LoginResponse) {option (google.api.http) = {post: "/v1/login"body: "*"};}
}

建议返回 google.rpc.Status 作为 error detail,方便统一错误处理。


7. 注释和文档生成

  • 使用 /// ... */ 注释消息、字段、方法,支持 protoc-gen-doc 等工具自动生成文档。
  • 注释写清楚单位、约束、默认值、特殊说明。
// 用户注册请求
message RegisterRequest {// 用户邮箱地址(必须为合法格式)string email = 1;
}

8. gRPC REST 网关支持(可选)

如你使用 gRPC Gateway(用于提供 REST 接口),应加上 google.api.http 的 option:

import "google/api/annotations.proto";service UserService {rpc GetUser (GetUserRequest) returns (User) {option (google.api.http) = {get: "/v1/users/{user_id}"};}
}

9. 通用封装结构推荐(可选)

定义通用结构,便于扩展或统一返回格式:

message BaseResponse {int32 code = 1;string message = 2;
}message PageRequest {int32 page = 1;int32 size = 2;
}message PageResponse {int32 total = 1;
}

10. 目录结构推荐(大型项目)

proto/
├── user/
│   ├── user.proto
│   └── user_service.proto
├── common/
│   ├── error.proto
│   ├── pagination.proto

总结:Checklist(编码规范)

类别规范建议
命名PascalCase(类型),snake_case(字段)
字段编号不重用,保留废弃编号
扩展性使用 reserved,保留字段空间
服务设计明确语义,方法命名动词开头
注释字段、消息、方法写清楚注释
错误处理建议接入 google.rpc.Status
REST 支持使用 google.api.http 注解
通用结构可封装统一响应、分页等结构

相关文章:

【C/C++】入门grpc的idl

文章目录 grpc idl 简单介绍1. 文件结构组织规范文件命名包结构:推荐:一个文件只定义一个 service,如果 service 很复杂,可拆分多个 proto 文件。 2. 消息定义规范命名风格字段编号:示例: 3. 服务与 RPC 设…...

【Java实用工具类】手撸SqlBuilder工具类,优雅拼接动态SQL,MyBatisPlus同款风格!

📌 正文: 有时候我们项目底层是 JdbcTemplate 查询,没法像 MyBatisPlus 一样用 Wrapper 拼接条件,但我们又不想手撸字符串。那怎么办?我今天就给你整了个 SqlBuilder 工具类,支持 eq、ne、like、in、gt、l…...

宇树科技更名“股份有限公司”深度解析:机器人企业IPO前奏与资本化路径

从技术落地到资本跃迁,拆解股改背后的上市逻辑与行业启示 核心事件:股改释放的上市信号 2025年5月28日,杭州宇树科技有限公司正式更名“杭州宇树科技股份有限公司”,市场主体类型变更为“股份有限公司”。尽管官方称为常规运营调…...

Inno Setup 安装向导各个页面详解

概览 表中描述了使用Inno Setup生成的安装包在安装过程中各个页面的字段和对应的说明信息。后文会对各个页面的参数做进一步解释说明。 字段说明wpWelcome欢迎页wpLicense许可协议wpPassword密码wpInfoBefore信息wpUserInfo用户信息wpSelectDir选择目标位置wpSelectComponent…...

转战web3远程工作的英语学习的路线规划

目录 一、明确学习目标与定位 二、基础阶段(0 - 6个月) (一)词汇积累 (二)语法学习 (三)听力与口语 三、进阶阶段(6 - 18个月) (一&#xf…...

OPENCV重点结构体Mat的讲解

一、Opencv的作用 OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C 类构成,同时提供了Pytho…...

Java 创建线程池的几种方式

在 Java 中创建线程池主要通过 java.util.concurrent 包下的 ExecutorService 接口及其实现类。以下是创建线程池的几种常见方式: ✅ 1. 使用 Executors 工具类(最简单) ExecutorService executor Executors.newFixedThreadPool(10);常用方…...

【趣味Html】第11课:动态闪烁发光粒子五角星

打造炫酷的动态闪烁发光粒子五角星效果 前言 在现代Web开发中,视觉效果的重要性不言而喻。今天我们将深入探讨如何使用HTML5 Canvas和JavaScript创建一个令人惊艳的动态闪烁发光粒子五角星效果。这个项目不仅展示了Canvas的强大功能,还涉及了粒子系统、…...

AnyIO Event:异步编程中的同步利器

在异步编程的世界里,任务之间的通信和协调是一个常见的需求。AnyIO 提供的 Event 类,为这一需求提供了一个强大而简洁的解决方案。本文将深入探讨 anyio.Event 的使用方法、特点以及在实际应用中的最佳实践。 一、AnyIO Event 概述 anyio.Event 是 Any…...

CFTel:一种基于云雾自动化的鲁棒且可扩展的远程机器人架构

中文标题: CFTel:一种基于云雾自动化的鲁棒且可扩展的远程机器人架构 英文标题: CFTel: A Practical Architecture for Robust and Scalable Telerobotics with Cloud-Fog Automation 作者信息 Thien Tran, Jonathan Kua, Minh Tran, Hongh…...

Educational Codeforces Round 179 (Rated for Div. 2)

CF2111,简单手速场 A. Energy Crystals 贪心&#xff0c;每次最小值会乘2&#xff0c;直接模拟即可&#xff0c;复杂度 O ( log ⁡ n ) O(\log n) O(logn) void solve(){int x;cin>>x;multiset<int> s{0,0,0};int res0;while(*s.begin()<x){int x*s.begin();s…...

完成一个可交互的k8s管理平台的页面开发

使用deepseek完成设计一个k8s管理平台&#xff0c;关键词如下&#xff1a; 完成一个可交互的k8s管理平台的页面开发Kubernetes 管理平台页面设计 下面是一个基于现代Web技术的可交互Kubernetes管理平台的页面设计方案&#xff0c;使用React作为前端框架&#xff0c;配合Ant De…...

多线程编程技术解析及示例:pthread_cond_timedwait、pthread_mutex_lock 和 pthread_mutex_trylock

多线程编程技术解析及示例&#xff1a;pthread_cond_timedwait、pthread_mutex_lock 和 pthread_mutex_trylock 摘要 本文深入解析了多线程编程中 pthread_cond_timedwait、pthread_mutex_lock 和 pthread_mutex_trylock 三个函数的功能、使用场景及注意事项&#xff0c;并通…...

vue实现点击单选或者多选模式

toggleSelect(item) { if (!this.single) { // 多选模式 const itemIndex this.selectedItems.findIndex( (selectedItem) > selectedItem.userId item.userId ); // 假设每个对象都有一个唯一的id属性 if (itemIndex ! -1) { this.selectedItems.splice(itemIndex, 1); }…...

Windows系统工具:WinToolsPlus 之 SQL Server 日志清理

使用软件时提示数据库事务日志已满&#xff0c; 使用WinToolsPlus 数据库页签 先设置 数据源 &#xff0c; 选择 需要清理日志的数据库&#xff0c; 点击 数据库日志清理 即可。 下载地址&#xff1a; http://v.s3.sh.cn/archives/2279.html...

在Windows11上安装 Ubuntu WSL

不想安装虚拟机,想在Windows11上运行Linux。网上虽有教程,但是图片明显都是老图,与Windows11还是有些差异。网上缺乏一个齐全的真正的Windows11运行Linux的教程。 一、在Windows上的设置 1. 在window11的搜索框内(所有你找不到的应用都可以用这个搜索功能)&#xff0c;搜索&q…...

嵌入式Linux之RK3568

系统烧写镜像。 1、直接使用正点原子官方的updata.img(MIDP) 进入瑞芯微发开工具RKDevTool&#xff0c;选择升级固件&#xff0c;上传到固件&#xff0c;记住这里要进入maskrom模式或者是loader模式&#xff0c;进入该模式之后点击升级即可。 2、烧入自己制作的镜像(单独、一…...

Elasticsearch的插件(Plugin)系统介绍

Elasticsearch的插件(Plugin)系统是一种扩展机制,允许用户通过添加自定义功能来增强默认功能,而无需修改核心代码。插件可以提供从分析器、存储后端到安全认证、机器学习等各种功能,使Elasticsearch能够灵活适应不同的应用场景和业务需求。 一、插件的核心特点 模块化扩展…...

提取 PDF 文件中的文字以及图片中的文字

Adobe 提供了多种方案可以快速提取 PDF 文件中的文字以及图片中的文字&#xff0c;主要依赖其 Acrobat 系列产品和 OCR&#xff08;光学字符识别&#xff09;技术。以下是具体解决方案的概述&#xff0c;涵盖了文字和图片文字的提取方法&#xff1a; 1. 提取 PDF 中的文字 如果…...

JavaScript性能优化实战技术

目录 性能优化核心原则 代码层面优化 加载优化策略 内存管理实践 及时解除事件监听 避免内存泄漏模式 渲染性能调优 使用requestAnimationFrame优化动画 批量DOM操作减少回流 性能监控工具 现代API应用 缓存策略实施 性能优化核心原则 减少资源加载时间 避免阻塞主…...

LeetCode 热题 100 739. 每日温度

LeetCode 热题 100 | 739. 每日温度 大家好&#xff0c;今天我们来解决一道经典的算法题——每日温度。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求我们找到一个数组&#xff0c;其中每个元素表示从当前天开始&#xff0c;下一个更高温度出现的天数。如果之后没有更…...

网页前端开发(基础进阶3--Vue)

Vue3 Vue是一款用于构建用户界面的渐进式的JavaScript框架。 Vue由2部分组成&#xff1a;Vue核心包&#xff0c;Vue插件包 Vue核心包包含&#xff1a;声明式渲染&#xff0c;组件系统。 Vue插件包&#xff1a;VueRouter&#xff08;客户端路由&#xff09;&#xff0c;Vuex…...

tryhackme——Abusing Windows Internals(进程注入)

文章目录 一、Abusing Processes二、进程镂空三、线程劫持四、DLL注入五、Memory Execution Alternatives 一、Abusing Processes 操作系统上运行的应用程序可以包含一个或多个进程&#xff0c;进程表示正在执行的程序。进程包含许多其他子组件&#xff0c;并且直接与内存或虚…...

【游戏科学】游戏开发中数学算法的核心与应用

一、游戏科学&#xff08;Game Science&#xff09; 涉及大量数学算法和模型&#xff0c;用于实现物理模拟、图形渲染、人工智能、路径规划、碰撞检测等核心功能。 1.1、图形渲染与几何计算 1. 三维变换&#xff08;3D Transformations&#xff09; 矩阵变换&#xff1a; 模…...

【Day44】

DAY 44 预训练模型 知识点回顾&#xff1a; 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战&#xff1a;resnet18 作业&#xff1a; 尝试在cifar10对比如下其他的预训练模型&#xff0c;观察差异&#xff0c;尽可能和他人选择的不同尝试通…...

基于 Alpine 定制单功能用途(kiosk)电脑

前言 故事回到 7 年前, 在网上冲浪的时候发现了一篇介绍使用 Ubuntu 打造 kiosk 单功能用途电脑的文章, 挺好玩的, 就翻译了一下并比葫芦画瓢先后用了 CentOS 7, ArchLinux 进行了实现. 历史文章: 翻译 - 使用Ubutnu14.04和Chrome打造单功能用途电脑(大屏展示电脑) 使用CentOS…...

知识图谱系统功能实现,技术解决方案,附源码

基于Java、Neo4j和ElasticSearch构建的医疗知识图谱知识库&#xff0c;是一个融合图数据库技术与搜索引擎的智能化医疗知识管理系统。该系统以Neo4j图数据库为核心&#xff0c;利用其高效的图结构存储能力&#xff0c;将疾病、症状、药品、检查项目、科室等医疗实体抽象为节点&…...

第12节 Node.js 函数

在JavaScript中&#xff0c;一个函数可以作为另一个函数接收一个参数。我们可以先定义一个函数&#xff0c;然后传递&#xff0c;也可以在传递参数的地方直接定义函数。 Node.js中函数的使用与Javascript类似&#xff0c;举例来说&#xff0c;你可以这样做&#xff1a; funct…...

洛谷P12610 ——[CCC 2025 Junior] Donut Shop

题目背景 Score: 15. 题目描述 The owner of a donut shop spends the day baking and selling donuts. Given the events that happen over the course of the day, your job is to determine the number of donuts remaining when the shop closes. 输入格式 The first …...

1. 数据库基础

1.1 什么是数据库 ⭐ mysql 本质是一种网络服务, 是基于 C(mysql) S(mysqld)的 网络服务. 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库&#xff1f;文件保存数据存在以下缺点&#xff1a; 文件的安全性问题。文件不利于数据查询和管理。文件不利于存储海量数据。…...