与 protobuf 共享 swagger (openapi) 类型定义

问题描述 投票:0回答:1

在我的项目中,我有 gRPC 和 HTTP 端点,它们分别有 swagger 和 proto 定义。现在,我遇到的问题是 swagger 和 proto 定义具有共享类型,例如,考虑这两个假设的定义:

swagger.yaml

...
paths:
  /users:
    get:
      summary: get list of all 
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: 'shared.yaml#/components/schemas/User'
...

protobuf.proto

...
message User {
    ...
}

message GetUsersReply {
    repeated User list = 1;
}

service MyGrpcService {
    rpc GetUsers (GetUsersRequest) returns (GetUsersReply) {}
}
...

在这个例子中,我有一个 User 实体,但是,它在两个地方(shared.yaml 和 protobuf.proto)都定义了,这非常不方便,为了更改 User 定义,我必须在两个地方都更改它们规范,两个地方同时进行,根据我的经验,这肯定会导致意外崩溃、构建失败等。我正在寻找一种解决方案,可以帮助我很好地构建我的应用程序,并为生产做好准备,如果你愿意的话。不可否认,我没有太多的制作经验来了解或了解这种场景类型,我在这里请求帮助我指导正确的方向。

我有几个想法可以帮助我解决这个问题,这些是:

  1. 给自己写一个实用程序,它就能解决这个问题。然而,我觉得我不是第一个发现这个问题的人,我一定错过了一些明显的解决方案。
  2. 使用第三方解决方案此处此处此处。但我觉得那些要么被放弃了,要么没有做我感兴趣的事情。

对于这个问题更具体,我正在使用 golang 来构建微服务。

go http swagger protocol-buffers grpc
1个回答
0
投票

因此,经过更多研究后,我决定使用@DazWilkin指出的grpc-gateway。我认为这与我的问题无关的原因是它使用 HTTP+JSON 包装 gRPC 端点,但事实证明,该存储库有一个专用选项仅生成 swagger (OpenAPI v2)。

在我的最终投票中,我实际上决定为我的项目使用 gRPC/HTTP 网关,原因有两个:

  1. 让代码更加干净统一
  2. 我正在从事的项目实际上不会有理由放弃或改变底层技术
© www.soinside.com 2019 - 2024. All rights reserved.