如何将流量例程化到不同的服务版本但具有相同的原型包名称?

How to routine traffic to different service version but having the same proto package name?

我们使用 SemVer 来标记我们的服务,但在所有原型文件中保留相同的“package v1”。
例如,我们的 git 标签可以是“v.1.1.1”,然后是“v1.2.0”,但所有 .proto 文件仍然具有相同的“package v1”。原因是我们不想在所有文件中更改它。
现在我们要部署“v1.1.1”和“v1.2.0”以进行某种 blue/green 部署,并使用特殊的客户端代码来测试新版本。
如果这是一个 REST API,客户端代码可以简单地在他们的路径中包含版本,那么我们可以在网关上有一些重写规则,我想我可以做同样的事情,但问题似乎是生成客户端代码(至少对于 Golang)不会让我覆盖路径。有没有办法从 gRPC 中“原生”做到这一点?
也许我们一开始就做错了。

将不同版本的服务器部署到不同的主机|端口,即

  • v1.1.1 --> :10111
  • v1.2.0 --> :10120

如果原型没有改变,那么原型版本不应该改变,但是你的实现(客户端或服务器)将版本独立于原型是完全合理的。

因为原型是相同的(版本),发送/接收(在线)的消息不会改变,所以你只能在 gRPC 之外消除这些服务的歧义,即将它们放在不同的端点上。

另一种可以做到这一点的方法是将客户端|服务器版本元数据注入到消息中。然后,您可以在两端读取这些(拦截器)以确定它们源自哪个实现版本。