Padrão de descarregamento de gatewayGateway Offloading pattern

Descarregue a funcionalidade de serviço especializado ou compartilhado para um proxy do gateway.Offload shared or specialized service functionality to a gateway proxy. Esse padrão pode simplificar o desenvolvimento de aplicativo movendo a funcionalidade de serviços compartilhados, como o uso de certificados SSL, de outras partes do aplicativo para o gateway.This pattern can simplify application development by moving shared service functionality, such as the use of SSL certificates, from other parts of the application into the gateway.

Contexto e problemaContext and problem

Alguns recursos são comumente usados em vários serviços e esses recursos exigem configuração, gerenciamento e manutenção.Some features are commonly used across multiple services, and these features require configuration, management, and maintenance. Um serviço compartilhado ou especializado que é distribuído com cada implantação de aplicativo aumenta a sobrecarga administrativa e a probabilidade de erro de implantação.A shared or specialized service that is distributed with every application deployment increases the administrative overhead and increases the likelihood of deployment error. Todas as atualizações para um recurso compartilhado devem ser implantadas em todos os serviços que compartilham esse recurso.Any updates to a shared feature must be deployed across all services that share that feature.

Tratar corretamente os problemas de segurança (validação de token, criptografia e gerenciamento de certificados SSL) e outras tarefas complexas pode requerer que os membros da equipe tenham habilidades altamente especializadas.Properly handling security issues (token validation, encryption, SSL certificate management) and other complex tasks can require team members to have highly specialized skills. Por exemplo, um certificado necessário para um aplicativo deve ser configurado e implantado em todas as instâncias do aplicativo.For example, a certificate needed by an application must be configured and deployed on all application instances. Com cada implantação nova, o certificado deve ser gerenciado para se garantir que ele não expire.With each new deployment, the certificate must be managed to ensure that it does not expire. Qualquer certificado comum que esteja prestes a expirar deve ser atualizado, testado e verificado em todas as implantações de aplicativo.Any common certificate that is due to expire must be updated, tested, and verified on every application deployment.

Outros serviços comuns, como autenticação, autorização, registro em log, monitoramento ou limitação podem ser difíceis de serem implementados e gerenciado em uma grande quantidade de implantações.Other common services such as authentication, authorization, logging, monitoring, or throttling can be difficult to implement and manage across a large number of deployments. Talvez seja melhor consolidar esse tipo de funcionalidade para reduzir a sobrecarga e a chance de erros.It may be better to consolidate this type of functionality, in order to reduce overhead and the chance of errors.

SoluçãoSolution

Descarregue alguns recursos em um gateway de API, particularmente preocupações abrangentes como gerenciamento de certificados, autenticação, término de SSL, monitoramento, conversão de protocolo ou limitação.Offload some features into an API gateway, particularly cross-cutting concerns such as certificate management, authentication, SSL termination, monitoring, protocol translation, or throttling.

O diagrama a seguir mostra um gateway de API que termina as conexões SSL de entrada.The following diagram shows an API gateway that terminates inbound SSL connections. Ele solicita dados em nome do solicitante original de qualquer upstream de servidor HTTP do gateway de API.It requests data on behalf of the original requestor from any HTTP server upstream of the API gateway.

Diagrama do padrão de descarregamento de gateway

Os benefícios desse padrão incluem:Benefits of this pattern include:

  • Simplificar o desenvolvimento de serviços removendo a necessidade de distribuir e manter recursos de suporte, como certificados de servidor Web e a configuração de sites seguros.Simplify the development of services by removing the need to distribute and maintain supporting resources, such as web server certificates and configuration for secure websites. Uma configuração mais simples resulta em gerenciamento e escalabilidade mais fáceis e simplifica as atualizações de serviço.Simpler configuration results in easier management and scalability and makes service upgrades simpler.

  • Permitir que equipes dedicadas implementem recursos que exigem competências especializadas, como a segurança.Allow dedicated teams to implement features that require specialized expertise, such as security. Isso permite que sua equipe principal foque a funcionalidade do aplicativo, deixando essas preocupações especializadas, mas abrangentes, para os especialistas relevantes.This allows your core team to focus on the application functionality, leaving these specialized but cross-cutting concerns to the relevant experts.

  • Fornecer alguma consistência para registro em log e monitoramento de solicitação e de reposta.Provide some consistency for request and response logging and monitoring. Mesmo que um serviço não esteja instrumentado corretamente, o gateway pode ser configurado para garantir um nível mínimo de monitoramento e registro em log.Even if a service is not correctly instrumented, the gateway can be configured to ensure a minimum level of monitoring and logging.

Problemas e consideraçõesIssues and considerations

  • Assegure que o gateway de API seja altamente disponível e resistente a falhas.Ensure the API gateway is highly available and resilient to failure. Evite pontos únicos de falha executando várias instâncias do seu gateway de API.Avoid single points of failure by running multiple instances of your API gateway.
  • Assegure que o gateway seja projetado para os requisitos de capacidade e dimensionamento de seu aplicativo e pontos de extremidade.Ensure the gateway is designed for the capacity and scaling requirements of your application and endpoints. Verifique se o gateway não se torna um gargalo do aplicativo e se é suficientemente escalonável.Make sure the gateway does not become a bottleneck for the application and is sufficiently scalable.
  • Descarregue somente recursos que sejam usados pelo aplicativo inteiro, como a segurança ou transferência de dados.Only offload features that are used by the entire application, such as security or data transfer.
  • A lógica de negócios nunca deve ser descarregada para o gateway de API.Business logic should never be offloaded to the API gateway.
  • Se precisar controlar transações, leve em consideração gerar IDs de correlação para fins de registro de log.If you need to track transactions, consider generating correlation IDs for logging purposes.

Quando usar esse padrãoWhen to use this pattern

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

  • Uma implantação de aplicativo tem uma preocupação compartilhada, como certificados SSL ou criptografia.An application deployment has a shared concern such as SSL certificates or encryption.
  • Em um recurso que seja comum entre implantações de aplicativos que podem ter requisitos de recursos diferentes, como recursos de memória, capacidade de armazenamento ou conexões de rede.A feature that is common across application deployments that may have different resource requirements, such as memory resources, storage capacity or network connections.
  • Você deseja mover a responsabilidade por problemas, como segurança de rede, limitação ou outras preocupações de limite de rede, para uma equipe mais especializada.You wish to move the responsibility for issues such as network security, throttling, or other network boundary concerns to a more specialized team.

Esse padrão pode não ser adequado caso ele introduza um acoplamento entre serviços.This pattern may not be suitable if it introduces coupling across services.

ExemploExample

Ao usar o Nginx como o dispositivo de descarregamento de SSL, a configuração a seguir encerra uma conexão SSL de entrada e distribui a conexão para um dos três servidores HTTP de upstream.Using Nginx as the SSL offload appliance, the following configuration terminates an inbound SSL connection and distributes the connection to one of three upstream HTTP servers.

upstream iis {
        server  10.3.0.10    max_fails=3    fail_timeout=15s;
        server  10.3.0.20    max_fails=3    fail_timeout=15s;
        server  10.3.0.30    max_fails=3    fail_timeout=15s;
}

server {
        listen 443;
        ssl on;
        ssl_certificate /etc/nginx/ssl/domain.cer;
        ssl_certificate_key /etc/nginx/ssl/domain.key;

        location / {
                set $targ iis;
                proxy_pass http://$targ;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host $host;
        }
}

No Azure, isso pode ser obtido configurando a terminação SSL no Gateway de Aplicativo.On Azure, this can be achieved by setting up SSL termination on Application Gateway.