REST API:多个版本,单个应用程序?[已关闭]

2022-09-03 03:08:14

我正在开发一个 REST API,我将不得不很快引入一些重大更改,因此需要一个 v2。我们仍然需要同时支持 v1 几个月,以便让我们的客户有时间在准备就绪时切换到新的 API。我们的API通过共享云提供,我们所有的客户共享相同的系统后端,特别是单个共享数据库。

我发现很多关于REST API版本控制的文章,但它们都更多地是从客户的角度出发,或者从高级设计的角度来看的。这不是我真正关心的问题,我们的API已经在URI中进行了版本控制,因此提供具有/v2基本路径的服务不会是aploblem。

然而,我问自己,我将如何实际实现这一点,我还没有找到关于这一点的好文章。我真的不想分支我的项目的v2,然后构建和部署v1和v2作为单独的应用程序,因为这样我会在两个应用程序中进行维护,错误修复,配置更改等,这是双重工作并且带有冗余的常见危险(即:版本之间可能存在的不一致)。此外,v2当然在每个服务中都没有不同,因此大多数代码仍然是相同的。

对于如何在单个应用程序中从技术上实现 REST API,该应用程序向外部提供多个版本,并且共享一些代码(即:v2 / someService 将在内部重定向到 v1 / someService),并且仅在新服务中编码实际差异,是否有任何最佳实践?也许甚至有框架可以帮助设计这个?该应用程序是用Java和Spring MVC编码的,如果这有帮助的话。

我非常感谢有关如何解决此问题的任何提示或资源。谢谢!


答案 1

希望你看到

  1. API 设计确保向后兼容性
  2. http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/32713.pdf

在同一应用程序中拥有两个版本的 API 足够安静

api.mysite.com/[version1]/api/url

api.mysite.com/[version2]/api/url

不确定为什么需要将 v1 和 v2 作为单独的应用程序进行构建和部署?除非您计划在生产环境中进行零停机时间滚动升级


答案 2

我喜欢在讨论中提出以下策略,两者都是持续交付中的策略。

分支抽象

基本思想是在客户端和当前实现之间放置一个抽象层。然后在抽象层后面引入第二个实现。这使您有机会在正常代码库中取得进展,但会立即支持下一版本API的新功能。

https://martinfowler.com/bliki/BranchByAbstraction.html

功能切换

向代码库添加功能,而不使其对客户可见。这使您可以留在主开发分支上,即使尚未为最终用户做好准备。

https://martinfowler.com/articles/feature-toggles.html


推荐