Spring Cloud Bus

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.