猿问

Go protobuf 中单独消息和服务定义的最佳实践?

分离(特定于 Go 的)协议缓冲区中服务中使用的消息声明的最佳做法是什么?上下文是具有多个 gRPC 服务的大型应用程序。某些消息在多个服务中使用。我们的想法是划分消息和服务的定义,就像这样(简化一点):


airline/pb/airline_messages.proto:


syntax = "proto3";

option go_package = "github.com/example.com/example-repo/airline/pb";


message Airline {

    string code = 1;

    string name = 2;

    string country = 3;

}

airline/pb/airline_services.proto:


syntax = "proto3";

option go_package = "github.com/example.com/example-repo/airline/pb";

import "airline/pb/airline_messages.proto"


service AirlineService {

    rpc GetAirline(string) returns (Airline) {}

    rpc GetAirlines(GetAirlinesRequest) returns (repeated Airline) {}

}


message GetAirlinesRequest {

    int max = 1;

    string country = 2;

    string pattern = 3;

    string sortby = 4;

}

我这样打电话:protoc


protoc --go_out=. \

   --go_opt=paths=source_relative \

   --go-grpc_out=. \

   --go-grpc_opt=paths=source_relative \

   --proto_path=. \

   --proto_path=../../ airline_services.proto

这不起作用,因为未定义。像这样调用它:Airline


protoc ... airline_services.proto airline_messages.proto

生成一条错误消息,即航空公司被乘以定义。这样做:


protoc ... airline_messages.proto

protoc ... airline_services.proto

只是覆盖了Go文件,相当于编译。airline_services.proto


能够在多个服务中重用消息定义的最佳实践是什么?


慕勒3428872
浏览 129回答 1
1回答

喵喵时光机

不确定它是否有帮助,或者您是否正在使用不同版本的Go生成器。我在一个目录中有多个*.proto文件。其中一些导入其他:部分导入:device.protostatus.protosyntax = "proto3";package somePackage;import "status.proto";option go_package = "goPackageName";service Device {    rpc GetStatus (GetStatusRequest) returns (Status) {}}message GetStatusRequest {    // ...}包含消息:status.protoStatussyntax = "proto3";package somePackage;option go_package = "goPackageName";message Status {    int32 customer = 1;    string device_id = 2;    // ...}我用以下命令生成 Go 代码:protoc --go_out=plugins=grpc:. --go_opt=paths=source_relative *.proto注意:我仍然使用旧的Go protobuf。github.com/golang/protobuf
随时随地看视频慕课网APP

相关分类

Go
我要回答