首页 > 解决方案 > 如何在 go 模型中包装 proto 消息

问题描述

我目前正在使用 protobuf 将我们基于 rest api 的 go 服务迁移到 gRPC。这是一项包含大量 API 并且已经投入生产的大型服务,因此我不想进行太多更改来破坏现有系统。

所以我想用我的 go 模型作为事实的来源,并生成 .proto 消息,我想我可以用这个来管理 - Generate proto file from golang struct

现在我的 API 也期望根据定义的 go 模型的请求和响应,我将更改它们以使用 .proto 模型进行请求和响应。但是当请求/响应通过时,我想将它们包装在我的 go 模型中,然后其余代码不需要任何更改。

在这种情况下,如果请求很小,我可以简单地复制我的 go 模型中的所有字段,但如果请求很大或嵌套模型,这是一个大问题。

1)我这样做对吗?

2)不,正确的方法是什么?

3) 是的,我如何复制大原始消息以进行建模,反之亦然以进行响应?

标签: goprotocol-buffersgrpc

解决方案


如果您想使用 go 模型作为事实来源,为什么要使用 .proto 生成的模型来进行 REST 请求/响应?是因为您想使用proteus 服务生成(并在 REST 和 gRPC 之间共享代码)吗?

通常,如果您想从 REST 迁移到 gRPC,最常见的方法可能是使用grpc-gateway(请注意,从 1.10.x 开始,您可以在进程内使用它而无需借助反向代理),但这会成为“gRPC-first”,从中派生 REST,而您似乎想要“REST-first”,因为您的 REST API 已经投入生产。事实上,出于这个原因,grpc-gateway 可能并不完全适合,因为它可能会生成与现有端点略有不同的端点。这取决于您能承受多少破坏向后兼容性(也许您可以生成一组“v2”API 并将旧的“v1”保留一段时间,从而为现有客户端提供迁移时间)。


推荐阅读