Backends no Gerenciamento de API
APLICA-SE A: Todas as camadas de gerenciamento de API
Um back-end (ou back-end de API) no Gerenciamento de API é um serviço HTTP que implementa sua API front-end e suas operações.
Ao importar determinadas APIs, o Gerenciamento de API configura o back-end da API automaticamente. Por exemplo, o Gerenciamento de API configura o serviço Web de back-end ao importar:
- Uma especificação OpenAPI.
- Uma API SOAP.
- Recursos do Azure, como um Aplicativo de Função do Azure acionado por HTTP ou um Aplicativo Lógico.
O Gerenciamento de API também dá suporte ao uso de outros recursos do Azure como um back-end de API, como:
- Um cluster do Service Fabric.
- Um serviço personalizado.
Benefícios dos backends
O Gerenciamento de API suporta entidades de back-end para que você possa gerenciar os serviços de back-end de sua API. Uma entidade de back-end encapsula informações sobre o serviço de back-end, promovendo a reutilização entre APIs e governança aprimorada.
Use back-ends para um ou mais dos seguintes:
- Autorizar as credenciais de solicitações para o serviço de back-end
- Aproveite a funcionalidade de Gerenciamento de API para manter segredos no Cofre de Chaves do Azure se os valores nomeados estiverem configurados para autenticação de cabeçalho ou parâmetro de consulta.
- Defina regras de disjuntor para proteger seu back-end de muitas solicitações
- Encaminhar ou balancear solicitações de balanceamento de carga para vários back-ends
Configure e gerencie entidades de back-end no portal do Azure ou usando APIs ou ferramentas do Azure.
Referência de back-end usando a política set-backend-service
Depois de criar um back-end, você pode fazer referência ao back-end em suas APIs. Use a set-backend-service
política para direcionar uma solicitação de API de entrada para o back-end. Se você já configurou um serviço Web de back-end para uma API, poderá usar a set-backend-service
política para redirecionar a solicitação para uma entidade de back-end. Por exemplo:
<policies>
<inbound>
<base />
<set-backend-service backend-id="myBackend" />
</inbound>
[...]
<policies/>
Você pode usar a lógica condicional com a set-backend-service
política para alterar o back-end efetivo com base no local, gateway que foi chamado ou outras expressões.
Por exemplo, aqui está uma política para rotear o tráfego para outro back-end com base no gateway que foi chamado:
<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/>
Disjuntor
O Gerenciamento de API expõe uma propriedade de disjuntor no recurso de back-end para proteger um serviço de back-end de ser sobrecarregado por muitas solicitações.
- A propriedade do disjuntor define regras para acionar o disjuntor, como o número ou a porcentagem de condições de falha durante um intervalo de tempo definido e um intervalo de códigos de status que indicam falhas.
- Quando o disjuntor dispara, o Gerenciamento de API para de enviar solicitações para o serviço de back-end por um tempo definido e retorna uma resposta 503 Serviço Indisponível para o cliente.
- Após a duração da viagem configurada, o circuito é reiniciado e o tráfego é retomado para o back-end.
O disjuntor backend é uma implementação do padrão do disjuntor para permitir que o backend se recupere de situações de sobrecarga. Ele aumenta as políticas gerais de limitação de taxa e de simultaneidade que você pode implementar para proteger o gateway de gerenciamento de API e seus serviços de back-end.
Nota
- Atualmente, o disjuntor de back-end não é suportado na camada de consumo do Gerenciamento de API.
- Devido à natureza distribuída da arquitetura de Gerenciamento de API, as regras de disparo do disjuntor são aproximadas. Instâncias diferentes do gateway não sincronizam e aplicarão regras de disjuntor com base nas informações da mesma instância.
- Atualmente, apenas uma regra pode ser configurada para um disjuntor back-end.
Exemplo
Use a API REST de Gerenciamento de API ou um modelo Bicep ou ARM para configurar um disjuntor em um back-end. No exemplo a seguir, o disjuntor em myBackend na instância de Gerenciamento de API myAPIM tropeça quando há três ou mais 5xx
códigos de status indicando erros do servidor em 1 hora.
O disjuntor é reiniciado após 1 hora. Se um Retry-After
cabeçalho estiver presente na resposta, o disjuntor aceita o valor e aguarda o tempo especificado antes de enviar solicitações para o back-end novamente.
Inclua um trecho semelhante ao seguinte no modelo Bicep para um recurso de back-end com um disjuntor:
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
}
]
}
}
}
Pool com balanceamento de carga
O Gerenciamento de API oferece suporte a pools de back-end, quando você deseja implementar vários back-ends para uma API e solicitações de balanceamento de carga nesses back-ends.
Use um pool de back-end para cenários como os seguintes:
- Espalhe a carga para vários back-ends, que podem ter disjuntores de back-end individuais.
- Mude a carga de um conjunto de back-ends para outro para atualização (implantação azul-verde).
Para criar um pool de back-end, defina a type
propriedade do back-end como pool
e especifique uma lista de back-ends que compõem o pool.
Nota
- Atualmente, você só pode incluir back-ends únicos em um pool de back-ends. Não é possível adicionar um back-end do tipo
pool
a outro pool de back-end. Você pode incluir até 30 backends em um pool. - Devido à natureza distribuída da arquitetura de Gerenciamento de API, o balanceamento de carga de back-end é aproximado. Instâncias diferentes do gateway não são sincronizadas e balancearão a carga com base nas informações da mesma instância.
Opções de balanceamento de carga
O Gerenciamento de API suporta as seguintes opções de balanceamento de carga para pools de back-end:
- Round-robin: Por padrão, as solicitações são distribuídas uniformemente pelos back-ends no pool.
- Ponderado: os pesos são atribuídos aos back-ends no pool e as solicitações são distribuídas entre os back-ends com base no peso relativo atribuído a cada back-end. Use essa opção para cenários como a realização de uma implantação azul-verde.
- Baseado em prioridades: os back-ends são organizados em grupos prioritários e as solicitações são enviadas aos back-ends na ordem dos grupos prioritários. Dentro de um grupo prioritário, as solicitações são distribuídas uniformemente entre os back-ends ou (se atribuídas) de acordo com o peso relativo atribuído a cada back-end.
Nota
Os back-ends em grupos de prioridade mais baixa só serão usados quando todos os back-ends em grupos de prioridade mais alta não estiverem disponíveis porque as regras do disjuntor são acionadas.
Exemplo
Use a API REST de Gerenciamento de API ou um modelo Bicep ou ARM para configurar um pool de back-end. No exemplo a seguir, o back-end myBackendPool na instância de Gerenciamento de API myAPIM é configurado com um pool de back-end. Exemplos de back-ends no pool são denominados backend-1 e backend-2. Ambos os backends estão no grupo prioritário mais alto; Dentro do grupo, backend-1 tem um peso maior do que backend-2 .
Inclua um trecho semelhante ao seguinte no modelo Bicep para um recurso de back-end com um pool com balanceamento de carga:
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
}
]
}
}
}
Limitações
- Para as camadas Developer e Premium, uma instância de Gerenciamento de API implantada em uma rede virtual interna pode gerar erros HTTP 500
BackendConnectionFailure
quando a URL do ponto de extremidade do gateway e a URL do back-end são as mesmas. Se você encontrar essa limitação, siga as instruções no artigo Self-Chained API Management request limitation in internal virtual network mode no blog Tech Community. - Atualmente, apenas uma regra pode ser configurada para um disjuntor back-end.
Conteúdos relacionados
- Blog: Usando o disjuntor de Gerenciamento de API do Azure e o balanceamento de carga com o Serviço OpenAI do Azure
- Configure um back-end do Service Fabric usando o portal do Azure.