Kratos Protobuf 規(guī)范

2022-04-25 10:38 更新

Protobuf 規(guī)范

這里主要進(jìn)行修訂Proto規(guī)范約定和多語(yǔ)言之間特定商定,幫助大家寫(xiě)出更標(biāo)準(zhǔn)的接口。

API接口統(tǒng)一以HTTP/GRPC為基礎(chǔ),并通過(guò)Protobuf進(jìn)行協(xié)議定義,包括完整的Request/Reply,以及對(duì)應(yīng)的接口錯(cuò)誤碼(Errors)。

目錄結(jié)構(gòu)

API接口可以定義到項(xiàng)目,或者在統(tǒng)一倉(cāng)庫(kù)中管理Proto,類(lèi)似googleapis、envoy-api、istio-api;

項(xiàng)目中定義Proto,以api為包名根目錄:

kratos-demo:
|____api // 服務(wù)API定義
| |____kratos
| | |____demo
| | | |____v1
| | | | |____demo.proto

在統(tǒng)一倉(cāng)庫(kù)中管理Proto,以倉(cāng)庫(kù)為包名根目錄:

kratos-apis:
|____api // 服務(wù)API定義
| |____kratos
| | |____demo
| | | |____v1
| | | | |____demo.proto
|____annotations // 注解定義options
|____third_party // 第三方引用

包名

包名為應(yīng)用的標(biāo)識(shí)(APP_ID),用于生成gRPC請(qǐng)求路徑,或者Proto之間進(jìn)行引用Message;

  • my.package.v1,為API目錄,定義service相關(guān)接口,用于提供業(yè)務(wù)使用

// RequestURL: /<package_name>.<version>.<service_name>/{method}
package <package_name>.<version>;

  • go_package

option go_package = "github.com/go-kratos/kratos/<package_name>;<version>";

  • java_package

option java_multiple_files = true;
option java_package = "com.github.kratos.<package_name>.<version>";

  • objc_class_prefix

option objc_class_prefix = "<PackageNameVersion>";

Version

該版本號(hào)為標(biāo)注不兼容版本,并且會(huì)在<package_name>中進(jìn)行區(qū)分,當(dāng)接口需要重構(gòu)時(shí)一般會(huì)更新不兼容結(jié)構(gòu);

Import

  • 業(yè)務(wù)proto依賴(lài),以根目錄進(jìn)行引入對(duì)應(yīng)依賴(lài)的proto;
  • third_party,主要為依賴(lài)的第三方proto,比如protobuf、google rpc、google apis、gogo定義;

命名規(guī)范

目錄結(jié)構(gòu)

包名為小寫(xiě),并且同目錄結(jié)構(gòu)一致,例如:my/package/v1/

package my.package.v1;

文件結(jié)構(gòu)

文件應(yīng)該命名為:?lower_snake_case.proto? 所有Proto應(yīng)按下列方式排列:

  1. License header (if applicable)
  2. File overview
  3. Syntax
  4. Package
  5. Imports (sorted)
  6. File options
  7. Everything else

Message 和 字段命名

使用駝峰命名法(首字母大寫(xiě))命名 message,例子:SongServerRequest 使用下劃線命名字段,例子:song_name

message SongServerRequest {
  required string song_name = 1;
}

使用上述這種字段的命名約定,生成的訪問(wèn)器將類(lèi)似于如下代碼:

C++:
  const string& song_name() { ... }
  void set_song_name(const string& x) { ... }

Java:
  public String getSongName() { ... }
  public Builder setSongName(String v) { ... }

數(shù)組 Repeated

通過(guò)repeated關(guān)鍵字定義數(shù)組(List):

repeated string keys = 1;
...
repeated Account accounts = 17;

枚舉 Enums

使用駝峰命名法(首字母大寫(xiě))命名枚舉類(lèi)型,使用 “大寫(xiě)下劃線大寫(xiě)” 的方式命名枚舉值:

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

每一個(gè)枚舉值以分號(hào)結(jié)尾,而非逗號(hào)。

服務(wù) Services

如果你在 .proto 文件中定義 RPC 服務(wù),你應(yīng)該使用駝峰命名法(首字母大寫(xiě))命名 RPC 服務(wù)以及其中的 RPC 方法:

service FooService {
  rpc GetSomething(FooRequest) returns (FooResponse);
}

Comment

  • Service,描述清楚服務(wù)的作用
  • Method,描述清楚接口的功能特性
  • Field,描述清楚字段準(zhǔn)確的信息

Examples

API Service接口定義(demo.proto)

syntax = "proto3";

package kratos.demo.v1;

// 多語(yǔ)言特定包名,用于源代碼引用
option go_package = "github.com/go-kratos/kratos/demo/v1;v1";
option java_multiple_files = true;
option java_package = "com.github.kratos.demo.v1";
option objc_class_prefix = "KratosDemoV1";

// 描述該服務(wù)的信息
service Greeter {
    // 描述該方法的功能
    rpc SayHello (HelloRequest) returns (HelloReply);
}
// Hello請(qǐng)求參數(shù)
message HelloRequest {
    // 用戶名字
    string name = 1;
}
// Hello返回結(jié)果
message HelloReply {
    // 結(jié)果信息
    string message = 1;
}


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)