为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
饮歌长啸 2022-11-08 16:24:47
我最近开始在我的 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 中使用。那么过度的耦合会达到相反的效果,变成技术债。

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

  • 在单独的消息中提取GetLinkGetBulkLinkscommon 字段并使用它进行编写:

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 不同,因此只需将它们分开即可。这只是一个领域。


查看完整回答
反对 回复 2022-11-08
  • 1 回答
  • 0 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信