在我的项目中,我有 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 定义,我必须在两个地方都更改它们规范,两个地方同时进行,根据我的经验,这肯定会导致意外崩溃、构建失败等。我正在寻找一种解决方案,可以帮助我很好地构建我的应用程序,并为生产做好准备,如果你愿意的话。不可否认,我没有太多的制作经验来了解或了解这种场景类型,我在这里请求帮助我指导正确的方向。
我有几个想法可以帮助我解决这个问题,这些是:
对于这个问题更具体,我正在使用 golang 来构建微服务。
因此,经过更多研究后,我决定使用@DazWilkin指出的grpc-gateway。我认为这与我的问题无关的原因是它使用 HTTP+JSON 包装 gRPC 端点,但事实证明,该存储库有一个专用选项仅生成 swagger (OpenAPI v2)。
在我的最终投票中,我实际上决定为我的项目使用 gRPC/HTTP 网关,原因有两个: