【发布时间】:2020-02-21 15:28:47
【问题描述】:
我有一个 GRPC API,经过重构,一些包被重命名。这包括我们定义 API 的原型文件之一中的 package 声明。像这样的:
package foo;
service BazApi {
rpc FooEventStream(stream Ack) returns (stream FooEvent);
}
改成
package bar;
service BazApi {
rpc FooEventStream(stream Ack) returns (stream FooEvent);
}
服务器端使用grpc-java 实现,顶部带有scala 和monix。
这对于使用新 proto 文件的客户端来说一切正常,但对于在旧 proto 文件之上构建的旧客户端,这会导致问题:UNIMPLEMENTED: Method not found: foo.BazApi/FooEventStream。
通过 GRPC API 传递的消息的实际数据格式没有改变,只有包。
由于我们需要保持向后兼容性,我一直在寻找一种方法来让旧客户端在保持名称更改的同时正常工作。
我希望使用通用的 ServerInterceptor 来完成这项工作,它能够检查来电,查看它来自旧客户端(我们在标头中有客户端版本)并将其重定向/转发到改名服务。 (因为只是包名发生了变化,这很容易弄清楚,例如foo.BazApi/FooEventStream -> bar.BazApi/FooEventStream)
但是,似乎没有一种优雅的方法可以做到这一点。我认为可以通过将新的ClientCall 启动到正确的端点,然后通过委托给ClientCall 在拦截器中处理ServerCall,但这将需要一堆管道代码来正确处理一元/clientStreaming/ serverStreaming/bidiStreaming 调用。
有没有更好的方法来做到这一点?
【问题讨论】: