2

我想通过向后兼容性保护我的应用程序免受未来问题的影响。现在我有这个版本test.proto

syntax = "proto3";

service TestApi {
    rpc DeleteFoo(DeleteFooIn) returns (BoolResult) {}
    rpc DeleteBar(DeleteBarIn) returns (BoolResult) {}
}

message DeleteFooIn {
    int32 id = 1;
}

message DeleteBarIn {
    int32 id = 1;
}

message BoolResult {
    bool result = 1;
}

我对将结果消息更改DeleteBar()为“DeleteBarOut”之类的消息的情况感兴趣:

syntax = "proto3";

service TestApi {
    rpc DeleteFoo(DeleteFooIn) returns (BoolResult) {}
    rpc DeleteBar(DeleteBarIn) returns (DeleteBarOut) {}
}

message DeleteFooIn {
    int32 id = 1;
}

message DeleteBarIn {
    int32 id = 1;
}

message DeleteBarOut {
    reserved 1;
    string time = 2;
}

message BoolResult {
    bool result = 1;
}

问题是关于与旧.proto. 我可以将结果消息的名称从“BoolResult”更改为“DeleteBarOut”吗?

或者我应该保存消息的旧名称并编辑“BoolResult”的字段列表?但是,我怎样才能DeleteFoo()从这个解决方案中的任何更改中保存?

4

1 回答 1

0

像这样对 API 进行重大更改时,通常的做法是在转换时同时支持这两个版本。为此,您需要向version请求消息添加一个字段,然后在您的请求处理程序中,根据指定的版本将消息路由到不同的后端。一旦没有更多流量流向 v1 后端,您可以硬切换到 v2 并停止支持 v1。

不幸的是,如果您只是更改 RPC 定义而不进行版本控制,则无法避免服务器和客户端之间的版本不兼容。当然,另一种选择是添加一个新的 RPC 端点,而不是修改现有的端点。

通常,如果您要进行破坏性的 API 更改,您将度过一段不愉快的时光。

于 2019-05-03T17:09:03.223 回答