我一直在阅读针对 ReST API 的版本控制策略,它们似乎都没有涉及到如何管理底层代码库。
假设我们正在对一个 API 进行一系列重大更改——例如,更改 Customer 资源,使其返回单独的 forename
和 surname
字段,而不是单个 name
字段。(对于本例,我将使用 URL 版本控制解决方案,因为它很容易理解所涉及的概念,但是这个问题同样适用于内容协商或自定义 HTTP 头)
我们现在在 http://api.mycompany.com/v1/customers/{id}
有一个端点,在 http://api.mycompany.com/v2/customers/{id}
有另一个不兼容的端点。我们仍然在发布 v1 API 的 bug 修复和安全更新,但是新的特性开发现在都集中在 v2上。我们如何编写、测试和部署对 API 服务器的更改?我至少可以看到两种解决方案:
Use a source control branch/tag for the v1 codebase. v1 and v2 are developed, and deployed independently, with revision control merges used as necessary to apply the same bugfix to both versions - similar to how you'd manage codebases for native apps when developing a major new version whilst still supporting the previous version.
Make the codebase itself aware of the API versions, so you end up with a single codebase that includes both the v1 customer representation and the v2 customer representation. Treat versioning as part of your solution architecture instead of a deployment issue - probably using some combination of namespaces and routing to make sure requests are handled by the correct version.
分支模型的明显优势在于,删除旧的 API 版本很容易——只要停止部署适当的分支/标记即可——但如果运行多个版本,最终可能会产生一个非常复杂的分支结构和部署管道。“统一代码库”模型避免了这个问题,但是(我认为?)将使得从代码库中删除不再需要的资源和端点变得更加困难。我知道这可能是主观的,因为不太可能有一个简单的正确答案,但我很好奇组织是如何维护跨多个版本的复杂 API 来解决这个问题的。