如果可能,如何组织原型文件以重用消息?
How to organize proto file to re-use message if possible?
我最近开始在我的 golang 项目中使用 protobuf。我在下面创建了简单的 protobuf 文件。我有三个不同的端点。
GetLink
将 CustomerRequest
作为输入参数并 returns 返回 CustomerResponse
GetBulkLinks
将 BulkCustomerRequest
作为输入参数并 returns 返回 BulkCustomerResponse
StreaLinks
将 StreamRequest
作为输入参数并 returns 返回 CustomerResponse
我想知道是否有任何方法可以改进下面的原型文件,因为 CustomerRequest
和 BulkCustomerRequest
除了 resources
字段外几乎所有内容都是相同的,因此存在重复。 StreamRequest
输入参数也是如此,因为它只需要 clientId
作为输入参数。 protocol buffer 中是否有任何东西可以重用来自其他消息类型的内容?
有没有更好或更有效的方法来组织下面的 proto 文件以相应地重用消息?
syntax = "proto3";
option go_package = "github.com/david/customerclient/gen/go/data/v1";
package data.v1;
service CustomerService {
rpc GetLink(CustomerRequest) returns (CustomerResponse) {};
rpc GetBulkLinks(BulkCustomerRequest) returns (BulkCustomerResponse) {};
rpc StreaLinks(StreamRequest) returns (CustomerResponse) {};
}
message CustomerRequest {
int32 clientId = 1;
string resources = 2;
bool isProcess = 3;
}
message BulkCustomerRequest {
int32 clientId = 1;
repeated string resources = 2;
bool isProcess = 3;
}
message StreamRequest {
int32 clientId = 1;
}
message CustomerResponse {
string value = 1;
string info = 2;
string baseInfo = 3;
string link = 4;
}
message BulkCustomerResponse {
map<string, CustomerResponse> customerResponse = 1;
}
Is there anything in protocol buffer which can reuse stuff from another message type?
但是请记住,请求和响应负载可能会随着时间而改变。即使今天 看起来像 他们有一些共同点,明天他们可能会有所不同。 毕竟它们在不同的 RPC 中使用。那么过度的耦合会起到相反的效果,变成技术债
由于您的模式实际上每条消息的字段不超过三个,因此我将保留所有内容。无论如何,如果你真的必须,你可以考虑以下几点:
- 在单独的消息中提取
GetLink
和 GetBulkLinks
公共字段并与之组合:
message CustomerRequestParams {
int32 clientId = 1;
bool isProcess = 2;
}
message CustomerRequest {
CustomerRequestParams params = 1;
string resources = 2;
}
message BulkCustomerRequest {
CustomerRequestParams params = 1;
repeated string resources = 2;
}
StreamRequest
重复 clientId
看起来很好。可以说,流在概念上不同于一元 RPC,因此只需将它们分开即可。而且只有一个字段。
我最近开始在我的 golang 项目中使用 protobuf。我在下面创建了简单的 protobuf 文件。我有三个不同的端点。
GetLink
将CustomerRequest
作为输入参数并 returns 返回CustomerResponse
GetBulkLinks
将BulkCustomerRequest
作为输入参数并 returns 返回BulkCustomerResponse
StreaLinks
将StreamRequest
作为输入参数并 returns 返回CustomerResponse
我想知道是否有任何方法可以改进下面的原型文件,因为 CustomerRequest
和 BulkCustomerRequest
除了 resources
字段外几乎所有内容都是相同的,因此存在重复。 StreamRequest
输入参数也是如此,因为它只需要 clientId
作为输入参数。 protocol buffer 中是否有任何东西可以重用来自其他消息类型的内容?
有没有更好或更有效的方法来组织下面的 proto 文件以相应地重用消息?
syntax = "proto3";
option go_package = "github.com/david/customerclient/gen/go/data/v1";
package data.v1;
service CustomerService {
rpc GetLink(CustomerRequest) returns (CustomerResponse) {};
rpc GetBulkLinks(BulkCustomerRequest) returns (BulkCustomerResponse) {};
rpc StreaLinks(StreamRequest) returns (CustomerResponse) {};
}
message CustomerRequest {
int32 clientId = 1;
string resources = 2;
bool isProcess = 3;
}
message BulkCustomerRequest {
int32 clientId = 1;
repeated string resources = 2;
bool isProcess = 3;
}
message StreamRequest {
int32 clientId = 1;
}
message CustomerResponse {
string value = 1;
string info = 2;
string baseInfo = 3;
string link = 4;
}
message BulkCustomerResponse {
map<string, CustomerResponse> customerResponse = 1;
}
Is there anything in protocol buffer which can reuse stuff from another message type?
但是请记住,请求和响应负载可能会随着时间而改变。即使今天 看起来像 他们有一些共同点,明天他们可能会有所不同。 毕竟它们在不同的 RPC 中使用。那么过度的耦合会起到相反的效果,变成技术债
由于您的模式实际上每条消息的字段不超过三个,因此我将保留所有内容。无论如何,如果你真的必须,你可以考虑以下几点:
- 在单独的消息中提取
GetLink
和GetBulkLinks
公共字段并与之组合:
message CustomerRequestParams {
int32 clientId = 1;
bool isProcess = 2;
}
message CustomerRequest {
CustomerRequestParams params = 1;
string resources = 2;
}
message BulkCustomerRequest {
CustomerRequestParams params = 1;
repeated string resources = 2;
}
StreamRequest
重复clientId
看起来很好。可以说,流在概念上不同于一元 RPC,因此只需将它们分开即可。而且只有一个字段。