@SamaraSoucy-MSFT 是正确的 - 所有选项都有效。最好的方法是非常主观的,但我将进一步详细说明 API 版本控制的具体选项。
API 版本控制与您的基础架构正交。如果您想将事物拆分为单独的应用程序或添加其他级别的隔离,这是一种受支持的方案。版本广告的概念对此进行了详细描述。简而言之,您的应用程序可以做广告未在该特定实现中托管的 API 版本。版本广告的实现方式有很多种,因此没有具体的指导。在最简单的模型中,您只需使用新的约定、属性等更新您的应用程序。但是,很可能希望不对现有部署进行任何更改。这意味着您需要想出一种方法来在应用程序之外更新此信息(例如:config、db 等)或放弃版本广告。这部分取决于每个实现的隔离程度。如果您不关心广告可用或已弃用的 API 版本,那么这不是问题。
使用 API 版本控制至少有 4 种方法可以实现您的目标。
选项 1 - 复制、粘贴、替换
复制、粘贴、替换(CPR) 方法涉及从字面上将服务的先前版本复制并粘贴到新文件夹和新代码命名空间中。这在不更改原始版本的情况下形成了先前版本的新版本的基线。然后根据需要替换新版本中的差异。这个过程可以重复多久,只要你愿意。
如果版本之间的更改相当小,这可能是一个非常简单且有效的策略。一个关键的缺点是随着时间的推移膨胀和实现耦合。如果您有可靠的版本控制策略(例如N-2),那么可以最大限度地减少影响。最大的挑战是进行重大的实施更改,这对共同主持没有意义或可能导致更改以前的版本。这样的示例将尝试在同一实现中1.0
使用 ASP.NET Web API 和ASP.NET Core 托管。2.0
我已经看到这种方法使用了几次,它可能是有效的。
选项 2 - 注入和编写
在此变体中,您将在单独的 API 程序集中实现每个版本。您将拥有一个 API 主机应用程序,该应用程序从每个版本化程序集中注入和组合所有 API。这提供了实现之间的完全隔离,仍然具有 API 版本控制的所有好处。
像选项 1一样,您仍然必须考虑臃肿;特别是因为每个程序集可能具有不同的依赖项。托管为不同平台编写的 API 也非常困难,但在技术上应该是可行的。
选项 3 - 主机头映射
大多数 Web 服务器都有某种方式将Host
标头映射到不同的应用程序。您可以使用此技术将应用程序的每个版本托管为独立的应用程序。
选项 4 - 网关
使用网关提供了最大的灵活性,但设置起来可能最具挑战性。此方法可以使用任意数量的路由方法,例如 DNS、URL 重写或基于请求中可用版本信息的 URL 重定向。端点很可能是一个孤立的应用程序,例如在选项 3中。网关负责将请求转发或重定向到正确的版本端点。
我松散地使用术语网关。这可以是现有的服务或平台、基于硬件的或您自己的定制设计。这将取决于您的需求以及开箱即用的解决方案是否可以满足这些需求。
其他注意事项
这些当然不是唯一的选择,也不是相互排斥的。您可以组合它们的任何变体以满足您的需求。
选择选项 3或选项 4将对 API 版本控制带来一些挑战,因为物理隔离屏障超越了每个已部署的应用程序。您要么需要想出一种方法来更新广告版本,要么完全放弃这个概念 - 如上所述。如果您最终根本没有发布版本,那么每个部署的实现都应该是一个单独的、独立的代码库,这可能根本不需要 API 版本控制,因为它是在抽象层处理的。
您的整体版本控制策略和政策也将发挥作用。如果您在您的服务中使用对称版本,则 URL 设计和 API 版本是一致的,但会附带添加的部署来满足此要求。如果您选择拥有独立的、不断发展的服务,那么版本发现和广告就会变得更加有趣。例如,您的政策可能规定已弃用的版本将在 6 个月后停用。然后,客户端应通过检测响应标头来检测此广告。api-deprecated-versions
可以通过HEAD
and/orOPTIONS
方法支持版本发现。