亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

go?micro微服務(wù)proto開發(fā)安裝及使用規(guī)則

 更新時間:2023年01月08日 08:34:56   作者:夏沫的夢  
這篇文章主要為大家介紹了go?micro微服務(wù)proto開發(fā)中安裝Protobuf及基本規(guī)范字段的規(guī)則詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一 Protobuf介紹

Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內(nèi)部的混合語言數(shù)據(jù)標(biāo)準(zhǔn),目前已經(jīng)正在使用的有超過 48,162 種報文格式定義和超過 12,183 個 .proto 文件。

他們用于 RPC 系統(tǒng)和持續(xù)數(shù)據(jù)存儲系統(tǒng)。Protocol Buffers 是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式,可以用于結(jié)構(gòu)化數(shù)據(jù)串行化、或者說序列化。

它很適合做數(shù)據(jù)存儲或RPC數(shù)據(jù)交換格式。可以用于即時通訊、數(shù)據(jù)存儲等領(lǐng)域的語言無關(guān)、平臺無關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)格式

protobuf的核心內(nèi)容包括:

  • 定義消息:消息的結(jié)構(gòu)體,以message標(biāo)識。
  • 定義接口:接口路徑和參數(shù),以service標(biāo)識。
  • 通過protobuf提供的機制,服務(wù)端與服務(wù)端之間只需要關(guān)注接口方法名(service)和參數(shù)(message)即可通信,而不需關(guān)注繁瑣的鏈路協(xié)議和字段解析,極大降低了服務(wù)端的設(shè)計開發(fā)成本。

二 安裝Protobuf

1、下載

    下載所需的安裝包,地址為:github.com/protocolbuf…

      下載完成之后解壓

     2、將bin目錄將入環(huán)境變量

    3、查看安裝是否成功

    protoc  --version

三 Protobuf語法

1.1 基本規(guī)范

文件以.proto做為文件后綴,除結(jié)構(gòu)定義外的語句以分號結(jié)尾

結(jié)構(gòu)定義可以包含:message、service、enum

rpc方法定義結(jié)尾的分號可有可無

Message命名采用駝峰命名方式,字段命名采用小寫字母加下劃線分隔方式

  message SongServerRequest {
      required string song_name = 1;
  }

Enums類型名采用駝峰命名方式,字段命名采用大寫字母加下劃線分隔方式

  enum Foo {
      FIRST_VALUE = 1;
      SECOND_VALUE = 2;
  }

Service與rpc方法名統(tǒng)一采用駝峰式命名

1.2 字段規(guī)則

字段格式:限定修飾符 | 數(shù)據(jù)類型 | 字段名稱 | = | 字段編碼值 | [字段默認(rèn)值]

限定修飾符包含 required\optional\repeated

  • Required: 表示是一個必須字段,必須相對于發(fā)送方,在發(fā)送消息之前必須設(shè)置該字段的值,對于接收方,必須能夠識別該字段的意思。發(fā)送之前沒有設(shè)置required字段或者無法識別required字段都會引發(fā)編解碼異常,導(dǎo)致消息被丟棄
  • Optional:表示是一個可選字段,可選對于發(fā)送方,在發(fā)送消息時,可以有選擇性的設(shè)置或者不設(shè)置該字段的值。對于接收方,如果能夠識別可選字段就進(jìn)行相應(yīng)的處理,如果無法識別,則忽略該字段,消息中的其它字段正常處理。---因為optional字段的特性,很多接口在升級版本中都把后來添加的字段都統(tǒng)一的設(shè)置為optional字段,這樣老的版本無需升級程序也可以正常的與新的軟件進(jìn)行通信,只不過新的字段無法識別而已,因為并不是每個節(jié)點都需要新的功能,因此可以做到按需升級和平滑過渡
  • Repeated:表示該字段可以包含0~N個元素。其特性和optional一樣,但是每一次可以包含多個值??梢钥醋魇窃趥鬟f一個數(shù)組的值

數(shù)據(jù)類型

Protobuf定義了一套基本數(shù)據(jù)類型。幾乎都可以映射到C++\Java等語言的基礎(chǔ)數(shù)據(jù)類型

.protoC++JavaPythonGoRubyC#
doubledoubledoublefloatfloat64Floatdouble
floatfloatfloatfloatfloat32Floatfloat
int32int32intintint32Fixnum or Bignumint
int64int64longing/long[3]int64Bignumlong
uint32uint32int[1]int/long[3]uint32Fixnum or Bignumuint
uint64uint64long[1]int/long[3]uint64Bignumulong
sint32int32intintjint32Fixnum or Bignumint
sint64int64longint/long[3]int64Bignumlong
fixed32uint32int[1]intuint32Fixnum or Bignumuint
fixed64uint64long[1]int/long[3]uint64Bignumulong
sfixed32int32intintint32Fixnum or Bignumint
sfixed64int64longint/long[3]int64Bignumlong
boolboolbooleanbooleanboolTrueClass/FalseClassbool
stringstringStringstr/unicode[4]stringString(UTF-8)string
bytesstringByteStringstr[]byteString(ASCII-8BIT)ByteString

字段名稱

  • 字段名稱的命名與C、C++、Java等語言的變量命名方式幾乎是相同的
  • protobuf建議字段的命名采用以下劃線分割的駝峰式。例如 first_name 而不是firstName

字段編碼值

  • 有了該值,通信雙方才能互相識別對方的字段,相同的編碼值,其限定修飾符和數(shù)據(jù)類型必須相同,編碼值的取值范圍為 1~2^32(4294967296)
  • 其中 1~15的編碼時間和空間效率都是最高的,編碼值越大,其編碼的時間和空間效率就越低,所以建議把經(jīng)常要傳遞的值把其字段編碼設(shè)置為1-15之間的值
  • 1900~2000編碼值為Google protobuf 系統(tǒng)內(nèi)部保留值,建議不要在自己的項目中使用

字段默認(rèn)值

當(dāng)在傳遞數(shù)據(jù)時,對于required數(shù)據(jù)類型,如果用戶沒有設(shè)置值,則使用默認(rèn)值傳遞到對端

1.3 service如何定義

  • 如果想要將消息類型用在RPC系統(tǒng)中,可以在.proto文件中定義一個RPC服務(wù)接口,protocol buffer編譯器會根據(jù)所選擇的不同語言生成服務(wù)接口代碼
  • 例如,想要定義一個RPC服務(wù)并具有一個方法,該方法接收SearchRequest并返回一個SearchResponse,此時可以在.proto文件中進(jìn)行如下定義:
    service SearchService {
        rpc Search (SearchRequest) returns (SearchResponse) {}
    }
  • 生成的接口代碼作為客戶端與服務(wù)端的約定,服務(wù)端必須實現(xiàn)定義的所有接口方法,客戶端直接調(diào)用同名方法向服務(wù)端發(fā)起請求,比較麻煩的是,即便業(yè)務(wù)上不需要參數(shù)也必須指定一個請求消息,一般會定義一個空message

1.4 Message如何定義

  • 一個message類型定義描述了一個請求或響應(yīng)的消息格式,可以包含多種類型字段
  • 例如定義一個搜索請求的消息格式,每個請求包含查詢字符串、頁碼、每頁數(shù)目
  • 字段名用小寫,轉(zhuǎn)為go文件后自動變?yōu)榇髮?,message就相當(dāng)于結(jié)構(gòu)體
    syntax = "proto3";
    message SearchRequest {
        string query = 1;            // 查詢字符串
        int32  page_number = 2;     // 頁碼
        int32  result_per_page = 3;   // 每頁條數(shù)
    }
  • 首行聲明使用的protobuf版本為proto3
  • SearchRequest 定義了三個字段,每個字段聲明以分號結(jié)尾,.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) {}
  //獲取權(quán)限
  rpc GetUserPermission(UserIdRequest) returns (GetPermissionResponse) {}
  //修改權(quán)限
  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ā)現(xiàn)同級目錄多了兩個go文件,這就是自動生成好的編譯之后的文件。
  • 命令講解:
  • --go_out 指定當(dāng)前的目錄./
  • --micro_out 指定當(dāng)前micro目錄./
  • ./proto/account/account.proto 指定要編譯的.proto文件地址

效果圖:

六 最后

  • 至此,go-micro微服務(wù)項目proto開發(fā)工作就正式完成。
  • 接下來就開始domain層開發(fā)了,希望大家關(guān)注博主和關(guān)注專欄,第一時間獲取最新內(nèi)容,每篇博客都干貨滿滿。

以上就是go micro微服務(wù)proto開發(fā)安裝及使用規(guī)則的詳細(xì)內(nèi)容,更多關(guān)于go micro微服務(wù)proto的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論