【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 注解
通用結構可封裝統一響應、分頁等結構

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908127.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908127.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908127.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安全-JAVA開發-第二天

Web資源訪問的流程 由此可見 客戶訪問JAVA開發的應用時 會先通過 監聽器(Listener)和 過濾器(Filter) 今天簡單的了解下這兩個模塊的開發過程 監聽器(Listener) 主要是監聽 我們觸發了什么行為 并進行反應…

使用 Ansys Q3D 進行電容提取

精確的電容提取在高速和 RF 設計中至關重要。雖然簡單的公式可以提供一個很好的起點,但它們往往無法捕捉 fringing fields 和 layout-dependent parasitics 的影響。在本博客中,我們演示了如何使用Ansys Q3D Extractor來計算電容值,從基本的平…

卡西歐模擬器:Windows端功能強大的計算器

引言 大家還記得初中高中時期用的計算器嗎?今天給大家分享的就是一款windows端的卡西歐計算器。 軟件介紹 大家好,我是逍遙小歡。 CASIO fx-9860G是一款功能強大的圖形計算器,適用于數學、科學和工程計算。以下是其主要功能和特點的詳細介…

【Bluedroid】藍牙啟動之gatt_init 流程源碼解析

本文圍繞Android藍牙協議棧中 GATT(通用屬性配置文件)模塊的初始化函數gatt_init展開,深入解析其核心實現邏輯與關鍵步驟。通過分析gatt_init及其關聯子函數(如L2CA_RegisterFixedChannel、gatt_profile_db_init、EattExtension::Start等),以及相關數據結構(如tGATT_CB控…

Vue 3 中ref 結合ts 獲取 DOM 元素的實踐指南。

文章目錄 前言一、為什么需要為 ref 添加類型&#xff1f;二、基本用法&#xff1a;引用 DOM 元素1. 引用通用 DOM 元素&#xff08;HTMLElement&#xff09;2. 引用特定類型的 DOM 元素&#xff08;如 HTMLDivElement&#xff09; 三、<script setup> 語法中的類型定義四…

Axure形狀類組件圖標庫(共8套)

點擊下載《月下倚樓圖標庫(形狀組件)》 原型效果&#xff1a;https://axhub.im/ax9/02043f78e1b4386f/#g1 摘要 本圖標庫集錦精心匯集了8套專為Axure設計的形狀類圖標資源&#xff0c;旨在為產品經理、UI/UX設計師以及開發人員提供豐富多樣的設計素材&#xff0c;提升原型設計…

01串(二進制串)與集合之間存在天然的對應關系 ← bitset

【集合的二進制表示?】 ● 01 串&#xff08;二進制串&#xff09;與集合之間存在天然的對應關系。對應機理為每個二進制位可以表示集合中一個元素的存在&#xff08;1&#xff09;或不存在&#xff08;0&#xff09;。例如&#xff0c;集合 {a, b, c} 的子集 {a, c} 可以表示…

vba學習系列(10)--外觀報表

系列文章目錄 文章目錄 系列文章目錄前言一、外觀報表1.產能統計2.單板數3.固定傷排查4.件號良率5.鏡片批退率6.鏡筒批退率 總結 前言 一、外觀報表 1.產能統計 Sub ProcessInspectionData()Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As WorksheetDim lastRow1 As Long, …

machine_env_loader must have been assigned before creating ssh child instance

在主機上執行roslaunch命令時&#xff0c;報錯&#xff1a;machine_env_loader must have been assigned before creating ssh child instance。 解決辦法&#xff1a; 打開hostos文件&#xff0c;檢查local host 前的內部ip是否正常。操作示例&#xff1a; 先輸入下方指令打…

CSS radial-gradient函數詳解

目錄 基本語法 關鍵參數詳解 1. 漸變形狀&#xff08;Shape&#xff09; 2. 漸變大小&#xff08;Size&#xff09; 3. 中心點位置&#xff08;Position&#xff09; 4. 顏色斷點&#xff08;Color Stops&#xff09; 常見應用場景 1. 基本圓形漸變 2. 橢圓漸變 3. 模…

分析Web3下數據保護的創新模式

在這個信息爆炸的時代&#xff0c;我們正站在 Web3 的門檻上&#xff0c;迎接一個以去中心化、用戶主權和數據隱私為核心的新時代。Web3 不僅僅是技術的迭代&#xff0c;它更是一場關于數據權利和責任的結構性變革。本文將探討 Web3 下數據保護的創新模式&#xff0c;以期為用戶…

RabbitMQ-Go 性能分析

更多個人筆記見&#xff1a; &#xff08;注意點擊“繼續”&#xff0c;而不是“發現新項目”&#xff09; github個人筆記倉庫 https://github.com/ZHLOVEYY/IT_note gitee 個人筆記倉庫 https://gitee.com/harryhack/it_note 個人學習&#xff0c;學習過程中還會不斷補充&…

AI助力Java開發:減少70%重復編碼,實戰效能提升解析

工具再先進&#xff0c;也替代不了編程思維的深度錘煉 在Java開發領域&#xff0c;重復編碼如同無形的生產力黑洞——以商品管理模塊開發為例&#xff0c;開發者耗費大量時間編寫SQL查詢、處理結果集轉換&#xff1b;用戶系統里&#xff0c;密碼加密和狀態管理的代碼在不同項目…

JS語法筆記

目錄 JS數組Array新建數組一維數組二維數組 reverse()在數組末尾插入&#xff1a;push()在數組末尾刪除&#xff1a;pop()在數組開頭插入&#xff1a;unshift()從數組開頭刪除一個元素shift()splice() MapSet JS數組Array 判斷數組相等不能用&#xff0c;要循環判斷 新建數組…

uniapp-商城-77-shop(8.2-商品列表,地址信息添加,級聯選擇器picker)

地址信息,在我們支付訂單上有這樣一個接口,就是物流方式,一個自提,我們就顯示商家地址。一個是外送,就是用戶自己填寫的地址。 這里先說說用戶的地址添加。需要使用到的一些方式方法,主要有關于地址選擇器,就是uni-data-picker級聯選擇。 該文介紹了電商應用中地址信息處…

網頁前端開發(基礎進階3--Vue)

Vue3 Vue是一款用于構建用戶界面的漸進式的JavaScript框架。 Vue由2部分組成&#xff1a;Vue核心包&#xff0c;Vue插件包 Vue核心包包含&#xff1a;聲明式渲染&#xff0c;組件系統。 Vue插件包&#xff1a;VueRouter&#xff08;客戶端路由&#xff09;&#xff0c;Vuex…

大模型相關技術綜述

多模態大模型&大模型訓練語料持續迭代 已經開始整理多模態-視覺部分&#xff1a; 主要分為一下幾塊 多模態信息壓縮模型&#xff08;clip、vit、swiT&#xff09; 生成模型&#xff08;vae、gan、flow、ddpm、sde…) 其它多模態大模型&#xff08;語音、視頻、slam、3…

Vue3中Ant-design-vue的使用-附完整代碼

前言 首先介紹一下什么是Ant-design-vue Ant Design Vue 是基于 Vue 3 的企業級 UI 組件庫&#xff08;同時兼容 Vue 2&#xff09;&#xff0c;是螞蟻金服開源項目 Ant Design 的 Vue 實現版本。它遵循 Ant Design 的設計規范&#xff0c;提供豐富的組件和高質量的設計體系&…

建造者模式:優雅構建復雜對象

引言 在軟件開發中&#xff0c;有時我們需要創建一個由多個部分組成的復雜對象&#xff0c;這些部分可能有不同的變體或配置。如果直接在一個構造函數中設置所有參數&#xff0c;代碼會變得難以閱讀和維護。當對象構建過程復雜&#xff0c;且需要多個步驟時&#xff0c;我們可…

如何通過akshare庫,獲取股票數據,并生成TabPFN這個模型 可以識別、處理的格式(并進行了訓練、推理)

計劃讓AI幫助編程使用TabPFN模型進行股價推理 原計劃提問的prompt 如何通過akshare庫&#xff0c;獲取股票數據&#xff0c;并生成TabPFN這個模型 可以識別、處理的格式 本意是想讓AI分步執行&#xff0c;先處理股票數據&#xff0c;然后再進行模型訓練&#xff0c;結果豆包超…