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
- Uma conta do Azure com uma assinatura ativa. Caso ainda não tenha uma, você pode criar uma gratuitamente.
- CLI do Azure.
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.
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. Faça logon no Azure com a CLI do Azure.
az login
Crie um grupos de recursos.
az group create --name $RESOURCE_GROUP --location $LOCATION
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.
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 \
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
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}"
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 extremidadeactuator/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 usandologging.file
deve ser proibida.