Compartilhar via


Tutorial: Conectar-se a um Servidor de Configuração Gerenciado para Spring nos 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ê irá aprender a conectar um aplicativo hospedado nos Aplicativos de Contêiner do Azure a uma instância Java do Config Server for Spring.

O componente Java do Config Server para Spring usa um repositório GitHub como origem das definições de configuração. 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 componente Java do Config Server for Spring
  • 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 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 Config Server for Spring nos Aplicativos de Contêiner do Azure, observe os 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 é dimensionado. 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 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.
Associaçã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 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, você criará um componente Java do Config Server for Spring.
    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 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 Java do Config Server para Spring e seu aplicativo de contêiner.

Crie o componente Java do Config Server para Spring

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 Java do Config Server for Spring.

    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 componente Java do Config Server for Spring.

    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 Java do Config Server para Spring

  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. Associe ao Config Server for 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 definição de configuração no aplicativo como variáveis de ambiente. Esses valores agora estão disponíveis para o código do aplicativo usar ao buscar 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, poderá consultar a variável de ambiente SPRING_CLOUD_CONFIG_COMPONENT_URI - por exemplo, você poderá 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 Config Server para o componente 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 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

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 use o 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 principal não existir, o servidor de configuração por padrão também tentará fazer check-out de um branch chamado mestre. Se você quiser desabilitar o comportamento de branch de fallback, 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
O servidor de configuração por padrã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, usa o URI padrão definido abaixo.

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 para que uma fonte de propriedade seja enviada a todos os clientes incondicionalmente.
  • spring.cloud.config.override-none

    • Você pode alterar a prioridade de todas as substituições no cliente para serem mais como valores padrão, permitindo que os aplicativos forneçam seus próprios valores em variáveis de ambiente ou propriedades do sistema, definindo o sinalizador spring.cloud.config.override-none=true - o padrão é falso - no repositório remoto.
  • 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 colocando duas propriedades dentro da configuração de aplicativos provenientes 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 Config Server para o componente Java do Spring para usar o repositório Git que possui 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 Config Server para o componente Java do Spring para usar o repositório Git que possui 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