Compartilhar via


Conectar-se a um Gateway gerenciado para o Spring no Aplicativos de Contêiner do Azure (versão prévia)

O Gateway para Spring oferece uma maneira eficiente e eficiente de rotear, gerenciar e lidar com solicitações de API como parte de uma arquitetura de microsserviços. Ele serve como um Gateway de API que roteia solicitações externas para diferentes serviços, adicionando vários recursos, como filtragem, balanceamento de carga e muito mais. Neste artigo, você aprenderá a criar um gateway que direciona solicitações para seus aplicativos de contêiner.

Neste tutorial, você aprenderá a:

  • Criar um Gateway para o componente Spring Java
  • Atualizar o gateway para o Spring com rotas personalizadas para redirecionar solicitações para aplicativos de contêineres

Importante

Este tutorial usa serviços que podem afetar sua fatura de Azure. Se você decidir seguir o passo a passo, certifique-se de excluir os recursos apresentados neste artigo para evitar cobranças inesperadas.

Pré-requisitos

Considerações

Ao executar no Gateway para Spring no Aplicativos de Contêiner do Azure, lembre-se dos seguintes detalhes:

Item Explicação
Escopo O Gateway para Spring é executado no mesmo ambiente que o aplicativo de contêiner conectado.
Recursos A alocação de recursos do contêiner para o Gateway para Spring é fixa, o número de núcleos da CPU é 0,5 e o tamanho da memória é 1Gi.
Preços A cobrança do Gateway para Spring se enquadra no preço baseado no consumo. Os recursos consumidos por componentes Java gerenciados são cobrados de acordo com as tarifas ativas/ociosas. Você pode excluir componentes que não estão mais em uso para interromper a cobrança.

Instalação

Antes de começar a trabalhar com o Gateway para Spring, será necessário primeiro criar os recursos necessários.

Execute os seguintes comandos para criar seu grupo de recursos e o ambiente de Aplicativos de Contêiner.

  1. Crie variáveis para dar suporte à configuração do aplicativo. Esses valores são fornecidos para você para os fins desta lição. Usamos o ponto de extremidade do atuador do administrador para o aplicativo de exemplo do Spring nesta lição.

    export LOCATION=eastus
    export RESOURCE_GROUP=my-spring-cloud-resource-group
    export ENVIRONMENT=my-spring-cloud-environment
    export JAVA_COMPONENT_NAME=mygateway
    export APP_NAME=myapp
    export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-admin-for-spring-client:latest"
    
    Variável Descrição
    LOCATION A localização da região do Azure onde você cria seu aplicativo de containers e o componente Java.
    ENVIRONMENT O nome do ambiente Aplicativos de Contêiner do Azure para seu aplicativo de demonstração.
    RESOURCE_GROUP O nome do grupo de recursos do Azure para seu aplicativo de demonstração.
    JAVA_COMPONENT_NAME O nome do componente Java criado para seu aplicativo de contêiner. Nesse caso, você criará um componente do Gateway para Spring Java.
    IMAGE A imagem do contêiner usada no seu aplicativo de contêiner.
  2. Entre no Azure com o CLI do Azure.

    az login
    
  3. Crie um grupo de recursos.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Crie seu ambiente de aplicativos de contêiner.

    az containerapp env create \
        --name $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION
    

    Esse ambiente é usado para hospedar o componente do Gateway para Spring e o aplicativo de contêiner.

Usar o componente Gateway para Spring Java

Agora que você tem um ambiente de Aplicativos de Contêiner, poderá criar seu aplicativo de contêiner e usar um gateway para os componentes do Spring Java para rotear a solicitação para eles.

  1. Crie o componente Gateway para Spring Java.

    az containerapp env java-component gateway-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
    
  2. Crie o aplicativo de contêiner que tenha o nome de domínio totalmente qualificado (FQDN).

    az containerapp create \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --environment $ENVIRONMENT \
        --image $IMAGE \
        --ingress external \
        --target-port 8080 \
        --query properties.configuration.ingress.fqdn
    

    Esse comando retorna a URL do seu aplicativo de contêiner que consome dados de configuração. Copie a URL em um editor de texto para poder usá-lo em uma próxima etapa.

Atualizar as Rotas do Gateway para rotear solicitações

  1. Crie um arquivo YAML com o seguinte conteúdo. Substitua <MYAPP_URL> pelo FQDN do aplicativo de contêiner da etapa anterior.

    springCloudGatewayRoutes:
    - id: "route1"
      uri: "<MYAPP_URL>"
      predicates:
        - "Path=/myapp/{path}"
      filters:
        - "SetPath=/actuator/{path}"
    
  2. Execute o seguinte comando para atualizar o componente Gateway do Spring com a configuração da rota.

    az containerapp env java-component gateway-for-spring update \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \ 
        --route-yaml <PTAH_TO_ROUTE_YAML_FILE> \
        --query properties.ingress.fqdn
    

    Esse comando atualiza a rota do gateway e retorna a URL do gateway que consome dados de configuração.

    O comando retorna a URL do gateway. Visitar esta URL com o caminho /myapp/health deve redirecionar a solicitação para o endpoint actuator/health da aplicação, retornando {"status":"UP","groups":["liveness","readiness"]}.

Limpar os recursos

Os recursos criados neste tutorial têm um efeito sobre sua fatura de Azure. Se você não usar esses serviços a longo prazo, execute o comando a seguir para remover tudo o que foi criado neste tutorial.

az group delete --resource-group $RESOURCE_GROUP

Formato de arquivo de rota

O componente do Gateway para Spring dá suporte à definição de rotas por meio de propriedades com ID, URI, predicados e filtros. Para obter mais informações, confira a documentação do Gateway do Spring Cloud. A seguir, um exemplo de arquivo YAML que demonstra como configurar essas propriedades.

  springCloudGatewayRoutes:
  - id: "route1"
    uri: "https://otherjavacomponent.myenvironment.test.net"
    predicates:
      - "Path=/v1/{path}"
      - "After=2024-01-01T00:00:00.000-00:00[America/Denver]"
    filters:
      - "SetPath=/{path}"
  - id: "route2"
    uri: "https://otherjavacomponent.myenvironment.test.net"
    predicates:
      - "Path=/v2/{path}"
      - "After=2024-01-01T00:00:00.000-00:00[America/Denver]"
    filters:
      - "SetPath=/{path}"

Lista de configurações permitidas para seu Gateway para Spring(#configurable-properties)

A tabela a seguir descreve as propriedades do componente de gateway que você pode configurar para o seu aplicativo. Para obter mais informações, confira Propriedades comuns do aplicativo de Gateway do Spring Cloud.

Nome da propriedade Descrição Valor padrão
spring.cloud.gateway.default-filters Lista de definições de filtro que são aplicadas a todas as rotas.
spring.cloud.gateway.enabled Habilita a funcionalidade do gateway. true
spring.cloud.gateway.fail-on-route-definition-error Opção para falhar em erros de definição de rota, o padrão é true. Caso contrário, um aviso será registrado em log. true
spring.cloud.gateway.handler-mapping.order A ordem de RoutePredicateHandlerMapping. 1
spring.cloud.gateway.loadbalancer.use404 false
spring.cloud.gateway.discovery.locator.enabled Indicador que habilita a integração do gateway DiscoveryClient. false
spring.cloud.gateway.discovery.locator.filters
spring.cloud.gateway.discovery.locator.include-expression Expressão SpEL que avalia se um serviço deve ser incluído ou não na integração do gateway. O valor padrão é true. true
spring.cloud.gateway.discovery.locator.lower-case-service-id Opção de usar o serviceId de letras minúsculas em predicados e filtros. O valor padrão é false. Útil com o Eureka quando ele automaticamente coloca serviceId em maiúsculas. Portanto, MYSERVICE corresponderia a /myservice/** false
spring.cloud.gateway.discovery.locator.predicates
spring.cloud.gateway.discovery.locator.route-id-prefix O prefixo de routeId é definido por padrão como discoveryClient.getClass().getSimpleName() + "_". A ID do serviço é acrescentada para criar a routeId.
spring.cloud.gateway.discovery.locator.url-expression Expressão SpEL que cria o URI para cada rota. O valor padrão é 'lb://'+serviceId. 'lb://'+serviceId
spring.cloud.gateway.filter.add-request-header.enabled Habilita o filtro add-request-header. true
spring.cloud.gateway.filter.add-request-parameter.enabled Habilita o filtro add-request-parameter. true
spring.cloud.gateway.filter.add-response-header.enabled Habilita o filtro add-response-header. true
spring.cloud.gateway.filter.circuit-breaker.enabled Habilita o filtro circuit-breaker. true
spring.cloud.gateway.filter.dedupe-response-header.enabled Habilita o filtro dedupe-response-header. true
spring.cloud.gateway.filter.fallback-headers.enabled Habilita o filtro fallback-headers. true
spring.cloud.gateway.filter.hystrix.enabled Habilita o filtro hystrix. true
spring.cloud.gateway.filter.json-to-grpc.enabled Habilita o filtro JSON para gRPC. true
spring.cloud.gateway.filter.local-response-cache.enabled Habilita o filtro local-response-cache. false
spring.cloud.gateway.filter.local-response-cache.request.no-cache-strategy
spring.cloud.gateway.filter.local-response-cache.size Tamanho máximo do cache para expulsar entradas nesta rota em KB, MB e GB.
spring.cloud.gateway.filter.local-response-cache.time-to-live Tempo para expirar uma entrada de cache, expressa em s para segundos, m para minutos e h para horas. 5m
spring.cloud.gateway.filter.map-request-header.enabled Habilita o filtro map-request-header. true
spring.cloud.gateway.filter.modify-request-body.enabled Habilita o filtro modify-request-body. true
spring.cloud.gateway.filter.modify-response-body.enabled Habilita o filtro modify-response-body. true
spring.cloud.gateway.filter.prefix-path.enabled Habilita o filtro prefix-path. true
spring.cloud.gateway.filter.preserve-host-header.enabled Habilita o filtro preserve-host-header. true
spring.cloud.gateway.filter.redirect-to.enabled Habilita o filtro redirect-to. true
spring.cloud.gateway.filter.remove-hop-by-hop.headers
spring.cloud.gateway.filter.remove-hop-by-hop.order 0
spring.cloud.gateway.filter.remove-request-header.enabled Habilita o filtro remove-request-header. true
spring.cloud.gateway.filter.remove-request-parameter.enabled Habilita o filtro remove-request-parameter. true
spring.cloud.gateway.filter.remove-response-header.enabled Habilita o filtro remove-response-header. true
spring.cloud.gateway.filter.request-header-size.enabled Habilita o filtro request-header-size. true
spring.cloud.gateway.filter.request-header-to-request-uri.enabled Habilita o filtro request-header-to-request-uri. true
spring.cloud.gateway.filter.request-rate-limiter.default-key-resolver
spring.cloud.gateway.filter.request-rate-limiter.default-rate-limiter
spring.cloud.gateway.filter.request-rate-limiter.enabled Habilita o filtro request-rate-limiter. true
spring.cloud.gateway.filter.request-size.enabled Habilita o filtro request-size. true
spring.cloud.gateway.filter.retry.enabled Habilita o filtro retry. true
spring.cloud.gateway.filter.rewrite-location-response-header.enabled Habilita o filtro rewrite-location-response-header. true
spring.cloud.gateway.filter.rewrite-location.enabled Habilita o filtro rewrite-location. true
spring.cloud.gateway.filter.rewrite-path.enabled Habilita o filtro rewrite-path. true
spring.cloud.gateway.filter.rewrite-request-parameter.enabled Habilita o filtro rewrite-request-parameter. true
spring.cloud.gateway.filter.rewrite-response-header.enabled Habilita o filtro rewrite-response-header. true
spring.cloud.gateway.filter.save-session.enabled Habilita o filtro save-session. true
spring.cloud.gateway.filter.secure-headers.content-security-policy default-src 'self' https:; font-src 'self' https: data:; img-src 'self' https: data:; object-src 'none'; script-src https:; style-src 'self' https: 'unsafe-inline'
spring.cloud.gateway.filter.secure-headers.content-type-options nosniff
spring.cloud.gateway.filter.secure-headers.disable
spring.cloud.gateway.filter.secure-headers.download-options noopen
spring.cloud.gateway.filter.secure-headers.enabled Habilita o filtro secure-headers. true
spring.cloud.gateway.filter.secure-headers.frame-options DENY
spring.cloud.gateway.filter.secure-headers.permitted-cross-domain-policies none
spring.cloud.gateway.filter.secure-headers.referrer-policy no-referrer
spring.cloud.gateway.filter.secure-headers.strict-transport-security max-age=631138519
spring.cloud.gateway.filter.secure-headers.xss-protection-header 1 ; mode=block
spring.cloud.gateway.filter.set-path.enabled Habilita o filtro set-path. true
spring.cloud.gateway.filter.set-request-header.enabled Habilita o filtro set-request-header. true
spring.cloud.gateway.filter.set-request-host-header.enabled Habilita o filtro set-request-host-header. true
spring.cloud.gateway.filter.set-response-header.enabled Habilita o filtro set-response-header. true
spring.cloud.gateway.filter.set-status.enabled Habilita o filtro set-status. true
spring.cloud.gateway.filter.strip-prefix.enabled Habilita o filtro strip-prefix. true
spring.cloud.gateway.forwarded.enabled Habilita o ForwardedHeadersFilter. true
spring.cloud.gateway.global-filter.adapt-cached-body.enabled Habilita o filtro global adapt-cached-body. true
spring.cloud.gateway.global-filter.forward-path.enabled Habilita o filtro global forward-path. true
spring.cloud.gateway.global-filter.forward-routing.enabled Habilita o filtro global forward-routing. true
spring.cloud.gateway.global-filter.load-balancer-client.enabled Habilita o filtro global load-balancer-client. true
spring.cloud.gateway.global-filter.local-response-cache.enabled Habilita o filtro local-response-cache para todas as rotas, o que permite adicionar uma configuração específica no nível da rota usando um filtro LocalResponseCache. true
spring.cloud.gateway.global-filter.netty-routing.enabled Habilita o filtro netty-routing global. true
spring.cloud.gateway.global-filter.netty-write-response.enabled Habilita o filtro global netty-write-response. true
spring.cloud.gateway.global-filter.reactive-load-balancer-client.enabled Habilita o filtro global reactive-load-balancer-client. true
spring.cloud.gateway.global-filter.remove-cached-body.enabled Habilita o filtro global remove-cached-body. true
spring.cloud.gateway.global-filter.route-to-request-url.enabled Habilita o filtro global route-to-request-url. true
spring.cloud.gateway.global-filter.websocket-routing.enabled Habilita o filtro global websocket-routing. true
spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping Se a configuração global do CORS deve ser adicionada ao manipulador de URL. false
spring.cloud.gateway.globalcors.cors-configurations
spring.cloud.gateway.redis-rate-limiter.burst-capacity-header O nome do cabeçalho que retorna a configuração de capacidade de intermitência. X-RateLimit-Burst-Capacity
spring.cloud.gateway.redis-rate-limiter.config
spring.cloud.gateway.redis-rate-limiter.include-headers Se deve ou não incluir cabeçalhos que contêm informações do limitador de taxa. O valor padrão é true. true
spring.cloud.gateway.redis-rate-limiter.remaining-header O nome do cabeçalho que retorna o número de solicitações restantes durante o segundo atual. X-RateLimit-Remaining
spring.cloud.gateway.redis-rate-limiter.replenish-rate-header O nome do cabeçalho que retorna a configuração da taxa de reposição. X-RateLimit-Replenish-Rate
spring.cloud.gateway.redis-rate-limiter.requested-tokens-header O nome do cabeçalho que retorna a configuração solicitada de tokens. X-RateLimit-Requested-Tokens
spring.cloud.gateway.restrictive-property-accessor.enabled Restringe o acesso a métodos e propriedades no SpEL. true
spring.cloud.gateway.predicate.after.enabled Habilita o predicado after. true
spring.cloud.gateway.predicate.before.enabled Habilita o predicado before. true
spring.cloud.gateway.predicate.between.enabled Habilita o predicado between. true
spring.cloud.gateway.predicate.cloud-foundry-route-service.enabled Habilita o predicado cloud-foundry-route-service. true
spring.cloud.gateway.predicate.cookie.enabled Habilita o predicado cookie. true
spring.cloud.gateway.predicate.header.enabled Habilita o predicado header. true
spring.cloud.gateway.predicate.host.enabled Habilita o predicado host. true
spring.cloud.gateway.predicate.host.include-port Inclua a porta na correspondência do nome do host. true
spring.cloud.gateway.predicate.method.enabled Habilita o predicado method. true
spring.cloud.gateway.predicate.path.enabled Habilita o predicado path. true
spring.cloud.gateway.predicate.query.enabled Habilita o predicado query. true
spring.cloud.gateway.predicate.read-body.enabled Habilita o predicado read-body. true
spring.cloud.gateway.predicate.remote-addr.enabled Habilita o predicado remote-addr. true
spring.cloud.gateway.predicate.weight.enabled Habilita o predicado weight. true
spring.cloud.gateway.predicate.xforwarded-remote-addr.enabled Habilita o predicado xforwarded-remote-addr. true
spring.cloud.gateway.set-status.original-status-header-name O nome do cabeçalho que contém o código HTTP da solicitação proxiada.
spring.cloud.gateway.streaming-media-types
spring.cloud.gateway.x-forwarded.enabled Indica se XForwardedHeadersFilter está habilitado. true
spring.cloud.gateway.x-forwarded.for-append Se a inclusão de X-Forwarded-For como uma lista estiver habilitada. true
spring.cloud.gateway.x-forwarded.for-enabled Indica se X-Forwarded-For está habilitado. true
spring.cloud.gateway.x-forwarded.host-append Se a anexação de X-Forwarded-Host como uma lista estiver habilitada. true
spring.cloud.gateway.x-forwarded.host-enabled Indica se X-Forwarded-Host está habilitado. true
spring.cloud.gateway.x-forwarded.order A ordem do XForwardedHeadersFilter. 0
spring.cloud.gateway.x-forwarded.port-append Se a inclusão de X-Forwarded-Port como uma lista estiver habilitada. true
spring.cloud.gateway.x-forwarded.port-enabled Indica se X-Forwarded-Port está habilitado. true
spring.cloud.gateway.x-forwarded.prefix-append Se a inclusão de X-Forwarded-Prefix como uma lista estiver habilitada. true
spring.cloud.gateway.x-forwarded.prefix-enabled Indica se X-Forwarded-Prefix está habilitado. true
spring.cloud.gateway.x-forwarded.proto-append Se a anexação de X-Forwarded-Proto como uma lista estiver habilitada. true
spring.cloud.gateway.x-forwarded.proto-enabled Indica se X-Forwarded-Proto está habilitado. true
spring.cloud.gateway.httpclient.compression Habilita a compactação para Netty HttpClient. false
spring.cloud.gateway.httpclient.connect-timeout O tempo limite de conexão em milissegundos. O valor padrão é 30s.
spring.cloud.gateway.httpclient.max-header-size O tamanho máximo do cabeçalho de resposta.
spring.cloud.gateway.httpclient.max-initial-line-length O comprimento máximo da linha inicial.
spring.cloud.gateway.httpclient.pool.acquire-timeout Somente para o tipo FIXED, o tempo máximo de espera em milissegundos para a aquisição.
spring.cloud.gateway.httpclient.pool.eviction-interval Execute verificações regulares de remoção em segundo plano em um intervalo especificado. Desabilitado por padrão ({@link Duration#ZERO}). 0
spring.cloud.gateway.httpclient.pool.max-connections Somente para o tipo FIXED, o número máximo de conexões antes de iniciar a aquisição pendente nas existentes.
spring.cloud.gateway.httpclient.pool.max-idle-time Tempo em milissegundos após o qual o canal é fechado. Se NULL, não há tempo ocioso máximo.
spring.cloud.gateway.httpclient.pool.max-life-time Duração após a qual o canal é fechado. Se NULL, não há tempo máximo de vida.
spring.cloud.gateway.httpclient.pool.metrics Permite que as métricas de pools de canais sejam coletadas e registradas no Micrometer. Desabilitado por padrão. false
spring.cloud.gateway.httpclient.pool.name O nome do mapa do pool de canais. O valor padrão é proxy. proxy
spring.cloud.gateway.httpclient.pool.type Tipo de pool que HttpClient deve usar, com padrão sendo ELASTIC.
spring.cloud.gateway.httpclient.response-timeout O tempo limite de resposta.
spring.cloud.gateway.httpclient.ssl.close-notify-flush-timeout Tempo limite de limpeza de SSL close_notify. O valor padrão é 3000 ms. 3000ms
spring.cloud.gateway.httpclient.ssl.close-notify-read-timeout Tempo limite de leitura de SSL close_notify. O valor padrão é 0 ms. 0
spring.cloud.gateway.httpclient.ssl.handshake-timeout Tempo limite de handshake de SSL. O valor padrão é 10000 ms. 10000ms
spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager Instala netty InsecureTrustManagerFactory. Esse valor é inseguro e não é adequado para produção. false
spring.cloud.gateway.httpclient.websocket.max-frame-payload-length Tamanho máximo do payload do quadro.
spring.cloud.gateway.httpclient.websocket.proxy-ping Quadros de ping de proxy para serviços downstream. O valor padrão é true. true
spring.cloud.gateway.httpclient.wiretap Habilita a depuração de wiretap para Netty HttpClient. false
spring.cloud.gateway.httpserver.wiretap Habilita a depuração de wiretap para Netty HttpServer. false
spring.cloud.gateway.metrics.enabled Habilita a coleta de dados de métricas. false
spring.cloud.gateway.metrics.prefix O prefixo de todas as métricas emitidas pelo gateway. spring.cloud.gateway
spring.cloud.gateway.metrics.tags Mapa das tags que foram adicionadas às métricas.
spring.cloud.gateway.observability.enabled Indica se o suporte à Observabilidade do Micrometer deve ser ativado. true

Configurações comuns

A lista a seguir descreve configurações comuns:

  • Configurações relacionadas ao registro em log:
    • logging.level.*
    • logging.group.*
    • Quaisquer outras configurações no âmbito do namespace logging.* devem ser proibidas. Por exemplo, a gravação de arquivos de log usando logging.file deve ser proibida.