Partilhar via


Conectar-se a um Gateway gerenciado para Spring em Aplicativos de Contêiner do Azure (visualização)

O Gateway for Spring oferece uma maneira eficiente e poderosa de rotear, gerenciar e lidar com solicitações de API como parte de uma arquitetura de microsserviços. Ele serve como um API Gateway 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, irá aprender a:

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

Importante

Este tutorial usa serviços que podem afetar sua fatura do Azure. Se você decidir acompanhar 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 for Spring em Aplicativos de Contêiner do Azure, esteja ciente dos seguintes detalhes:

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

Configurar

Antes de começar a trabalhar com o Gateway for Spring, primeiro você precisa criar os recursos necessários.

Execute os comandos a seguir 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 endpoint atuador do aplicativo de exemplo admin for 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 Description
    LOCATION O local da região do Azure onde você cria seu 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 seu aplicativo de contêiner. Nesse caso, você cria um componente Gateway for Spring Java.
    IMAGE A imagem de contêiner usada em seu aplicativo de contêiner.
  2. Faça logon no Azure com a 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 Gateway for Spring e seu aplicativo de contêiner.

Usar o componente Gateway for Spring Java

Agora que você tem um ambiente de aplicativos de contêiner, você pode criar seu aplicativo de contêiner usando um gateway para componentes java de primavera para rotear solicitações para eles.

  1. Crie o componente Gateway for 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
    

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

Atualizar as rotas do gateway para encaminhar solicitações

  1. Crie um arquivo YAML com o seguinte conteúdo. Substitua <MYAPP_URL> pelo FQDN do aplicativo 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 for Spring com sua 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
    

    Este 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 rotear a solicitação para o ponto de actuator/health extremidade do seu aplicativo, retornando {"status":"UP","groups":["liveness","readiness"]}.

Clean up resources (Limpar recursos)

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

az group delete --resource-group $RESOURCE_GROUP

Formato de arquivo de rota

O componente Gateway for Spring oferece suporte à definição de rotas por meio de propriedades com ID, URI, predicados e filtros. Para obter mais informações, consulte a documentação do Spring Cloud Gateway. A seguir está 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 o seu Gateway for Spring(#configurable-properties)

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

Property name Description Default value
spring.cloud.gateway.default-filters Lista de definições de filtro que são aplicadas a cada rota.
spring.cloud.gateway.enabled Habilita a funcionalidade de 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. 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 permite a DiscoveryClient integração de gateway. 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 na integração de gateway ou não. O valor predefinido é true. true
spring.cloud.gateway.discovery.locator.lower-case-service-id Opção para minúsculas serviceId em predicados e filtros. O valor predefinido é false. Útil com Eureka quando automaticamente maiúsculas serviceId. Então, MYSERVICE combinaria /myservice/** false
spring.cloud.gateway.discovery.locator.predicates
spring.cloud.gateway.discovery.locator.route-id-prefix O prefixo para o routeId, assume como discoveryClient.getClass().getSimpleName() padrão + "_". A ID de serviço é anexada para criar o routeIdarquivo .
spring.cloud.gateway.discovery.locator.url-expression Expressão SpEL que cria o URI para cada rota. O valor predefinido é 'lb://'+serviceId. 'lb://'+serviceId
spring.cloud.gateway.filter.add-request-header.enabled Ativa o add-request-header filtro. true
spring.cloud.gateway.filter.add-request-parameter.enabled Ativa o add-request-parameter filtro. true
spring.cloud.gateway.filter.add-response-header.enabled Ativa o add-response-header filtro. true
spring.cloud.gateway.filter.circuit-breaker.enabled Ativa o circuit-breaker filtro. true
spring.cloud.gateway.filter.dedupe-response-header.enabled Ativa o dedupe-response-header filtro. true
spring.cloud.gateway.filter.fallback-headers.enabled Ativa o fallback-headers filtro. true
spring.cloud.gateway.filter.hystrix.enabled Ativa o hystrix filtro. true
spring.cloud.gateway.filter.json-to-grpc.enabled Habilita o JSON para o filtro gRPC. true
spring.cloud.gateway.filter.local-response-cache.enabled Ativa o local-response-cache filtro. 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, expresso em s segundos, m minutos e h horas. 5m
spring.cloud.gateway.filter.map-request-header.enabled Ativa o map-request-header filtro. true
spring.cloud.gateway.filter.modify-request-body.enabled Ativa o modify-request-body filtro. true
spring.cloud.gateway.filter.modify-response-body.enabled Ativa o modify-response-body filtro. true
spring.cloud.gateway.filter.prefix-path.enabled Ativa o prefix-path filtro. true
spring.cloud.gateway.filter.preserve-host-header.enabled Ativa o preserve-host-header filtro. true
spring.cloud.gateway.filter.redirect-to.enabled Ativa o redirect-to filtro. 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 Ativa o remove-request-header filtro. true
spring.cloud.gateway.filter.remove-request-parameter.enabled Ativa o remove-request-parameter filtro. true
spring.cloud.gateway.filter.remove-response-header.enabled Ativa o remove-response-header filtro. true
spring.cloud.gateway.filter.request-header-size.enabled Ativa o request-header-size filtro. true
spring.cloud.gateway.filter.request-header-to-request-uri.enabled Ativa o request-header-to-request-uri filtro. 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 Ativa o request-rate-limiter filtro. true
spring.cloud.gateway.filter.request-size.enabled Ativa o request-size filtro. true
spring.cloud.gateway.filter.retry.enabled Ativa o retry filtro. true
spring.cloud.gateway.filter.rewrite-location-response-header.enabled Ativa o rewrite-location-response-header filtro. true
spring.cloud.gateway.filter.rewrite-location.enabled Ativa o rewrite-location filtro. true
spring.cloud.gateway.filter.rewrite-path.enabled Ativa o rewrite-path filtro. true
spring.cloud.gateway.filter.rewrite-request-parameter.enabled Ativa o rewrite-request-parameter filtro. true
spring.cloud.gateway.filter.rewrite-response-header.enabled Ativa o rewrite-response-header filtro. true
spring.cloud.gateway.filter.save-session.enabled Ativa o save-session filtro. 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 Ativa o secure-headers filtro. 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 Ativa o set-path filtro. true
spring.cloud.gateway.filter.set-request-header.enabled Ativa o set-request-header filtro. true
spring.cloud.gateway.filter.set-request-host-header.enabled Ativa o set-request-host-header filtro. true
spring.cloud.gateway.filter.set-response-header.enabled Ativa o set-response-header filtro. true
spring.cloud.gateway.filter.set-status.enabled Ativa o set-status filtro. true
spring.cloud.gateway.filter.strip-prefix.enabled Ativa o strip-prefix filtro. true
spring.cloud.gateway.forwarded.enabled Habilita o ForwardedHeadersFilter. true
spring.cloud.gateway.global-filter.adapt-cached-body.enabled Habilita o adapt-cached-body filtro global. true
spring.cloud.gateway.global-filter.forward-path.enabled Habilita o forward-path filtro global. true
spring.cloud.gateway.global-filter.forward-routing.enabled Habilita o forward-routing filtro global. true
spring.cloud.gateway.global-filter.load-balancer-client.enabled Habilita o load-balancer-client filtro global. true
spring.cloud.gateway.global-filter.local-response-cache.enabled Habilita o local-response-cache filtro para todas as rotas, o que permite adicionar uma configuração específica no nível da rota usando um LocalResponseCache filtro. true
spring.cloud.gateway.global-filter.netty-routing.enabled Ativa o netty-routing global filtro. true
spring.cloud.gateway.global-filter.netty-write-response.enabled Habilita o netty-write-response filtro global. true
spring.cloud.gateway.global-filter.reactive-load-balancer-client.enabled Habilita o reactive-load-balancer-client filtro global. true
spring.cloud.gateway.global-filter.remove-cached-body.enabled Habilita o remove-cached-body filtro global. true
spring.cloud.gateway.global-filter.route-to-request-url.enabled Habilita o route-to-request-url filtro global. true
spring.cloud.gateway.global-filter.websocket-routing.enabled Habilita o websocket-routing filtro global. 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 Incluir ou não cabeçalhos contendo informações do limitador de taxa. O valor predefinido é 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 reabastecimento. 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 solicitada. X-RateLimit-Requested-Tokens
spring.cloud.gateway.restrictive-property-accessor.enabled Restringe o acesso ao método e à propriedade no SpEL. true
spring.cloud.gateway.predicate.after.enabled Habilita o after predicado. true
spring.cloud.gateway.predicate.before.enabled Habilita o before predicado. true
spring.cloud.gateway.predicate.between.enabled Habilita o between predicado. true
spring.cloud.gateway.predicate.cloud-foundry-route-service.enabled Habilita o cloud-foundry-route-service predicado. true
spring.cloud.gateway.predicate.cookie.enabled Habilita o cookie predicado. true
spring.cloud.gateway.predicate.header.enabled Habilita o header predicado. true
spring.cloud.gateway.predicate.host.enabled Habilita o host predicado. true
spring.cloud.gateway.predicate.host.include-port Inclua a porta na correspondência com o nome do host. true
spring.cloud.gateway.predicate.method.enabled Habilita o method predicado. true
spring.cloud.gateway.predicate.path.enabled Habilita o path predicado. true
spring.cloud.gateway.predicate.query.enabled Habilita o query predicado. true
spring.cloud.gateway.predicate.read-body.enabled Habilita o read-body predicado. true
spring.cloud.gateway.predicate.remote-addr.enabled Habilita o remote-addr predicado. true
spring.cloud.gateway.predicate.weight.enabled Habilita o weight predicado. true
spring.cloud.gateway.predicate.xforwarded-remote-addr.enabled Habilita o xforwarded-remote-addr predicado. 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 por proxy.
spring.cloud.gateway.streaming-media-types
spring.cloud.gateway.x-forwarded.enabled Se o XForwardedHeadersFilter estiver ativado. true
spring.cloud.gateway.x-forwarded.for-append Se o X-Forwarded-For acréscimo como uma lista estiver habilitado. true
spring.cloud.gateway.x-forwarded.for-enabled Se X-Forwarded-For estiver habilitado. true
spring.cloud.gateway.x-forwarded.host-append Se o X-Forwarded-Host acréscimo como uma lista estiver habilitado. 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 o X-Forwarded-Port acréscimo como uma lista estiver habilitado. true
spring.cloud.gateway.x-forwarded.port-enabled Se X-Forwarded-Port estiver habilitado. true
spring.cloud.gateway.x-forwarded.prefix-append Se o X-Forwarded-Prefix acréscimo como uma lista estiver habilitado. true
spring.cloud.gateway.x-forwarded.prefix-enabled Se X-Forwarded-Prefix estiver habilitado. true
spring.cloud.gateway.x-forwarded.proto-append Se o X-Forwarded-Proto acréscimo como uma lista estiver habilitado. true
spring.cloud.gateway.x-forwarded.proto-enabled Se X-Forwarded-Proto estiver habilitado. true
spring.cloud.gateway.httpclient.compression Permite a compactação para Netty HttpClient. false
spring.cloud.gateway.httpclient.connect-timeout O tempo limite conectado em milis. O valor predefinido é 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 Apenas para o tipo FIXED, o tempo máximo em millis para esperar pela 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 Apenas para o tipo FIXO, 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 millis 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 de vida máximo.
spring.cloud.gateway.httpclient.pool.metrics Permite que as métricas dos pools de canais sejam coletadas e registradas no Micrometer. Desativado por predefinição. false
spring.cloud.gateway.httpclient.pool.name O nome do mapa do pool de canais, como padrão, é 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 SSL close_notify . O valor 3000 mspadrão . 3000ms
spring.cloud.gateway.httpclient.ssl.close-notify-read-timeout Tempo limite de leitura SSL close_notify . O valor predefinido é 0 ms. 0
spring.cloud.gateway.httpclient.ssl.handshake-timeout Tempo limite de handshake SSL. O valor predefinido é 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 Comprimento máximo da carga útil do quadro.
spring.cloud.gateway.httpclient.websocket.proxy-ping Quadros de ping proxy para serviços downstream. O valor predefinido é true. true
spring.cloud.gateway.httpclient.wiretap Permite a depuração de escutas telefônicas para Netty HttpClient. false
spring.cloud.gateway.httpserver.wiretap Permite a depuração de escutas telefônicas para Netty HttpServer. false
spring.cloud.gateway.metrics.enabled Permite 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 tags que foi adicionado às métricas.
spring.cloud.gateway.observability.enabled Se o suporte de observabilidade do micrômetro deve ser ativado. true

Configurações comuns

A lista a seguir descreve configurações comuns:

  • Configurações relacionadas ao registro:
    • logging.level.*
    • logging.group.*
    • Quaisquer outras configurações em logging.* namespace devem ser proibidas. Por exemplo, escrever arquivos de log usando logging.file deve ser proibido.