這里主要進行修訂Proto規(guī)范約定和多語言之間特定商定,幫助大家寫出更標(biāo)準(zhǔn)的接口。
API接口統(tǒng)一以HTTP/GRPC為基礎(chǔ),并通過Protobuf進行協(xié)議定義,包括完整的Request/Reply,以及對應(yīng)的接口錯誤碼(Errors)。
API接口可以定義到項目,或者在統(tǒng)一倉庫中管理Proto,類似googleapis、envoy-api、istio-api;
項目中定義Proto,以api為包名根目錄:
kratos-demo:
|____api // 服務(wù)API定義
| |____kratos
| | |____demo
| | | |____v1
| | | | |____demo.proto
在統(tǒng)一倉庫中管理Proto,以倉庫為包名根目錄:
kratos-apis:
|____api // 服務(wù)API定義
| |____kratos
| | |____demo
| | | |____v1
| | | | |____demo.proto
|____annotations // 注解定義options
|____third_party // 第三方引用
包名為應(yīng)用的標(biāo)識(APP_ID),用于生成gRPC請求路徑,或者Proto之間進行引用Message;
// RequestURL: /<package_name>.<version>.<service_name>/{method}
package <package_name>.<version>;
option go_package = "github.com/go-kratos/kratos/<package_name>;<version>";
option java_multiple_files = true;
option java_package = "com.github.kratos.<package_name>.<version>";
option objc_class_prefix = "<PackageNameVersion>";
該版本號為標(biāo)注不兼容版本,并且會在<package_name>中進行區(qū)分,當(dāng)接口需要重構(gòu)時一般會更新不兼容結(jié)構(gòu);
包名為小寫,并且同目錄結(jié)構(gòu)一致,例如:my/package/v1/
package my.package.v1;
文件應(yīng)該命名為:?lower_snake_case.proto
? 所有Proto應(yīng)按下列方式排列:
使用駝峰命名法(首字母大寫)命名 message,例子:SongServerRequest 使用下劃線命名字段,例子:song_name
message SongServerRequest {
required string song_name = 1;
}
使用上述這種字段的命名約定,生成的訪問器將類似于如下代碼:
C++:
const string& song_name() { ... }
void set_song_name(const string& x) { ... }
Java:
public String getSongName() { ... }
public Builder setSongName(String v) { ... }
通過repeated關(guān)鍵字定義數(shù)組(List):
repeated string keys = 1;
...
repeated Account accounts = 17;
使用駝峰命名法(首字母大寫)命名枚舉類型,使用 “大寫下劃線大寫” 的方式命名枚舉值:
enum Foo {
FIRST_VALUE = 0;
SECOND_VALUE = 1;
}
每一個枚舉值以分號結(jié)尾,而非逗號。
如果你在 .proto 文件中定義 RPC 服務(wù),你應(yīng)該使用駝峰命名法(首字母大寫)命名 RPC 服務(wù)以及其中的 RPC 方法:
service FooService {
rpc GetSomething(FooRequest) returns (FooResponse);
}
API Service接口定義(demo.proto)
syntax = "proto3";
package kratos.demo.v1;
// 多語言特定包名,用于源代碼引用
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請求參數(shù)
message HelloRequest {
// 用戶名字
string name = 1;
}
// Hello返回結(jié)果
message HelloReply {
// 結(jié)果信息
string message = 1;
}
更多建議: