如何将 Azure API 管理实例部署到多个 Azure 区域

可用性

重要

此功能仅在 API 管理的“高级”层中可用。

Azure API 管理支持多区域部署,这使 API 发布者能够将区域 API 网关添加到一个或多个受支持的 Azure 区域中的现有 API 管理实例。 此跨区域部署有助于减少地理分布式 API 使用者所感知的请求延迟,并且还能改善当其中一个区域处于离线状态时的服务可用性。

添加区域时,需配置:

  • 该区域将承载的规模单位数。

  • 可选区域冗余(如果该区域支持)。

  • 已添加区域中的虚拟网络设置(如果在现有区域或多个区域中配置了网络)。

重要

客户数据存储在异地。

关于多区域部署

  • 通过多区域部署,仅复制 API 管理实例的网关组件到多个区域。 实例的管理平面和开发人员门户仍仅托管在“主要”区域,即你最初部署服务的区域。

  • API 和策略定义等网关配置会在添加的主要区域和次要区域之间定期同步。 多区域部署提供 API 网关在多个区域的可用性,并在一个区域脱机时提供服务可用性。

  • 当 API 管理接收到主网关终结点的公共 HTTP 请求时,流量会根据最低延迟路由到区域网关,这可以减少地理分布性 API 使用者所经历的延迟。

  • 如果某个区域脱机,API 请求将自动路由到与发生故障的区域最靠近的下一个网关。

  • 如果主要区域脱机,API 管理平面和开发人员门户将不可用,但次要区域可继续使用最新的网关配置来处理 API 请求。

先决条件

  • 如果尚未创建 API 管理服务实例,请参阅创建 API 管理服务实例。 选择高级服务层级。
  • 如果你的 API Management 实例部署在虚拟网络中,请确保在你计划添加的位置在同一订阅内设置虚拟网络和子网。 若要启用区域冗余,请另外设置新的公共 IP。 请参阅虚拟网络先决条件

将 API 管理服务部署到其他位置

  1. 在 Azure 门户中导航到 API 管理服务,然后在左侧菜单中选择“位置”。
  2. 选择顶部栏中的“+ 添加”。
  3. 从下拉列表中选择已添加位置。
  4. 选择该位置中的缩放单元数。
  5. (可选)选择一个或多个“可用性区域”
  6. 如果 API Management 实例部署在虚拟网络中,请在位置中配置虚拟网络设置,包括虚拟网络、子网和公共 IP 地址(如果启用可用性区域)。
  7. 选择“添加”以确认。
  8. 重复此过程,直到配置所有位置。
  9. 选择顶部栏中的“保存”以开始部署过程。

删除 API 管理服务区域

  1. 在 Azure 门户中导航到 API 管理服务,然后在左侧菜单中选择“位置”。
  2. 若要删除位置,请使用表右端的“...”按钮选择上下文菜单。 选择“删除”。
  3. 确认删除,然后选择“保存”以应用更改。

将 API 调用路由到区域后端服务

在默认情况下,每个 API 都将请求路由到一个后端服务 URL。 即使在不同区域配置了 Azure API 管理实例,API 网关仍会将请求转发到只部署在一个区域中的相同后端服务。 在这种情况下,只有来自特定于该请求的区域的 Azure API 管理缓存响应才能提升性能,在全球范围内连接后端时仍可能导致较高的延迟。

为了充分利用系统的地理分布性,应将后端服务部署在 Azure API 管理实例所在的同一区域中。 然后,可以使用策略和 @(context.Deployment.Region) 属性将流量路由到后端的本地实例。

  1. 导航到 Azure API 管理实例,在左侧菜单中选择“API”。

  2. 选择所需的 API。

  3. 在“入站处理”的下拉箭头中选择“代码编辑器”。

    API 代码编辑器

  4. 结合使用 set-backendchoose 条件策略,在文件的 <inbound> </inbound> 节中构建适当的路由策略。

    例如,以下 XML 文件适用于“中国北部”和“中国东部”区域:

    <policies>
        <inbound>
            <base />
            <choose>
                <when condition="@("China North".Equals(context.Deployment.Region, StringComparison.OrdinalIgnoreCase))">
                    <set-backend-service base-url="http://contoso-backend-us.com/" />
                </when>
                <when condition="@("China East".Equals(context.Deployment.Region, StringComparison.OrdinalIgnoreCase))">
                    <set-backend-service base-url="http://contoso-backend-asia.com/" />
                </when>
                <otherwise>
                    <set-backend-service base-url="http://contoso-backend-other.com/" />
                </otherwise>
            </choose>
        </inbound>
        <backend>
            <base />
        </backend>
        <outbound>
            <base />
        </outbound>
        <on-error>
            <base />
        </on-error>
    </policies>
    

使用流量管理器管理到区域后端的路由

还可以使用 Azure 流量管理器来配置后端服务的前端,将 API 调用定向到流量管理器中,然后让流量管理器自动解析路由。

  • 对于流量分布和故障转移,建议将流量管理器与地理路由方法结合使用。 建议不要将流量管理器与加权路由方法一起用于 API 管理后端。

  • 对于维护操作期间的流量控制,建议使用优先级路由方法。

使用 API 管理区域网关的自定义路由

API 管理根据最低延迟将请求路由到区域网关。 尽管无法在 API 管理中替代此设置,但可以将自定义路由规则与自己的流量管理器结合使用。

  1. 创建自己的 Azure 流量管理器
  2. 如果使用自定义域,请将它与流量管理器结合使用,而不是与 API 管理服务一起使用。
  3. 在流量管理器中配置 API 管理区域终结点。 区域终结点遵循 https://<service-name>-<region>-01.regional.azure-api.cn URL 模式,例如 https://contoso-chinanorth2-01.regional.azure-api.cn
  4. 在流量管理器中配置 API 管理区域状态终结点。 区域状态终结点遵循 https://<service-name>-<region>-01.regional.azure-api.cn/status-0123456789abcdef URL 模式,例如 https://contoso-chinaeast-01.regional.azure-api.cn/status-0123456789abcdef
  5. 指定流量管理器的路由方法

禁用到区域网关的路由

在某些情况下,可能需要暂时禁用到某个区域网关的路由。 例如:

  • 添加新区域后,在配置和测试区域后端服务时将其保持禁用状态
  • 在某个区域的常规后端维护期间
  • 在模拟不可用区域的计划灾难恢复演练期间或在区域故障期间将流量重定向到其他区域

要禁用 API 管理实例中到区域网关的路由,请将网关的 disableGateway 属性值更新为 true。 可以使用创建或更新服务 REST API、Azure CLI 中的 az apim update 命令、set-azapimanagement Azure PowerShell cmdlet 或其他 Azure 工具设置该值。

注意

使用 API 管理的默认路由(而不是自定义路由解决方案)时,只能禁用到区域网关的路由。

要使用 Azure CLI 禁用区域网关,请执行以下操作:

  1. 使用 az apim show 命令显示为 API 管理实例配置的位置、网关状态和区域 URL。

    az apim show --name contoso --resource-group apim-hello-world-resource \
        --query "additionalLocations[].{Location:location,Disabled:disableGateway,Url:gatewayRegionalUrl}" \
        --output table
    

    示例输出:

    Location    Disabled    Url
    ----------  ----------  ------------------------------------------------------------
    China North 2   True        https://contoso-chinanorth2-01.regional.azure-api.cn
    China North True        https://contoso-chinanorth-01.regional.azure-api.cn
    
  2. 使用 az apim update 命令禁用可用位置(例如中国北部 2)中的网关。

    az apim update --name contoso --resource-group apim-hello-world-resource \
    --set additionalLocations[location="China North 2"].disableGateway=true
    

    更新可能需要几分钟时间。

  3. 验证定向到区域网关 URL 的流量是否已重定向到另一个区域。

如果要还原到区域网关的路由,请将 disableGateway 的值设置为 false

虚拟网络

本部分提供有关在虚拟网络中注入 API 管理实例时多区域部署的注意事项。

  • 独立配置每个区域网络。 该连接要求(例如已添加区域中的虚拟网络需要网络安全组规则)通常与主要区域中网络的连接要求相同。
  • 不同区域的虚拟网络不需要对等互连。

重要

在内部 VNet 模式下配置时,每个区域网关还必须在端口 1433 上与为 API 管理实例(仅在主要区域中)配置的 Azure SQL 数据库建立出站连接。 确保在为次要区域中的网络配置的任何路由或防火墙规则中,允许连接到此 Azure SQL 数据库的 FQDN 或 IP 地址;在这种情况下,无法使用 Azure SQL 服务标记。 若要在主要区域中查找 Azure SQL 数据库名称,请转到门户中 API 管理实例的“网络”>“网络状态”页。

IP 地址

  • 在每个添加了虚拟网络的区域中创建一个公共虚拟 IP 地址。 对于外部模式内部模式下的虚拟网络,此公共 IP 地址用于端口 3443 上的管理流量。

    • 外部 VNet 模式 - 还需要公共 IP 地址才能将公共 HTTP 流量路由到 API 网关。

    • 内部 VNet 模式 - 每添加一个虚拟网络,还会在每个区域中创建专用 IP 地址。 使用这些地址在网络中连接到主要区域和次要区域中的 API 管理终结点。

路由

  • 外部 VNet 模式 - 自动处理到区域网关的公共 HTTP 流量路由,方法与非网络 API 管理实例相同。

  • 内部 VNet 模式 - 默认情况下,不会将专用 HTTP 流量路由或负载均衡到区域网关。 用户拥有路由,并负责自行使用解决方案来管理跨多个区域的路由和专用负载均衡。

后续步骤