Compartilhar via


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

O Gateway para Spring oferece uma maneira eficiente e avançada de rotear, gerenciar e tratar 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 componente do Gateway para 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 do 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 o Gateway para Spring nos Aplicativos de Contêiner do Azure, observe os 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 pelos componentes Java gerenciados são cobrados de acordo com as taxas de ativo/ocioso. 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 O local da região do Azure na qual você deve criar o aplicativo de contêiner e o componente Java.
    ENVIRONMENT O nome do ambiente dos 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 o seu aplicativo de contêiner. Nesse caso, crie um componente do Gateway para Spring Java.
    IMAGE A imagem do contêiner usada no seu aplicativo de contêiner.
  2. Faça logon no Azure com a CLI do Azure.

    az login
    
  3. Crie um grupos 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 do 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 do 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 comando a seguir para atualizar o componente do Gateway para Spring com a configuração de 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 essa URL com o caminho /myapp/health deve encaminhar a solicitação para o ponto de extremidade actuator/health do aplicativo, retornando {"status":"UP","groups":["liveness","readiness"]}.

Limpar os recursos

Os recursos criados neste tutorial têm um efeito na sua fatura do 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 Sinalizador 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 Eureka quando ele automaticamente usar o serviceId de letras maiúsculas. Portanto, MYSERVICE corresponderia a /myservice/** false
spring.cloud.gateway.discovery.locator.predicates
spring.cloud.gateway.discovery.locator.route-id-prefix O prefixo para a routeId, tem como padrão 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 remover entradas para essa 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 de 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 de tokens solicitados. X-RateLimit-Requested-Tokens
spring.cloud.gateway.restrictive-property-accessor.enabled Restringe o método e o acesso à propriedade 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 proxied.
spring.cloud.gateway.streaming-media-types
spring.cloud.gateway.x-forwarded.enabled Se o XForwardedHeadersFilter estiver habilitado. true
spring.cloud.gateway.x-forwarded.for-append Se a anexação de X-Forwarded-For como uma lista estiver habilitada. true
spring.cloud.gateway.x-forwarded.for-enabled Se X-Forwarded-For estiver 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 Se X-Forwarded-Host estiver habilitado. true
spring.cloud.gateway.x-forwarded.order A ordem do XForwardedHeadersFilter. 0
spring.cloud.gateway.x-forwarded.port-append Se a anexação de X-Forwarded-Port como uma lista estiver habilitada. true
spring.cloud.gateway.x-forwarded.port-enabled Se X-Forwarded-Port estiver habilitado. true
spring.cloud.gateway.x-forwarded.prefix-append Se a anexação de X-Forwarded-Prefix como uma lista estiver habilitada. true
spring.cloud.gateway.x-forwarded.prefix-enabled Se X-Forwarded-Prefix estiver 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 Se X-Forwarded-Proto estiver habilitado. true
spring.cloud.gateway.httpclient.compression Habilita a compactação para Netty HttpClient. false
spring.cloud.gateway.httpclient.connect-timeout O tempo limite conectado 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 em milissegundos para aguardar 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, padrão para proxy. proxy
spring.cloud.gateway.httpclient.pool.type Tipo de pool para HttpClient usar, o padrão é ELASTIC.
spring.cloud.gateway.httpclient.response-timeout O tempo limite de resposta.
spring.cloud.gateway.httpclient.ssl.close-notify-flush-timeout Tempo limite de liberação de close_notify de SSL. O valor padrão 3000 ms. 3000ms
spring.cloud.gateway.httpclient.ssl.close-notify-read-timeout Tempo limite de leitura de close_notify de SSL. 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 o netty InsecureTrustManagerFactory. Isso é inseguro e não é adequado para produção. false
spring.cloud.gateway.httpclient.websocket.max-frame-payload-length Tamanho máximo do conteúdo 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 de marcas que foi adicionado às métricas.
spring.cloud.gateway.observability.enabled Se o suporte à Observabilidade do Micrometer estiver 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.