当前位置: 首页 > 知识库问答 >
问题:

如何为不同的gRPCendpoint重用proto-buffer消息?

韦泳
2023-03-14

我有一个Go应用程序,它使用原始缓冲区(准确地说是原型3)。

此应用程序有两个endpoint,A和B定义如下:

rpc A(ARequest) returns (AResponse) {
  option (google.api.http) = {
    post: "/someURLA"
    body: "*"
  };
}
rpc B(BRequest) returns (BResponse) {
  option (google.api.http) = {
    put: "/someURLB"
    body: "*"
  };
}

以下是他们使用的消息:

message ARequest {
    // Blah Blah Blah
}

message BRequest {
    // Blah Blah Blah   
}

message AResponse {
    // Blah Blah Blah
}

message BResponse {
    // Blah Blah Blah   
}

endpointA和B实际上需要相同的输入格式和输出格式。因此,ARequest与BRequest相同,而AResponse与BResponse相同。但是,原始文件中这些重复的定义是非常浪费的,可能会产生分歧。所以我改成这样:

rpc A(AOrBRequest) returns (AOrBResponse) {
  option (google.api.http) = {
    post: "/someURLA"
    body: "*"
  };
}
rpc B(AOrBRequest) returns (AOrBResponse) {
  option (google.api.http) = {
    put: "/someURLB"
    body: "*"
  };
}

message AOrBRequest {
    // Blah Blah Blah
}

message AOrBResponse {
    // Blah Blah Blah
}

但是当我这样做的时候,我在编译过程中遇到了这些错误:

Name of request type "AOrBRequest" should be "ARequest".
Name of response type "AOrBResponse" should be "AResponse"
Name of request type "AOrBRequest" should be "BRequest".
Name of response type "AOrBResponse" should be "BResponse"

那么如何让这两个endpoint对请求和响应重用相同的消息呢?


共有1个答案

郑高驰
2023-03-14

可以使用import语句重用消息定义。

您可以通过导入其他. proto文件来使用它们中的定义。要导入另一个. proto的定义,您可以在文件顶部添加一个导入语句:

import "myproject/other_protos.proto";

例如,如果您下载了协议缓冲区二进制包,存档中的readme.txt会显示:

如果要使用包含的已知类型,请不要忘记将include目录的内容也复制到某处,例如复制到usr/local/include/code中。

如果您已经这样做了,您现在可以导入(或重复使用,如您所说)Google定义的消息。

syntax = "proto3";

package mypackage;

import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";

service Bla {
    rpc ResetUserPW(UserEmail) returns (google.protobuf.Empty) {}
    rpc ServerTime(google.protobuf.Empty) returns (google.protobuf.Timestamp) {}
}

message UserEmail {
    string email = 1;
    CallBackUrl url = 2;
}
 类似资料:
  • 我正在使用由Visual Studio生成的gRPC服务项目。我有两个原型文件位于同一个“原型”目录中。我有一个原型,另一个原型文件有导入。它似乎找到了文件,但我无法引用来自另一个文件的任何消息。当我这样做时,我得到一个“blahblah”是未定义的错误。我已经拍摄了一些情况的屏幕截图。任何帮助都将不胜感激!

  • 我有一个名为myPro s的库,看起来像这样 我有一个。外部调用的proto文件称为示例。应该导入hello的proto。协议 所以文件的顶部看起来像这样: 现在,当我编译示例时。proto在示例中出现导入错误。pb。go因为它有导入行import“path/to/myProtos/proto/hello.pb.go” 我尝试添加两个导入路径,但出现“导入但未使用”错误。我还尝试进行相对导入,并将

  • 我有玩家类和敌人类,它们都已经扩展了一个游戏类(libgdx)。现在我可以看到玩家和敌人类共享很多公共代码,我可以做一个抽象并将所有必要的代码放在那里,但是玩家类已经从游戏扩展到了敌人类。 玩家和敌人的职业都有其他职业也会调用的方法。 球员级别 敌方阶级 有没有办法让我把这些方法存储在一个类中,然后在这个类中再次重用它们?

  • 我有如下定义的protobuf消息。我需要从属性名称中找到消息类型。例如,当输入为“cfgMsg”时,输出应为ConfigMsg或CfgServerMsg。ConfigMsg(全名)。 我有下面的代码。然而,这适用于定义良好的类型,如string、int、float等,对于消息,它只打印“message”作为输出。 我删除了一些代码,只展示了与这个问题相关的代码。所以这显然不是完整的代码。 输出:

  • 企业中不同职位、不同职级、不同场景下都会有不同的用车制度,系统支持按照不同场景配置制度,并且支持每个员工拥有不同制度。 配置方法 1、单个员工配置 选择需要配置员工 选择该员工适用的企业支付制度 2、批量配置 批量为员工匹配制度有两种方式: 在界面中直接操作和上传员工的手机号码进行编辑。 ①在界面中直接操作 从界面中筛选出需要操作的员工,点击编辑  对选定的员工设置权限 可对选中的员工进行增加、移

  • 面试题 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性? 面试官心理分析 其实这是很常见的一个问题,这俩问题基本可以连起来问。既然是消费消息,那肯定要考虑会不会重复消费?能不能避免重复消费?或者重复消费了也别造成系统异常可以吗?这个是 MQ 领域的基本问题,其实本质上还是问你使用消息队列如何保证幂等性,这个是你架构里要考虑的一个问题。 面试题剖析 回答这个问题,首先你别听到重复消息这个