這里主要進(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)。
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;
// 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>";
該版本號(hào)為標(biāo)注不兼容版本,并且會(huì)在<package_name>中進(jìn)行區(qū)分,當(dāng)接口需要重構(gòu)時(shí)一般會(huì)更新不兼容結(jié)構(gòu);
包名為小寫(xiě),并且同目錄結(jié)構(gòu)一致,例如:my/package/v1/
package my.package.v1;
文件應(yīng)該命名為:?lower_snake_case.proto
? 所有Proto應(yīng)按下列方式排列:
使用駝峰命名法(首字母大寫(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) { ... }
通過(guò)repeated關(guān)鍵字定義數(shù)組(List):
repeated string keys = 1;
...
repeated Account accounts = 17;
使用駝峰命名法(首字母大寫(xiě))命名枚舉類(lèi)型,使用 “大寫(xiě)下劃線大寫(xiě)” 的方式命名枚舉值:
enum Foo {
FIRST_VALUE = 0;
SECOND_VALUE = 1;
}
每一個(gè)枚舉值以分號(hào)結(jié)尾,而非逗號(hào)。
如果你在 .proto 文件中定義 RPC 服務(wù),你應(yīng)該使用駝峰命名法(首字母大寫(xiě))命名 RPC 服務(wù)以及其中的 RPC 方法:
service FooService {
rpc GetSomething(FooRequest) returns (FooResponse);
}
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;
}
更多建議: