go?micro微服務proto開發(fā)安裝及使用規(guī)則
一 Protobuf介紹
Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言數據標準,目前已經正在使用的有超過 48,162 種報文格式定義和超過 12,183 個 .proto 文件。
他們用于 RPC 系統(tǒng)和持續(xù)數據存儲系統(tǒng)。Protocol Buffers 是一種輕便高效的結構化數據存儲格式,可以用于結構化數據串行化、或者說序列化。
它很適合做數據存儲或RPC數據交換格式??梢杂糜诩磿r通訊、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式
protobuf的核心內容包括:
- 定義消息:消息的結構體,以message標識。
- 定義接口:接口路徑和參數,以service標識。
- 通過protobuf提供的機制,服務端與服務端之間只需要關注接口方法名(service)和參數(message)即可通信,而不需關注繁瑣的鏈路協議和字段解析,極大降低了服務端的設計開發(fā)成本。
二 安裝Protobuf
1、下載
下載所需的安裝包,地址為:github.com/protocolbuf…
下載完成之后解壓
2、將bin目錄將入環(huán)境變量
3、查看安裝是否成功
protoc --version
三 Protobuf語法
1.1 基本規(guī)范
文件以.proto做為文件后綴,除結構定義外的語句以分號結尾
結構定義可以包含:message、service、enum
rpc方法定義結尾的分號可有可無
Message命名采用駝峰命名方式,字段命名采用小寫字母加下劃線分隔方式
message SongServerRequest { required string song_name = 1; }
Enums類型名采用駝峰命名方式,字段命名采用大寫字母加下劃線分隔方式
enum Foo { FIRST_VALUE = 1; SECOND_VALUE = 2; }
Service與rpc方法名統(tǒng)一采用駝峰式命名
1.2 字段規(guī)則
字段格式:限定修飾符 | 數據類型 | 字段名稱 | = | 字段編碼值 | [字段默認值]
限定修飾符包含 required\optional\repeated
- Required: 表示是一個必須字段,必須相對于發(fā)送方,在發(fā)送消息之前必須設置該字段的值,對于接收方,必須能夠識別該字段的意思。發(fā)送之前沒有設置required字段或者無法識別required字段都會引發(fā)編解碼異常,導致消息被丟棄
- Optional:表示是一個可選字段,可選對于發(fā)送方,在發(fā)送消息時,可以有選擇性的設置或者不設置該字段的值。對于接收方,如果能夠識別可選字段就進行相應的處理,如果無法識別,則忽略該字段,消息中的其它字段正常處理。---因為optional字段的特性,很多接口在升級版本中都把后來添加的字段都統(tǒng)一的設置為optional字段,這樣老的版本無需升級程序也可以正常的與新的軟件進行通信,只不過新的字段無法識別而已,因為并不是每個節(jié)點都需要新的功能,因此可以做到按需升級和平滑過渡
- Repeated:表示該字段可以包含0~N個元素。其特性和optional一樣,但是每一次可以包含多個值。可以看作是在傳遞一個數組的值
數據類型
Protobuf定義了一套基本數據類型。幾乎都可以映射到C++\Java等語言的基礎數據類型
.proto | C++ | Java | Python | Go | Ruby | C# |
---|---|---|---|---|---|---|
double | double | double | float | float64 | Float | double |
float | float | float | float | float32 | Float | float |
int32 | int32 | int | int | int32 | Fixnum or Bignum | int |
int64 | int64 | long | ing/long[3] | int64 | Bignum | long |
uint32 | uint32 | int[1] | int/long[3] | uint32 | Fixnum or Bignum | uint |
uint64 | uint64 | long[1] | int/long[3] | uint64 | Bignum | ulong |
sint32 | int32 | int | intj | int32 | Fixnum or Bignum | int |
sint64 | int64 | long | int/long[3] | int64 | Bignum | long |
fixed32 | uint32 | int[1] | int | uint32 | Fixnum or Bignum | uint |
fixed64 | uint64 | long[1] | int/long[3] | uint64 | Bignum | ulong |
sfixed32 | int32 | int | int | int32 | Fixnum or Bignum | int |
sfixed64 | int64 | long | int/long[3] | int64 | Bignum | long |
bool | bool | boolean | boolean | bool | TrueClass/FalseClass | bool |
string | string | String | str/unicode[4] | string | String(UTF-8) | string |
bytes | string | ByteString | str | []byte | String(ASCII-8BIT) | ByteString |
字段名稱
- 字段名稱的命名與C、C++、Java等語言的變量命名方式幾乎是相同的
- protobuf建議字段的命名采用以下劃線分割的駝峰式。例如 first_name 而不是firstName
字段編碼值
- 有了該值,通信雙方才能互相識別對方的字段,相同的編碼值,其限定修飾符和數據類型必須相同,編碼值的取值范圍為
1~2^32
(4294967296) - 其中 1~15的編碼時間和空間效率都是最高的,編碼值越大,其編碼的時間和空間效率就越低,所以建議把經常要傳遞的值把其字段編碼設置為1-15之間的值
- 1900~2000編碼值為Google protobuf 系統(tǒng)內部保留值,建議不要在自己的項目中使用
字段默認值
當在傳遞數據時,對于required數據類型,如果用戶沒有設置值,則使用默認值傳遞到對端
1.3 service如何定義
- 如果想要將消息類型用在RPC系統(tǒng)中,可以在.proto文件中定義一個RPC服務接口,protocol buffer編譯器會根據所選擇的不同語言生成服務接口代碼
- 例如,想要定義一個RPC服務并具有一個方法,該方法接收SearchRequest并返回一個SearchResponse,此時可以在.proto文件中進行如下定義:
service SearchService { rpc Search (SearchRequest) returns (SearchResponse) {} }
- 生成的接口代碼作為客戶端與服務端的約定,服務端必須實現定義的所有接口方法,客戶端直接調用同名方法向服務端發(fā)起請求,比較麻煩的是,即便業(yè)務上不需要參數也必須指定一個請求消息,一般會定義一個空message
1.4 Message如何定義
- 一個message類型定義描述了一個請求或響應的消息格式,可以包含多種類型字段
- 例如定義一個搜索請求的消息格式,每個請求包含查詢字符串、頁碼、每頁數目
- 字段名用小寫,轉為go文件后自動變?yōu)榇髮?,message就相當于結構體
syntax = "proto3"; message SearchRequest { string query = 1; // 查詢字符串 int32 page_number = 2; // 頁碼 int32 result_per_page = 3; // 每頁條數 }
- 首行聲明使用的protobuf版本為proto3
- SearchRequest 定義了三個字段,每個字段聲明以分號結尾,.proto文件支持雙斜線 // 添加單行注釋
四 proto代碼編寫
- 在account.proto文件中寫入以下代碼
syntax = "proto3"; import "google/protobuf/timestamp.proto"; package go.micro.service.account; option go_package="/proto/account"; service Account { //登錄 rpc Login(LoginRequest) returns (LoginResponse) {} //注冊 rpc Register(RegisterRequest) returns (RegisterResponse) {} //查詢用戶信息 rpc GetUserInfo(UserIdRequest) returns (UserInfoResponse) {} //修改信息 rpc UpdateUserInfo(UserInfoRequest) returns (Response) {} //發(fā)送注冊郵件 rpc SendRegisterMail(SendMailRequest) returns (SendMailResponse) {} //發(fā)送重置密碼郵件 rpc SendResetPwdMail(SendMailRequest) returns (SendMailResponse) {} //重置密碼 rpc ResetPwd(ResetPwdRequest) returns (Response) {} //獲取權限 rpc GetUserPermission(UserIdRequest) returns (GetPermissionResponse) {} //修改權限 rpc UpdateUserPermission(UpdatePermissionRequest) returns (Response) {} //退出賬號 rpc Logout(UserIdRequest) returns (Response) {} //刪除賬號 rpc DelUser(UserIdRequest) returns (Response) {} //禁用賬號 rpc DisableUser(UserIdRequest) returns (Response) {} //啟用賬號 rpc EnableUser(UserIdRequest) returns (Response) {} } message UserInfoResponse{ int64 user_id = 1; string username = 2; string first_name = 3; string password = 4; int64 permission = 5; google.protobuf.Timestamp create_date = 6; google.protobuf.Timestamp update_date = 7; int64 is_active = 8; string email = 9; string last_name = 10; } message UserInfoRequest{ UserInfoResponse user_info =1; } message UserIdRequest{ int64 user_id = 1; } message Response{ string message = 1; } message RegisterRequest{ UserInfoResponse register_request = 1; string code = 2; } message LoginRequest{ string username = 1; string password = 2; } message LoginResponse{ bool is_success = 1; int64 user_id = 2; string token = 3; } message RegisterResponse{ bool is_success = 1; int64 user_id = 2; } message SendMailRequest{ string email = 1; } message SendMailResponse{ string code = 1; string msg = 2; } message GetPermissionResponse{ int64 permission = 1; } message UpdatePermissionRequest{ int64 user_id = 1; int64 permission = 2; } message ResetPwdRequest{ int64 user_id = 1; string code = 2; string password = 3; }
五 生成.go文件
-打開終端,輸入以下命令:
protoc --go_out=./ --micro_out=./ ./proto/account/account.proto
- 命令執(zhí)行后,會發(fā)現同級目錄多了兩個go文件,這就是自動生成好的編譯之后的文件。
- 命令講解:
- --go_out 指定當前的目錄./
- --micro_out 指定當前micro目錄./
- ./proto/account/account.proto 指定要編譯的.proto文件地址
效果圖:
六 最后
- 至此,go-micro微服務項目proto開發(fā)工作就正式完成。
- 接下來就開始domain層開發(fā)了,希望大家關注博主和關注專欄,第一時間獲取最新內容,每篇博客都干貨滿滿。
以上就是go micro微服務proto開發(fā)安裝及使用規(guī)則的詳細內容,更多關于go micro微服務proto的資料請關注腳本之家其它相關文章!
相關文章
go-micro使用Consul做服務發(fā)現的方法和原理解析
這篇文章主要介紹了go-micro使用Consul做服務發(fā)現的方法和原理,這里提供一個通過docker快速安裝Consul的方式,當然前提是你得安裝了docker,需要的朋友可以參考下2022-04-04Go語言驅動低代碼應用引擎工具Yao開發(fā)管理系統(tǒng)
這篇文章主要為大家介紹了Go語言驅動低代碼應用引擎工具Yao開發(fā)管理系統(tǒng)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06Go?slice切片make生成append追加copy復制示例
這篇文章主要為大家介紹了Go使用make生成切片、使用append追加切片元素、使用copy復制切片使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06