Padrão de roteamento de gatewayGateway Routing pattern

Faça o roteamento de solicitações para vários serviços usando um único ponto de extremidade.Route requests to multiple services using a single endpoint. Esse padrão é útil quando você deseja expor vários serviços em um único ponto de extremidade e rotear para o serviço apropriado com base na solicitação.This pattern is useful when you wish to expose multiple services on a single endpoint and route to the appropriate service based on the request.

Contexto e problemaContext and problem

Quando um cliente precisa consumir vários serviços, pode ser um desafio configurar um ponto de extremidade separado para cada serviço e precisar que o cliente gerencie cada ponto de extremidade.When a client needs to consume multiple services, setting up a separate endpoint for each service and having the client manage each endpoint can be challenging. Por exemplo, um aplicativo de comércio eletrônico pode fornecer serviços como pesquisa, análises, carrinho de compras, check-out e histórico de pedidos.For example, an e-commerce application might provide services such as search, reviews, cart, checkout, and order history. Cada serviço tem uma API diferente com a qual o cliente deve interagir, e ele deve conhecer cada ponto de extremidade para se conectar aos serviços.Each service has a different API that the client must interact with, and the client must know about each endpoint in order to connect to the services. Se uma API muda, o cliente deverá ser atualizado também.If an API changes, the client must be updated as well. Se você refatorar um serviço em dois ou mais serviços separados, o código deve ser alterado no serviço e no cliente.If you refactor a service into two or more separate services, the code must change in both the service and the client.

SoluçãoSolution

Coloque um gateway em frente a um conjunto de aplicativos, serviços ou implantações.Place a gateway in front of a set of applications, services, or deployments. Use o roteamento da camada de aplicativo 7 para rotear a solicitação para as instâncias apropriadas.Use application Layer 7 routing to route the request to the appropriate instances.

Com esse padrão, o aplicativo cliente só precisa conhecer e se comunicar com um único ponto de extremidade.With this pattern, the client application only needs to know about and communicate with a single endpoint. Se um serviço for consolidado ou decomposto, o cliente não precisa necessariamente de atualização.If a service is consolidated or decomposed, the client does not necessarily require updating. Ele pode continuar a fazer solicitações para o gateway, e apenas o roteamento muda.It can continue making requests to the gateway, and only the routing changes.

Um gateway também permite abstrair os serviços de back-end dos clientes, permitindo que você mantenha as chamadas do cliente simples ao mesmo tempo que permite alterações nos serviços de back-end por trás do gateway.A gateway also lets you abstract backend services from the clients, allowing you to keep client calls simple while enabling changes in the backend services behind the gateway. Chamadas de cliente podem ser roteadas para qualquer serviço ou os serviços precisam controlar o comportamento esperado do cliente, permitindo que você adicione, divida e reorganize serviços por trás do gateway sem alterar o cliente.Client calls can be routed to whatever service or services need to handle the expected client behavior, allowing you to add, split, and reorganize services behind the gateway without changing the client.

Diagrama do padrão de roteamento de gateway

Esse padrão também pode ajudar com a implantação ao permitir que você gerencie como as atualizações são distribuídas aos usuários.This pattern can also help with deployment, by allowing you to manage how updates are rolled out to users. Quando uma nova versão do seu serviço é implantada, ela pode ser implantada em paralelo com a versão existente.When a new version of your service is deployed, it can be deployed in parallel with the existing version. O roteamento permite controlar qual versão do serviço é apresentada aos clientes, dando a você a flexibilidade para usar várias estratégias de versão, seja ela incremental, paralela ou de distribuições completas das atualizações.Routing lets you control what version of the service is presented to the clients, giving you the flexibility to use various release strategies, whether incremental, parallel, or complete rollouts of updates. Quaisquer problemas descobertos depois que o novo serviço for implantado podem ser revertidos rapidamente por meio da alteração de uma configuração no gateway e sem afetar os clientes.Any issues discovered after the new service is deployed can be quickly reverted by making a configuration change at the gateway, without affecting clients.

Problemas e consideraçõesIssues and considerations

  • O serviço de gateway pode introduzir um ponto único de falha.The gateway service may introduce a single point of failure. Verifique se ele está corretamente projetado para atender aos requisitos de disponibilidade.Ensure it is properly designed to meet your availability requirements. Ao implementar, leve em consideração os recursos de resiliência e tolerância a falhas.Consider resiliency and fault tolerance capabilities when implementing.
  • O serviço de gateway pode introduzir um gargalo.The gateway service may introduce a bottleneck. O gateway deve ter um desempenho adequado para lidar com a carga e pode facilmente ser dimensionado em linha com o crescimento das expectativas.Ensure the gateway has adequate performance to handle load and can easily scale in line with your growth expectations.
  • Execute testes de carga no gateway para garantir que você não introduza falhas em cascata para serviços.Perform load testing against the gateway to ensure you don't introduce cascading failures for services.
  • O roteamento de gateway é de nível 7.Gateway routing is level 7. Ele pode ser baseado em IP, porta, cabeçalho ou URL.It can be based on IP, port, header, or URL.

Quando usar esse padrãoWhen to use this pattern

Use esse padrão quando:Use this pattern when:

  • Um cliente precisa consumir vários serviços que podem ser acessados por trás de um gateway.A client needs to consume multiple services that can be accessed behind a gateway.
  • Você deseja simplificar os aplicativos cliente usando um único ponto de extremidade.You wish to simplify client applications by using a single endpoint.
  • Você precisa rotear solicitações de pontos de extremidade endereçáveis externamente para pontos de extremidade virtuais internos, como expor as portas em uma VM para endereços IP virtuais do cluster.You need to route requests from externally addressable endpoints to internal virtual endpoints, such as exposing ports on a VM to cluster virtual IP addresses.

Esse padrão pode não ser adequado quando você tiver um aplicativo simples que usa apenas um ou dois serviços.This pattern may not be suitable when you have a simple application that uses only one or two services.

ExemploExample

Ao usar o Nginx como o roteador, a seguir há um arquivo de configuração de exemplo simples de um servidor que encaminha solicitações para aplicativos que residem em diferentes diretórios virtuais para diferentes computadores no back-end.Using Nginx as the router, the following is a simple example configuration file for a server that routes requests for applications residing on different virtual directories to different machines at the back end.

server {
    listen 80;
    server_name domain.com;

    location /app1 {
        proxy_pass http://10.0.3.10:80;
    }

    location /app2 {
        proxy_pass http://10.0.3.20:80;
    }

    location /app3 {
        proxy_pass http://10.0.3.30:80;
    }
}

Vários serviços no Azure, podem ser definidos atrás de uma instância de Gateway de aplicativo, que fornece o roteamento de camada 7.On Azure, multiple services can be set up behind an Application Gateway instance, which provides layer-7 routing.