Spring Cloud Bus
1. Visão geral
Neste artigo, vamos dar uma olhada no novo projeto Spring Cloud Bus. O Spring Cloud Bus usa um intermediário de mensagens leve para vincular nós do sistema distribuído. O uso principal é transmitir alterações de configuração ou outras informações de gerenciamento. Podemos pensar nisso como umActuator distribuído.
O projeto usa o broker AMQP como transporte, mas o Apache Kafka ou Redis pode ser utilizado em vez do RabbitMQ. Outros transportes ainda não são suportados.
Ao longo deste tutorial, usaremos RabbitMQ como nosso transporte principal - que naturalmente já estaremos executando.
2. Pré-requisitos
Antes de começar, é recomendável já ter concluído “Quick Intro to Spring Cloud Configuration“. Vamos usar um servidor de configuração de nuvem existente e cliente para estendê-los e adicionar notificações automáticas sobre mudanças de configuração.
2.1. RabbitMQ
Vamos começar com RabbitMQ, que recomendamos executar comoRabbitMQ as a docker image. Isso é muito simples de configurar - para fazer o RabbitMQ rodar localmente, precisamosinstall Dockere executar os seguintes comandos assim que o Docker for instalado com sucesso:
docker pull rabbitmq:3-management
Este comando puxa a imagem da janela de encaixe RabbitMQ junto com o plug-in de gerenciamento instalado e ativado por padrão.
Em seguida, podemos executar o RabbitMQ:
docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
Depois de executar o comando, podemos ir para o navegador da web e abrirhttp://localhost:15672, que mostrará o formulário de login do console de gerenciamento. O nome de usuário padrão é:‘guest'; senha:‘guest'. O RabbitMQ também escutará na porta 5672.
3. Adicionando Atuador ao Cliente Cloud Config
Deveríamos ter o servidor de configuração em nuvem e o cliente de configuração em nuvem em execução. Para atualizar as alterações na configuração, é necessário reiniciar o cliente sempre - o que não é o ideal.
Vamos parar de configurar o cliente e anotar a classe do controladorConfigClient com@RefreshScope:
@SpringBootApplication
@RestController
@RefreshScope
public class SpringCloudConfigClientApplication {
// Code here...
}
Por fim, vamos atualizar o arquivopom.xml e adicionar Atuador:
org.springframework.boot
spring-boot-actuator
1.5.5.RELEASE
A versão mais recente pode ser encontradahere.
Por padrão, todos os pontos finais sensíveis adicionados pelo atuador são protegidos. Isso inclui o ponto de extremidade‘/refresh'. Para simplificar, desligaremos a segurança atualizandobootstrap.properties:
management.security.enabled=false
Vamos iniciar o cliente primeiro e atualizar a função do usuário de‘Developer' existente para‘Programmer' no arquivo de propriedades no GitHub. O servidor de configuração mostrará os valores atualizados imediatamente; no entanto, o cliente não. Para fazer o cliente ver novos arquivos, só precisamos enviar uma solicitação POST vazia para o endpoint‘/refresh', que foi adicionado pelo atuador:
$> curl -X POST http://localhost:8080/refresh
Recuperaremos o arquivo JSON mostrando as propriedades atualizadas:
[
"user.role"
]
Por fim, podemos verificar se a função de usuário foi atualizada:
$> curl http://localhost:8080/whoami/Mr_Pink
Hello Mr_Pink! You are a(n) Programmer and your password is 'd3v3L'.
A função do usuário foi atualizada com sucesso e chamando o endpoint‘/refresh'. Configuração atualizada do cliente sem reiniciar.
4. Spring Cloud Bus
Usando o Actuator, podemos atualizar clientes. No entanto, no ambiente de nuvem, precisaríamos acessar cada cliente e recarregar a configuração acessando o terminal do atuador.
Para resolver esse problema, podemos usar o Spring Cloud Bus.
4.1. Cliente
Precisamos atualizar o cliente de configuração na nuvem para que ele possa se inscrever na troca RabbitMQ:
org.springframework.cloud
spring-cloud-starter-bus-amqp
1.3.1.RELEASE
A versão mais recente pode ser encontradahere.
Para concluir as alterações do cliente de configuração, só precisamos adicionar os detalhes do RabbitMQ a um arquivoapplication.yml:
---
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
Observe que estamos usando nome de usuário e senha padrão. Isso precisa ser atualizado para aplicações de produção e vida real. Para este tutorial, tudo bem.
Agora, o cliente terá outro endpoint‘/bus/refresh'. Chamar este terminal causará:
-
obtenha a configuração mais recente do servidor de configuração e atualize sua configuração anotada por@RefreshScope
-
envie uma mensagem para a troca AMQP informando sobre o evento de atualização
-
todos os nós inscritos também atualizarão sua configuração
Dessa forma, não precisamos ir para nós individuais e acionar a atualização da configuração.
4.2. Servidor
Finalmente, vamos adicionar duas dependências ao servidor de configuração para automatizar totalmente as alterações de configuração.
org.springframework.cloud
spring-cloud-config-monitor
1.3.1.RELEASE
A versão mais recente pode ser encontradahere.
org.springframework.cloud
spring-cloud-starter-stream-rabbit
1.2.1.RELEASE
A versão mais recente pode ser encontradahere.
Usaremosspring-cloud-config-monitor para monitorar mudanças de configuração e eventos de transmissão usando RabbitMQ como transporte.
Precisamos apenas atualizarapplication.propertiese fornecer os detalhes do RabbitMQ:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
4.3. GitHub Webhook
Está tudo pronto agora. Depois que o servidor for notificado sobre alterações na configuração, ele transmitirá isso como uma mensagem para o RabbitMQ. O cliente ouvirá as mensagens e atualizará sua configuração quando o evento de alteração de configuração for transmitido. No entanto, como um servidor irá agora sobre a modificação?
Precisamos configurar um Webhook do GitHub. Vamos ao GitHub e abra nosso repositório que contém as propriedades de configuração. Agora, vamos selecionarSettings eWebhook. Vamos clicar no botãoAdd webhook.
URL de carga útil é a URL para o endpoint‘/monitor' do nosso servidor de configuração. No nosso caso, o URL será mais ou menos assim:
http://root:[.cf_email # [email protegido] #_ IP: 8888 / monitor]
Precisamos apenas alterarContent type no menu suspenso paraapplication/json. Em seguida, deixeSecret vazio e clique no botãoAdd webhook - depois disso, está tudo pronto.
5. Teste
Vamos verificar se todos os aplicativos estão em execução. Se voltarmos e verificarmos o cliente, ele mostraráuser.role como‘Programmer'euser.password como ‘d3v3L‘:
$> curl http://localhost:8080/whoami/Mr_Pink
Hello Mr_Pink! You are a(n) Programmer and your password is 'd3v3L'.
Anteriormente, tínhamos que usar o endpoint‘/refresh' para recarregar as alterações de configuração. Vamos abrir o arquivo de propriedades, alteraruser.role de volta paraDevelopere enviar as alterações:
user.role=Programmer
Se verificarmos o cliente agora, veremos:
$> curl http://localhost:8080/whoami/Mr_Pink
Hello Mr_Pink! You are a(n) Developer and your password is 'd3v3L'.
O cliente de configuração atualizou sua configuração sem reiniciar e sem atualização explícita quase simultaneamente. Podemos voltar ao GitHub e abrir o Webhook recentemente criado. Na parte inferior, existem entregas recentes. Podemos selecionar um no topo da lista (assumindo que essa foi a primeira alteração - haverá apenas uma de qualquer maneira) e examinar o JSON que foi enviado ao servidor de configuração.
Também podemos verificar os logs de configuração e do servidor e veremos as entradas:
o.s.cloud.bus.event.RefreshListener: Received remote refresh request. Keys refreshed []
6. Conclusão
Neste artigo, pegamos o servidor e o cliente de configuração em nuvem da primavera e adicionamos o ponto final do atuador para atualizar a configuração do cliente. Em seguida, usamos o Spring Cloud Bus para transmitir alterações de configuração e automatizar atualizações de clientes. Também configuramos o GitHub Webhook e testamos toda a instalação.
Como sempre, o código usado durante a discussão pode ser encontradoover on GitHub.