網站首頁 編程語言 正文
前言
最近項目是采用微服務架構開發的,各服務之間通過gPRC調用,基于ProtoBuf序列化協議進行數據通信,因此接觸學習了Protobuf,本文會對Protobuf的語法做下總結,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
gRPC的調用模型如下:
基本規范
文件以.proto做為文件后綴,除結構定義外的語句以分號結尾。
rpc方法定義結尾的分號可有可無。
Message命名采用駝峰命名方式,字段命名采用小寫字母加下劃線分隔方式。
基本語法
首先看一個簡單的示例:
/* 頭部相關聲明 */ syntax = "proto3"; // 語法版本為protobuf3.0 package user; // 定義包名,可以為.proto文件指定包名,防止消息名沖突。 import "common.proto"; // 導入common.proto option go_package = ".;proto"; //服務 service User { rpc SayHello (SayHelloRequest) returns (SayHelloResponse) {} } //定義請求消息體 message SayHelloRequest { string name = 1; int64 role = 2; } //定義響應消息體 message SayHelloResponse { string message = 1; }
.proto文件的第一個非注釋行用于指定語法版本,默認為“proto2”;
package定義包
可以為.proto
文件指定包名,防止消息名沖突。
import 導入包
可以通過import
導入其它.proto中定義的消息;常用于導入一些公共的信息。
正常情況下只能使用直接導入的proto文件的定義;如果需要使用多級import導入的文件,import 可以使用 public 屬性。示例如下:
a.proto
import public "common.proto"; // 注意此處使用的是import public import "c.proto";
b.proto
import "a.proto";
在b.proto中可以用common.proto中定義的內容,但是不能用c中的定義的內容。
定義Message
定義message使用“message”關鍵字,消息的字段聲明由4部分構成:字段修飾符 字段類型 字段名稱 = 標志號。
格式如下:
message 消息名稱 {
[字段修飾符] 字段類型 字段名稱 = 標志號;
}
字段修飾符
- singular:默認值,該字段可以出現0次或者1次(不能超過1次);
- repeated:該字段可以重復任意多次(包括0次);
我們可以使用repeated關鍵字來表示動態數組,示例如下:
message User { repeated int64 id = 1; }
在請求的時候我們可以傳[]int64{1, 2, 3, 4}
。
字段類型
關于字段類型,這里列舉幾個常用的,其它的如果有需要可以直接網上搜。
類型 | 備注 |
---|---|
string | 字符串 |
double | 64位浮點型 |
float | 32位浮點型 |
int32、int64 | 整型 |
bool | 布爾型 |
uint32、uint64 | 無符號整型 |
sint32、sint64 | 有符號的整形 |
字段編號
每個字段都有一個編號,這些編號是 唯一的。該編號會用來識別二進制數據中的字段。編號在1-15范圍內可以用一個字節編碼表示,在16-2047范圍用兩個字節表示,所以將15以內得編號留給頻繁出現的字段可以節省空間。
枚舉類型
在定義消息類型時,我們有可能會為某個字段預定義值的一個列表,我們可以通過enum來添加一個枚舉,為每個可能的值添加一個常量。示例如下:
message UserRequest { string name = 1; // 定義性別枚舉 enum Gender { UNKNOWN = 0; MAN = 1; WOMAN = 2; } // 定義一個枚舉字段 Gender gender = 2; }
注意:所有枚舉定義都需要包含一個常量映射到0并且作為定義的首行。
嵌套類型
嵌套類型,也就是字面意思,在 message 消息體中,又嵌套了其它的 message 消息體,一共有兩種模式,如下:
syntax = "proto3"; message UserResponse { message User { int64 id = 1; string name = 2; } repeated User users = 1; }
如果在外部消息之外使用內部消息,則需要使用“outermsg.innermsg”的方式,如,需要在UserResponse外使用User, 則應該使用:
UserResponse.User
Map類型
在返回列表的時候,map類型經常用到,可以使用map關鍵字可以創建一個映射,語法如:
map<key_type, value_type> map_field = N;
- key_type 只能是整數或字符串,enum不能作為key_type;
- value_type 是除了映射(map)意外的任意類型;
示例:
message User { int64 id = 1; string name = 2; } map[int64, User] users = 1;
定義Service
如果想在RPC中使用已經定義好的消息類型,可以在.proto文件中定一個消息服務接口,使用service關鍵字進行服務定義,如:
service User { rpc SayHello (SayHelloRequest) returns (SayHelloResponse) {} }
原文鏈接:https://juejin.cn/post/7155399858004688926
相關推薦
- 2022-11-30 C語言中順序棧和鏈棧的定義和使用詳解_C 語言
- 2022-11-18 React中用@符號編寫文件路徑實現方法介紹_React
- 2022-10-04 SQL語句中的DDL類型的數據庫定義語言操作_MsSql
- 2022-09-02 ahooks整體架構及React工具庫源碼解讀_React
- 2023-11-17 在python中按不同的條件在列表list、字典dict和集合set中篩選想要的數據(以實際案例進行
- 2022-06-11 MSSQL基本語法及實例操作語句_MsSql
- 2022-03-27 .NET?Core利用動態代理實現AOP(面向切面編程)_實用技巧
- 2023-03-29 Android?Flutter中Offstage組件的使用教程詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支