Protocol buffers 具有protobuf文件的grpc的典型组织

Protocol buffers 具有protobuf文件的grpc的典型组织,protocol-buffers,rpc,grpc,Protocol Buffers,Rpc,Grpc,我正在使用gRPC在服务和protobuf序列化之间进行通信。我以前没有真正使用过RPC,我想知道什么是用于proto文件的最佳结构?目前,我在一个产品中拥有所有原型文件,布局示例如下: protos/ identity/ models/ Member.proto MemberService.proto vault/ models/ Authentication.proto Session.proto HttpHea

我正在使用gRPC在服务和protobuf序列化之间进行通信。我以前没有真正使用过RPC,我想知道什么是用于proto文件的最佳结构?目前,我在一个产品中拥有所有原型文件,布局示例如下:

protos/
  identity/
    models/
      Member.proto
    MemberService.proto
  vault/
    models/
      Authentication.proto
      Session.proto
      HttpHeader.proto
    AuthenticationService.proto
我认为我应该将模型与实际的服务定义分开,这样我就可以导入单个模型而不需要整个服务

然后,每个服务都有以下布局

synatx "proto3";

import "models/Session.proto"

message GetRequest {
  uint64 member_id;
}

message GetResponse {
  Session session;
}

rpc AuthenticationService {
  get (GetRequest) returns (GetResponse);
}

有没有更规范的方法来做到这一点?我是否应该将模型“消息”定义包含在与我的服务相同的文件中?仅使用一个
身份验证.proto
模型导入“./protos gen/AuthenticationService.grpc.h”似乎很奇怪。

通常,人们将服务定义放在消息协议旁边。只有当协议变得非常大时,人们才会将其分解,但即使这样也很少见


构造protos的标准方法是使用一个高级根目录,并根据其绝对路径引用所有protos,甚至同一目录中的同级。将服务与消息类型分开的主要原因是生成的代码太大。这是不常见的。

因此标准方法实际上只是protos/{AuthenticationService.proto,MemberService.proto,xyzService.proto}“然后把所有东西都放到服务文件中。这似乎很奇怪,我不能在不导入整个服务的情况下传递消息,但我很欣赏这种见解。根据我的经验,人们没有非常大的接口,所以原型文件从来没有真正变得那么大。如果需要,可以将服务部分从消息中分离出来,但要将它们保存在同一个proto包和同一个目录级别中。