如果可能,如何组织 proto 文件以重用消息?

我最近开始在我的 golang 项目中使用 protobuf。我在下面创建了简单的 protobuf 文件。我有三个不同的端点。

  • GetLink接受CustomerRequest作为输入参数并返回CustomerResponse

  • GetBulkLinks接受BulkCustomerRequest作为输入参数并返回BulkCustomerResponse

  • StreaLinks接受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;

}


饮歌长啸
浏览 70回答 1
1回答

蝴蝶刀刀

协议缓冲区中有什么可以重用其他消息类型的东西吗?组成。但是请记住,请求和响应负载可能会随着时间而改变。即使他们今天看起来有共同点,但明天他们可能会分歧。毕竟它们在不同的 RPC 中使用。那么过度的耦合会达到相反的效果,变成技术债。由于您的架构实际上每条消息不超过三个字段,因此我将保留所有内容。无论如何,如果你真的必须,你可以考虑以下几点:在单独的消息中提取GetLink和GetBulkLinkscommon 字段并使用它进行编写:message CustomerRequestParams {&nbsp; int32 clientId = 1;&nbsp; bool isProcess = 2;}message CustomerRequest {&nbsp; CustomerRequestParams params = 1;&nbsp; string resources = 2;}message BulkCustomerRequest {&nbsp; CustomerRequestParams params = 1;&nbsp; repeated string resources = 2;}StreamRequest重复看起来就好了clientId。可以说,流在概念上与一元 RPC 不同,因此只需将它们分开即可。这只是一个领域。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go