我最近开始在我的 golang 项目中使用 protobuf。我在下面创建了简单的 protobuf 文件。我有三个不同的端点。GetLink接受CustomerRequest作为输入参数并返回CustomerResponseGetBulkLinks接受BulkCustomerRequest作为输入参数并返回BulkCustomerResponseStreaLinks接受StreamRequest作为输入参数并返回CustomerResponse我想知道是否有任何方法可以改进原始文件下面的内容,因为除了字段CustomerRequest之外BulkCustomerRequest几乎所有内容都相同resources,因此存在重复。输入参数也是如此,StreamRequest因为它只clientId作为输入参数。协议缓冲区中有什么可以重用其他消息类型的东西吗?有没有更好或更有效的方法来组织下面的原始文件,从而相应地重用消息?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;}
1 回答
蝴蝶刀刀
TA贡献1801条经验 获得超8个赞
协议缓冲区中有什么可以重用其他消息类型的东西吗?
组成。
但是请记住,请求和响应负载可能会随着时间而改变。即使他们今天看起来有共同点,但明天他们可能会分歧。毕竟它们在不同的 RPC 中使用。那么过度的耦合会达到相反的效果,变成技术债。
由于您的架构实际上每条消息不超过三个字段,因此我将保留所有内容。无论如何,如果你真的必须,你可以考虑以下几点:
在单独的消息中提取
GetLink
和GetBulkLinks
common 字段并使用它进行编写:
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 不同,因此只需将它们分开即可。这只是一个领域。
- 1 回答
- 0 关注
- 69 浏览
添加回答
举报
0/150
提交
取消