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
- Uma conta do Azure com uma assinatura ativa. Se você ainda não tiver um, você pode criar um gratuitamente.
- CLI do Azure.
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.
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
espring.cloud.config.server.git.password
.Entre 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 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.
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
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 propriedaderefresh-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
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 de0
.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 usandologging.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.
- 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.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
parafalse
para que o servidor retorne um status HTTP404
se o aplicativo não for encontrado. Por padrão, esse sinalizador é definido comotrue
.
- Você poderá definir
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.
- Defina essa propriedade para
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:
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)); } } }
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 comofalse
erefresh-interval
é definido como 60 segundos.spring: cloud: config: auto-refresh: true refresh-interval: 60 management: endpoints: web: exposure: include: - refresh
Adicione
@RefreshScope
no código. No exemplo a seguir, a variávelconnectTimeout
é 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:
Adicione a propriedade criptografada no arquivo .properties no seu repositório Git.
O arquivo deverá ser parecido com o seguinte exemplo:
message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
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:
Adicione a propriedade criptografada no arquivo .properties no seu repositório Git.
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
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
noclasspath
, ou definirspring.cloud.bootstrap.enabled=true
como uma propriedade do sistema, definaencrypt.key
embootstrap.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