API 管理中的後端
適用於:所有 APIM 階層
API 管理中的「後端」 (或 API 後端) 是一種 HTTP 服務,可實作您的前端 API 及其作業。
匯入特定 API 時,API 管理會自動設定 API 後端。 例如,API 管理在匯入時設定後端 Web 服務:
- OpenAPI 規格。
- SOAP API。
- Azure 資源,例如 HTTP 觸發的 Azure Function 應用程式或邏輯應用程式。
API 管理也支援使用其他 Azure 資源做為 API 後端,例如:
- Service Fabric 叢集。
- 自訂服務。
後端的優點
APIM 支援後端實體,因此您可以管理 API 的後端服務。 後端實體會封裝後端服務的相關資訊,促進跨 API 的重複使用性,並改善治理。
針對下列一或多個項目使用後端:
- 授權對後端服務的要求認證
- 如果已針對標頭或查詢參數驗證設定具名值,請利用 APIM 功能來維護 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/>
斷路器
APIM 會在後端資源中公開斷路器屬性,以保護後端服務不至負荷過多要求。
- 斷路器屬性會定義規則來中斷斷路器,例如定義時間間隔期間失敗狀況的數目或百分比,以及指出失敗的狀態代碼範圍。
- 斷路器跳脫時,API 管理會在定義的時間內停止將要求傳送至後端服務,並將 503 服務無法使用的回應傳回給用戶端。
- 設定的跳脫持續時間之後,線路會重設,流量會繼續傳到後端。
後端斷路器是斷路器模式的實作,可讓後端從多載情況復原。 其可增強一般速率限制和並行限制原則,您可以實作這些原則來保護 API 管理閘道和後端服務。
注意
- 目前,API 管理的取用層不支援後端斷路器。
- 由於 API 管理架構的分散式本質,斷路器跳脫規則大致近似。 網路閘道的不同執行個體不會同步處理,而且會根據相同執行個體上的資訊套用斷路器規則。
範例
使用 API 管理 REST API 或 Bicep 或 ARM 範本,在後端設定斷路器。 在下列範例中,當有三個以上的 5xx
狀態碼指出伺服器在 1 小時內發生錯誤時,在 APIM 執行個體 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: 'https'
circuitBreaker: {
rules: [
{
failureCondition: {
count: 3
errorReasons: [
'Server errors'
]
interval: 'PT1H'
statusCodeRanges: [
{
min: 500
max: 599
}
]
}
name: 'myBreakerRule'
tripDuration: 'PT1H'
acceptRetryAfter: true
}
]
}
}
}
負載平衡的集區
當您想要針對 API 實作多個後端,並跨這些後端平衡負載要求時,APIM 會支援後端集區。
針對下列案例使用後端集區:
- 將負載分散到多個後端,這可能會有個別的後端斷路器。
- 將負載從一組後端轉移到另一組後端以進行升級 (藍綠部署)。
若要建立後端集區,請將後端的 type
屬性設定為 pool
,並指定組成集區的後端清單。
注意
- 目前,您只能在後端集區中包含單一後端。 您無法將類型
pool
的後端新增至另一個後端集區。 您可以在集區中包含最多 30 個後端。 - 由於 API 管理架構的分散式本質,後端負載平衡大致近似。 網路閘道的不同執行個體不會同步處理,而且會根據相同執行個體上的資訊進行負載平衡。
負載平衡選項
APIM 支援後端集區的下列負載平衡選項:
- 循環配置資源:根據預設,要求會平均分散到集區中的後端。
- 加權:權數會指派給集區中的後端,而要求會根據指派給每個後端的相對權數分散到後端。 針對執行藍綠部署等案例,請使用此選項。
- 優先順序型:後端會組織在優先順序群組中,而要求會依優先順序群組的順序傳送至後端。 在優先順序群組中,要求會平均分散到後端,或根據指派給每個後端的相對權數來分配 (如果已指派)。
注意
只有在高優先順序群組中的所有後端無法使用時,才會使用較低優先順序群組中的後端,因為斷路器規則已中斷。
範例
使用 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
}
]
}
}
}
限制
對於開發人員和進階層,當閘道端點 URL 與後端 URL 相同時,內部虛擬網路中部署的 API 管理執行個體會擲出 HTTP 500 BackendConnectionFailure
錯誤。 如果發生此限制,請遵循 Tech Community 部落格中內部虛擬網路模式中自我鏈結 API 管理要求限制一文中的指示。
相關內容
- 部落格:搭配 Azure OpenAI 服務使用 Azure API 管理 斷路器和負載平衡
- 使用 Azure 入口網站來設定 Service Fabric 後端。