Java Spring Boot微服务API版本控制实现

Java Spring Boot微服务API版本控制实现,java,spring-boot,microservices,Java,Spring Boot,Microservices,需要修改Spring Boot微服务的现有契约(请求/响应有效负载),这本质上是破坏性的更改(不向后兼容)。在某个时候之前,必须支持合同的两个版本,直到所有客户升级到新版本 为了实现这一点,已经决定使用URL版本控制策略(如/v1/{resource}和/v2/{resource}) 现在的问题是,在代码中实现这一点的最佳方式是什么? 下面是两个建议的解决方案 分支出版本1(/v1)代码并单独维护,直到支持此版本。 这本质上意味着从主分支上切断分支,从该分支上构建/部署,并维护同一服务的两个实例

需要修改Spring Boot微服务的现有契约(请求/响应有效负载),这本质上是破坏性的更改(不向后兼容)。在某个时候之前,必须支持合同的两个版本,直到所有客户升级到新版本

为了实现这一点,已经决定使用URL版本控制策略(如/v1/{resource}和/v2/{resource})

现在的问题是,在代码中实现这一点的最佳方式是什么? 下面是两个建议的解决方案

  • 分支出版本1(/v1)代码并单独维护,直到支持此版本。 这本质上意味着从主分支上切断分支,从该分支上构建/部署,并维护同一服务的两个实例,每个实例分别支持v1和v2版本

  • 在同一主分支中,引入一个单独的包(如service.api.v2.request),将所有api有效负载请求/响应类放在其中,并引入一个新的端点控制器来支持(/v2)。这种方法允许单个实例同时支持这两个版本


  • 以上哪一项是更好的方法?或者是否有其他标准/更好的替代方案来实现这一点?Spring Boot是否为这些需求提供了现成的支持?

    这取决于控制器背后有多少通用性。如果从后端到各个版本都存在显著差异,则可能更容易使用不同的分支,但如果主要差异在于控制器路径以及这些方法中涉及的输入和输出对象,则两个分支可能会导致将更改应用于两者的痛苦,记住每次都要这样做——这种情况迟早会错过一个重要的修复


    这都是一种平衡,您需要权衡您案例中方法的维护成本,包括时间和精力,错误风险,以及单独部署的成本。

    Hmm。。我明白你的意思。但是,我有兴趣了解一下一般是如何做到的。在微服务架构中是否有任何标准或推荐的实现方法?我怀疑,根据您阅读的内容,您会发现人们认为这两种方法都是标准的。我认为,与许多与微服务或API相关的东西一样,有标准的方法来定义事物从外部看的样子,例如客户机如何决定他们使用的版本,但实现的标准方法较少。我倾向于在微服务问题上寻求Netflix的可靠和可信赖的意见,尽管我知道他们现在已经放弃了大部分内部开发。