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

How to organize proto file to re-use message if possible?

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

我想知道是否有任何方法可以改进下面的原型文件,因为 CustomerRequestBulkCustomerRequest 除了 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?

Composition.

但是请记住,请求和响应负载可能会随着时间而改变。即使今天 看起来像 他们有一些共同点,明天他们可能会有所不同。 毕竟它们在不同的 RPC 中使用。那么过度的耦合会起到相反的效果,变成技术债

由于您的模式实际上每条消息的字段不超过三个,因此我将保留所有内容。无论如何,如果你真的必须,你可以考虑以下几点:

  • 在单独的消息中提取 GetLinkGetBulkLinks 公共字段并与之组合:
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,因此只需将它们分开即可。而且只有一个字段。