go - gRPC GO 中动态定义的消息

标签 go grpc grpc-go

我是 Go 中 gRPC 的新用户。

我已经完成了关于客户端流API的代码。现在我有一个问题。

据我所知,我们必须在proto文件中定义消息结构,然后协议(protocol)基于这个定义的消息结构来生成代码。就我而言,protoc 生成 Go 代码。但这个过程限制了客户端或服务器重用API。例如,使用客户端流API,首先,客户端使用该API将温度数据发送到服务器。那么如果客户端想要向服务器发送GPS坐标,则必须重新定义消息结构,因为温度的结构与GPS坐标的结构不同。但出于同样的目的,向服务器发送数据。

syntax = "proto3";
package calculator;
option go_package="calculatorpb";
message TemperatureRequest{
     float num =1;
}
message TemperatureResponse{
     float result =1;
}
message CoordinatesRequest{
     float long =1;
     float lat =1;
}
message CoordinatesResponse{
     float result =1;
}
service  CalculatorService{
   rpc Temperature(stream AverageRequest) returns (AverageResponse){} //client streaming for temperature    
   rpc Coordinates(stream CoordinatesRequest) returns (CoordinatesResponse){} //client streaming  for  Coordinates
}

好像不太方便。

那么,客户端如何在 go 中使用 gRPC 的动态消息结构呢?

如果是,请给我一个客户端流 API 的示例。

最佳答案

使用Any消息类型:

syntax = "proto3";

import "google/protobuf/any.proto";

message Example {
    string id = 1;
    google.protobuf.Any message = 2;
}

使用Any,您可以使用任何用户定义的原型(prototype)消息,同时您还需要使用一些常见的存储库或注册表与客户端共享新的原型(prototype)消息。

关于go - gRPC GO 中动态定义的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66785776/

相关文章:

go - dep init 上的“不在已知的 GOPATH/src 中”错误

c# - 将 C# GRPC 客户端连接到 Go Server

go - 如何将 row.Scan() int32 转换为 Golang gRPC protobuf Enum 字段?

go - 无法在 Visual Studio Code 中安装 Go 扩展

http - 用于 http.request 的 golang 多个 parseBody

java - 从这个 .proto 文件生成代码后,这个特定的函数是如何产生的?

c++ - 如何从客户端关闭 gRPC 服务器(使用 RPC 功能)

go - golang 中 server.GracefulStop() 的行为

flutter - 在哪里放置一个函数来触发 flutter/dart 应用程序的退出/停止/关闭事件?

file - 需要在golang中生成运行时二进制编码文件