API 管理中的后端

适用于:所有 API 管理层级

API 管理中的后端(或 API 后端)是实现前端 API 及其操作的 HTTP 服务 。

在导入某些 API 时,API 管理会自动配置 API 后端。 例如,API 管理会在导入以下项时配置后端 Web 服务:

API 管理还支持使用其他 Azure 资源作为 API 后端,例如:

后端的优点

API 管理支持后端实体,方便你管理 API 的后端服务。 后端实体会封装有关后端服务的信息,提高在各 API 中的可重用性并改进了治理。

对以下一个或多个项使用后端:

  • 为向后端服务发出的请求的凭据授权
  • 如果已为标头或查询参数身份验证配置了命名值,则可利用 API 管理功能来维护 Azure Key Vault 中的机密。
  • 定义断路器规则来保护后端,以免请求过多
  • 将请求路由或均衡负载到多个后端

请通过 Azure 门户或者 Azure API 或工具配置和管理后端实体。

使用 set-backend-service 策略来引用后端

创建后端后,可在 API 中引用该后端。 使用 set-backend-service 策略将传入的 API 请求定向到后端。 如果已为 API 配置了后端 Web 服务,则可以改为使用 set-backend-service 策略将请求重定向到后端实体。 例如:

<policies>
    <inbound>
        <base />
        <set-backend-service backend-id="myBackend" />
    </inbound>
    [...]
<policies/>

可以将条件逻辑与 set-backend-service 策略结合使用,根据位置、调用的网关或其他表达式来更改有效的后端。

例如,下面是一个基于调用的网关将流量路由到另一个后端的策略:

<policies>
    <inbound>
        <base />
        <choose>
            <when condition="@(context.Deployment.Gateway.Id == "factory-gateway")">
                <set-backend-service backend-id="backend-on-prem" />
            </when>
            <when condition="@(context.Deployment.Gateway.IsManaged == false)">
                <set-backend-service backend-id="self-hosted-backend" />
            </when>
            <otherwise />
        </choose>
    </inbound>
    [...]
<policies/>

断路器

API 管理在后端资源中公开了断路器属性,以防止后端服务因请求过多而过载。

  • 断路器属性定义断路器的跳变规则,例如,在定义的时间间隔内故障条件的数量或百分比,以及指示故障的状态代码范围。
  • 当断路器发生跳变时,API 管理在定义的时间内将停止向后端服务发送请求,并将“503 服务不可用”响应返回到客户端。
  • 在配置的跳变持续时间过后,线路将重置,流量将恢复到后端。

后端断路器是一种断路器模式的实现方式,允许后端从过载情况中恢复。 它扩充了常规速率限制并发限制策略,实施这些策略可以保护 API 管理网关和后端服务。

注意

  • 目前,API 管理的消耗层不支持后端断路器
  • 由于 API 管理体系结构的分布式特性,断路器跳闸规则是近似的。 网关的不同实例不同步,并且将根据同一实例上的信息应用断路器规则。
  • 目前,只能为后端断路器配置一条规则。

示例

使用 API 管理 REST API、Bicep 或 ARM 模板在后端配置断路器。 在以下示例中,当 1 小时内出现三个或更多表示服务器错误的 5xx 状态代码时,API 管理实例 myAPIM 中 myBackend 的断路器就会跳闸

断路器将在 1 小时后重置。 如果响应中存在 Retry-After 标头,断路器会接受该值,并等待指定时间后再次向后端发送请求。

在具有断路器的后端资源的 Bicep 模板中包含类似于以下内容的代码片段:

resource symbolicname 'Microsoft.ApiManagement/service/backends@2023-09-01-preview' = {
  name: 'myAPIM/myBackend'
  properties: {
    url: 'https://mybackend.com'
    protocol: 'http'
    circuitBreaker: {
      rules: [
        {
          failureCondition: {
            count: 3
            errorReasons: [
              'Server errors'
            ]
            interval: 'PT1H' 
            statusCodeRanges: [
              {
                min: 500
                max: 599
              }
            ]
          }
          name: 'myBreakerRule'
          tripDuration: 'PT1H'  
          acceptRetryAfter: true
        }
      ]
    }
   }
 }

负载均衡池

当想要为 API 实现多个后端,并在这些后端之间均衡负载请求时,API 管理支持使用后端池

将后端池用于以下场景:

  • 将负载分散到多个后端,这些后端可能具有单独的后端断路器。
  • 将负载从一组后端转移到另一组后端进行升级(蓝绿部署)。

若要创建后端池,请将后端的 type 属性设置为 pool 并指定构成该池的后端列表。

注意

  • 目前,只能在后端池中包含单个后端。 不能将 pool 类型的后端添加到另一个后端池。 一个池中最多可包含 30 个后端。
  • 由于 API 管理体系结构的分布式特性,后端负载均衡是近似的。 网关的不同实例不同步,并且将根据同一实例上的信息进行负载均衡。

负载均衡选项

API 管理支持以下后端池负载均衡选项:

  • 轮循机制:默认情况下,请求均匀分布在池中的后端。
  • 加权:为池中的后端分配权重,并根据分配给每个后端的相对权重在后端之间分布请求。 对于执行蓝绿部署等方案,请使用此选项。
  • 基于优先级:后端划分为各优先级,请求按优先级组的顺序发送到后端。 在一个优先级组内,请求可以均匀分布到后端,也可以根据分配给每个后端的相对权重(如果已分配)进行分布。

注意

仅当高优先级组中的所有后端都因触发断路器规则而不可用时,才会使用低优先级组中的后端。

示例

使用 API 管理 REST API、Bicep 或 ARM 模板来配置后端池。 在以下示例中,API 管理实例 myAPIM 中的后端 myBackendPool 配置了后端池。 池中的示例后端名为 backend-1 和 backend-2。 两个后端都在最高优先级组中;在该组中,backend-1 的权重大于 backend-2

在具有负载均衡池的后端资源的 Bicep 模板中加入类似于以下内容的代码片段:

resource symbolicname 'Microsoft.ApiManagement/service/backends@2023-09-01-preview' = {
  name: 'myAPIM/myBackendPool'
  properties: {
    description: 'Load balancer for multiple backends'
    type: 'Pool'
    pool: {
      services: [
        {
          id: '/subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ApiManagement/service/<APIManagementName>/backends/backend-1'
          priority: 1
          weight: 3
        }
        {
          id: '/subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ApiManagement/service/<APIManagementName>/backends/backend-2'
          priority: 1
          weight: 1
        }
      ]
    }
  }
}

限制

  • 对于“开发人员”层级和“高级”层级,在内部虚拟网络中部署的 API 管理实例可能会在网关终结点 URL 和后端 URL 相同时引发 HTTP 500 BackendConnectionFailure 错误。 如果遇到此限制,请按照技术社区博客中内部虚拟网络模式下的自链式 API 管理请求限制一文的说明操作。
  • 目前,只能为后端断路器配置一条规则。