Compartilhar via


Conectar-se a um servidor de configuração gerenciado para o Spring no Aplicativos de Contêiner do Azure

O Config Server for Spring fornece um local centralizado para disponibilizar dados de configuração para vários aplicativos. Neste artigo, você aprenderá a conectar um aplicativo hospedado em Aplicativos de Contêiner do Azure a um servidor de configuração Java para a instância do Spring.

O componente Config Server for Spring Java usa um repositório GitHub como a origem das configurações. Os valores de configuração são disponibilizados para o aplicativo de contêiner por meio de uma associação entre o componente e o aplicativo de contêiner. À medida que os valores são alterados no servidor de configuração, eles fluem automaticamente para o aplicativo, tudo isso sem exigir que você recompile ou reimplante o aplicativo.

Neste tutorial, você aprenderá a:

  • Criar um servidor de configuração para o componente spring Java
  • Associar o Config Server for Spring ao seu aplicativo de contêiner
  • Observe os valores de configuração antes e depois de conectar o servidor de configuração ao seu aplicativo
  • Criptografar e descriptografar valores de configuração com uma chave simétrica

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 Servidor de Configuração para o Spring no Aplicativos de Contêiner do Azure, lembre-se dos seguintes detalhes:

Item Explicação
Escopo O Config Server for Spring é executado no mesmo ambiente que o aplicativo de contêiner conectado.
Dimensionamento Para manter uma única fonte de verdade, o Config Server for Spring não escala. As propriedades de dimensionamento minReplicas e maxReplicas estão definidas como 1.
Recursos A alocação de recursos do contêiner para o Config Server for Spring é fixa, o número de núcleos de CPU é 0,5 e o tamanho da memória é 1Gi.
Preços A cobrança do Config Server for 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.
Vinculação O aplicativo de contêiner se conecta a um Config Server for Spring por meio de uma associação. A associação injeta as configurações nas variáveis de ambiente do aplicativo de contêiner. Após o estabelecimento de uma vinculação, o aplicativo de contêiner poderá ler os valores de configuração das variáveis de ambiente.

Instalação

Antes de começar a trabalhar com o Config Server for Spring, você precisa 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.

    export LOCATION=eastus
    export RESOURCE_GROUP=my-services-resource-group
    export ENVIRONMENT=my-environment
    export JAVA_COMPONENT_NAME=configserver
    export APP_NAME=my-config-client
    export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-service-config-client:latest"
    export URI="https://github.com/Azure-Samples/azure-spring-cloud-config-java-aca.git"
    
    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 Config Server for Spring Java.
    IMAGE A imagem do contêiner usada no seu aplicativo de contêiner.
    URI Você pode substituir o URI pela URL do seu repositório Git, se for privado, adicione as configurações de autenticação relacionadas, como spring.cloud.config.server.git.username e spring.cloud.config.server.git.password.
  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 Java do Config Server para Spring e seu aplicativo de contêiner.

Criar o servidor de configuração para o componente Spring Java

Agora que você tem um ambiente de Aplicativos de Contêiner, pode criar seu aplicativo de contêiner e vinculá-lo a um componente Java do Config Server para Spring. Quando você vincula seu aplicativo de contêiner, os valores de configuração são sincronizados automaticamente do componente Config Server para o seu aplicativo.

  1. Crie o componente Config Server para Spring Java.

    az containerapp env java-component config-server-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
        --min-replicas 1 \
        --max-replicas 1 \
        --configuration spring.cloud.config.server.git.uri=$URI
    
  2. Atualize o servidor de configuração para o componente Spring Java.

    az containerapp env java-component config-server-for-spring update \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
        --min-replicas 2 \
        --max-replicas 2 \
        --configuration spring.cloud.config.server.git.uri=$URI spring.cloud.config.server.git.refresh-rate=60
    

    Aqui, você está dizendo ao componente onde encontrar o repositório que contém suas informações de configuração por meio da propriedade uri. A propriedade refresh-rate informa aos Aplicativos de Contêiner com que frequência verificar alterações no seu repositório Git.

Associar seu aplicativo de contêiner ao componente Config Server for Spring Java

  1. Crie o aplicativo de contêiner que consome os dados de configuração.

    az containerapp create \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --environment $ENVIRONMENT \
        --image $IMAGE \
        --min-replicas 1 \
        --max-replicas 1 \
        --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 o URL em um editor de texto para poder usá-lo em uma próxima etapa.

    Se você visitar seu aplicativo em um navegador, o valor connectTimeout retornado será o valor padrão de 0.

  2. Vincule-se ao Servidor de Configuração do Spring.

    Agora que o aplicativo de contêiner e o Servidor de Configuração foram criados, vincule-os juntos com o comando update ao seu aplicativo contêiner.

    az containerapp update \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --bind $JAVA_COMPONENT_NAME
    

    O parâmetro --bind $JAVA_COMPONENT_NAME cria o link entre o aplicativo contêiner e o componente de configuração.

Após o aplicativo de contêiner e o componente Config Server serem vinculados, as alterações de configuração serão sincronizadas automaticamente com o aplicativo de contêiner.

Quando você visitar a URL do aplicativo novamente, o valor de connectTimeout agora será 10000. Esse valor vem do repositório Git definido na variável $URI originalmente configurada como a fonte do componente de configuração. Especificamente, este valor é extraído da propriedade connectionTimeout no arquivo application.yml do repositório.

A solicitação de associação injeta a configuração no aplicativo em forma de variáveis de ambiente. Esses valores agora estão disponíveis para o código da aplicação usar ao obter as configurações do servidor de configuração.

Nesse caso, as seguintes variáveis ​​de ambiente estão disponíveis para o aplicativo:

SPRING_CLOUD_CONFIG_URI=http://[JAVA_COMPONENT_INTERNAL_FQDN]:80
SPRING_CLOUD_CONFIG_COMPONENT_URI=http://[JAVA_COMPONENT_INTERNAL_FQDN]:80
SPRING_CONFIG_IMPORT=optional:configserver:$SPRING_CLOUD_CONFIG_URI

Se você quiser personalizar seu próprio SPRING_CONFIG_IMPORT, você pode consultar a variável de ambiente SPRING_CLOUD_CONFIG_COMPONENT_URI - por exemplo, você pode substituir por argumentos de linha de comando, como Java -Dspring.config.import=optional:configserver:${SPRING_CLOUD_CONFIG_COMPONENT_URI}?fail-fast=true.

Você também pode remover uma associação de seu aplicativo.

(Opcional) Desassociar seu aplicativo de contêiner do componente Config Server for Spring Java

Para remover uma associação de um aplicativo de contêiner, use a opção --unbind .

az containerapp update \
    --name $APP_NAME \
    --unbind $JAVA_COMPONENT_NAME \
    --resource-group $RESOURCE_GROUP

Quando você acessar a URL do aplicativo novamente, o valor de connectTimeout será alterado para 0.

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

Opções de configuração

O comando az containerapp update usa o parâmetro --configuration para controlar como o Config Server for Spring está configurado. Você pode usar vários parâmetros ao mesmo tempo, desde que estejam separados por um espaço. Para obter mais informações, confira Spring Cloud Config Server.

A tabela a seguir descreve os diferentes valores de configuração de back-end do Git disponíveis:

Nome Descrição
spring.cloud.config.server.git.uri
spring.cloud.config.server.git.repos.{repoName}.uri
URI do repositório remoto.
spring.cloud.config.server.git.username
spring.cloud.config.server.git.repos.{repoName}.username
Nome de usuário para autenticação com repositório remoto.
spring.cloud.config.server.git.password
spring.cloud.config.server.git.repos.{repoName}.password
Senha para autenticação com repositório remoto.
spring.cloud.config.server.git.search-paths
spring.cloud.config.server.git.repos.{repoName}.search-paths
Pesquisar caminhos a serem usados na cópia de trabalho local. Por padrão, pesquisa apenas a raiz.
spring.cloud.config.server.git.force-pull
spring.cloud.config.server.git.repos.{repoName}.force-pull
Sinalizar para indicar que o repositório deve forçar o pull. Se true, descarte todas as alterações locais e obtenha as do repositório remoto.
spring.cloud.config.server.git.default-label
spring.cloud.config.server.git.repos.{repoName}.default-label
O rótulo padrão usado para o Git é principal. Se você não definir spring.cloud.config.server.git.default-label e um branch chamado main não existir, o servidor de configuração, por padrão, também tentará realizar check-out de um branch chamado master. Se você quiser desabilitar o comportamento de fallback do ramo, poderá definir spring.cloud.config.server.git.tryMasterBranch para false.
spring.cloud.config.server.git.try-master-branch
spring.cloud.config.server.git.repos.{repoName}.try-master-branch
Por padrão, o servidor de configuração tenta fazer check-out de um branch chamado mestre.
spring.cloud.config.server.git.skip-ssl-validation
spring.cloud.config.server.git.repos.{repoName}.skip-ssl-validation
Você pode desabilitar a validação do certificado TLS/SSL do servidor Git pelo servidor de configuração definindo a propriedade git.skipSslValidation para true.
spring.cloud.config.server.git.clone-on-start
spring.cloud.config.server.git.repos.{repoName}.clone-on-start
Sinalizador para indicar que o repositório deve ser clonado na inicialização, não sob demanda. Geralmente, leva a uma inicialização mais lenta, mas a uma primeira consulta mais rápida.
spring.cloud.config.server.git.timeout
spring.cloud.config.server.git.repos.{repoName}.timeout
Tempo limite em segundos para obter uma conexão HTTP ou SSH, se aplicável. O valor padrão é 5 segundos.
spring.cloud.config.server.git.refresh-rate
spring.cloud.config.server.git.repos.{repoName}.refresh-rate
Com que frequência o servidor de configuração busca dados de configuração atualizados do back-end do Git.
spring.cloud.config.server.git.private-key
spring.cloud.config.server.git.repos.{repoName}.private-key
Chave privada SSH válida. Deve ser definido se ignore-local-ssh-settings for true e o URI do Git estiver no formato SSH.
spring.cloud.config.server.git.host-key
spring.cloud.config.server.git.repos.{repoName}.host-key
Chave de host SSH válida. Deve ser definido se host-key-algorithm também estiver definido.
spring.cloud.config.server.git.host-key-algorithm
spring.cloud.config.server.git.repos.{repoName}.host-key-algorithm
Um de ssh-dss, ssh-rsa, ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384 ou ecdsa-sha2-nistp521. Deve ser definido se host-key também estiver definido.
spring.cloud.config.server.git.strict-host-key-checking
spring.cloud.config.server.git.repos.{repoName}.strict-host-key-checking
true ou false. Se false, ignore os erros com a chave de host.
spring.cloud.config.server.git.repos.{repoName} URI do repositório remoto.
spring.cloud.config.server.git.repos.{repoName}.pattern O formato do padrão é uma lista de nomes de {application}/{profile} separados por vírgula com curingas. Se {application}/{profile} não corresponder a nenhum dos padrões, ele usará o URI padrão definido.

A lista a seguir descreve configurações comuns:

  • Configurações relacionadas ao registro em log:

    • logging.level.*
    • logging.group.*
    • Quaisquer outras configurações no namespace logging.* devem ser proibidas - por exemplo, gravar arquivos de log usando logging.file deve ser proibido.
  • spring.cloud.config.server.overrides

    • Mapa extra de uma fonte de propriedade a ser enviada a todos os clientes incondicionalmente.
  • spring.cloud.config.override-none

    • Você pode alterar a prioridade de todas as substituições no cliente para se assemelharem mais aos valores padrão, permitindo que as aplicações forneçam seus próprios valores em variáveis de ambiente ou propriedades do sistema, definindo o sinalizador spring.cloud.config.override-none=true no repositório remoto - o padrão é falso.
  • spring.cloud.config.allow-override

    • Se você habilitar o primeiro bootstrap de configuração, poderá permitir que os aplicativos cliente substituam a configuração do servidor de configuração. A substituição é feita colocando duas propriedades dentro da configuração dos aplicativos vindas do servidor de configuração.
  • spring.cloud.config.server.health.*

    • Você pode configurar o Indicador de Integridade para verificar mais aplicativos junto com perfis e rótulos personalizados.
  • spring.cloud.config.server.accept-empty

    • Você poderá definir spring.cloud.config.server.accept-empty para false para que o servidor retorne um status HTTP 404 se o aplicativo não for encontrado. Por padrão, esse sinalizador é definido como true.
  • Criptografia e descriptografia (simétrica):

    • encrypt.key
      • Conveniente quando você usa uma chave simétrica porque é um único valor de propriedade a ser configurado.
    • spring.cloud.config.server.encrypt.enabled
      • Defina essa propriedade para false para desabilitar a descriptografia no lado do servidor.

Atualizar

Os serviços que consomem propriedades precisam saber sobre uma alteração antes que ela ocorra. O método de notificação padrão para o Config Server para Spring envolve acionar manualmente o evento de atualização, como uma atualização por chamada https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh, o que pode não ser viável se houver muitas instâncias de aplicativos.

Como alternativa, você pode atualizar automaticamente os valores do Config Server, permitindo que o cliente de configuração sonde se há alterações com base em uma atualização interna. Use as etapas a seguir para atualizar automaticamente os valores do Servidor de Configuração:

  1. Registre uma tarefa agendada para atualizar o contexto em um determinado intervalo, conforme é mostrado no exemplo a seguir:

    @Configuration
    @AutoConfigureAfter({RefreshAutoConfiguration.class, RefreshEndpointAutoConfiguration.class})
    @EnableScheduling
    public class ConfigClientAutoRefreshConfiguration implements SchedulingConfigurer {
        @Value("${spring.cloud.config.refresh-interval:60}")
        private long refreshInterval;
        @Value("${spring.cloud.config.auto-refresh:false}")
        private boolean autoRefresh;
        private final RefreshEndpoint refreshEndpoint;
        public ConfigClientAutoRefreshConfiguration(RefreshEndpoint refreshEndpoint) {
            this.refreshEndpoint = refreshEndpoint;
        }
        @Override
        public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
            if (autoRefresh) {
                // set minimal refresh interval to 5 seconds
                refreshInterval = Math.max(refreshInterval, 5);
                scheduledTaskRegistrar.addFixedRateTask(refreshEndpoint::refresh,  Duration.ofSeconds(refreshInterval));
            }
        }
    }
    
  2. Habilite autorefresh e defina o intervalo de atualização apropriado no arquivo application.yml. No exemplo a seguir, o cliente pesquisa uma alteração de configuração a cada 60 segundos, que é o valor mínimo que você pode definir para um intervalo de atualização.

    Por padrão, autorefresh é definido como false e refresh-interval é definido como 60 segundos.

    spring:
        cloud:
            config:
            auto-refresh: true
            refresh-interval: 60
    management:
        endpoints:
            web:
            exposure:
                include:
                - refresh
    
  3. Adicione @RefreshScope no código. No exemplo a seguir, a variável connectTimeout é atualizada automaticamente a cada 60 segundos:

    @RestController
    @RefreshScope
    public class HelloController {
        @Value("${timeout:4000}")
        private String connectTimeout;
    }
    

Criptografia e descriptografia com uma chave simétrica

Descriptografia do lado do servidor

Por padrão, a criptografia do lado do servidor está habilitada. Use as etapas a seguir para habilitar a descriptografia no seu aplicativo:

  1. Adicione a propriedade criptografada no arquivo .properties no seu repositório Git.

    O arquivo deverá ser parecido com o seguinte exemplo:

    message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
    
  2. Atualize o componente Config Server for Spring Java para usar o repositório Git que tem a propriedade criptografada e defina a chave de criptografia.

    Antes de executar o comando a seguir, substitua espaços reservados cercados por <> pelos seus valores.

    az containerapp env java-component config-server-for-spring update \
        --environment <ENVIRONMENT_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --name <JAVA_COMPONENT_NAME> \
        --configuration spring.cloud.config.server.git.uri=<URI> encrypt.key=randomKey
    

Descriptografia do lado do cliente

Você pode usar a descriptografia de propriedades do lado do cliente seguindo as etapas:

  1. Adicione a propriedade criptografada no arquivo .properties no seu repositório Git.

  2. Atualize o componente Config Server do Spring Java para usar o repositório Git que contém a propriedade criptografada e desativar a descriptografia no lado do servidor.

    Antes de executar o comando a seguir, substitua espaços reservados cercados por <> pelos seus valores.

    az containerapp env java-component config-server-for-spring update \
        --environment <ENVIRONMENT_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --name <JAVA_COMPONENT_NAME> \
        --configuration spring.cloud.config.server.git.uri=<URI> spring.cloud.config.server.encrypt.enabled=false
    
  3. No aplicativo cliente, adicione a chave de descriptografia ENCRYPT_KEY=randomKey como uma variável de ambiente.

    Como alternativa, se você incluir spring-cloud-starter-bootstrap no classpath, ou definir spring.cloud.bootstrap.enabled=true como uma propriedade do sistema, defina encrypt.key em bootstrap.properties.

    Antes de executar o comando a seguir, substitua espaços reservados cercados por <> pelos seus valores.

    az containerapp update \
        --name <APP_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --set-env-vars "ENCRYPT_KEY=randomKey"
    
    encrypt:
      key: somerandomkey