Spring Cloud Bus

Spring Cloud Bus

1. обзор

В этой статье мы рассмотрим новый проект Spring Cloud Bus. Spring Cloud Bus использует облегченный брокер сообщений для связи узлов распределенной системы. Основное использование - широковещательная рассылка изменений конфигурации или другой управляющей информации. Мы можем думать об этом как о распределенномActuator.

В проекте в качестве транспорта используется брокер AMQP, но вместо RabbitMQ можно использовать Apache Kafka или Redis. Другие транспорты пока не поддерживаются.

В ходе этого руководства мы собираемся использовать RabbitMQ в качестве основного транспорта, который, естественно, уже будет запущен.

2. Предпосылки

Прежде чем мы начнем, рекомендуется уже заполнить «Quick Intro to Spring Cloud Configuration». Мы собираемся использовать существующие сервер и клиент облачной конфигурации, чтобы расширить их и добавить автоматические уведомления об изменениях конфигурации.

2.1. RabbitMQ

Начнем с RabbitMQ, который мы рекомендуем использовать какRabbitMQ as a docker image. Это довольно просто настроить - чтобы RabbitMQ работал локально, нам нужноinstall Docker и выполнить следующие команды после успешной установки Docker:

docker pull rabbitmq:3-management

Эта команда извлекает образ докера RabbitMQ вместе с плагином управления, установленным и включенным по умолчанию.

Далее мы можем запустить RabbitMQ:

docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

Выполнив команду, мы можем перейти в веб-браузер и открытьhttp://localhost:15672, который покажет форму входа в консоль управления. Имя пользователя по умолчанию:‘guest'; пароль:‘guest'. RabbitMQ также будет прослушивать порт 5672.

3. Добавление привода в клиент Cloud Config

У нас должен быть запущен сервер облачной конфигурации и клиент облачной конфигурации. Для обновления изменений конфигурации каждый раз требуется перезагрузка клиента, что не идеально.

Давайте остановим клиент конфигурации и аннотируем класс контроллераConfigClient с помощью@RefreshScope:

@SpringBootApplication
@RestController
@RefreshScope
public class SpringCloudConfigClientApplication {
    // Code here...
}

Наконец, давайте обновим файлpom.xml и добавим Actuator:


    org.springframework.boot
    spring-boot-actuator
    1.5.5.RELEASE

Последнюю версию можно найтиhere.

По умолчанию все чувствительные конечные точки, добавленные приводом, защищены. Это включает конечную точку‘/refresh'. Для простоты отключим безопасность, обновивbootstrap.properties:

management.security.enabled=false

Давайте сначала запустим клиент и обновим роль пользователя с существующего‘Developer' до‘Programmer' в файле свойств на GitHub. Сервер конфигурации сразу покажет обновленные значения; однако клиент этого не сделает. Чтобы клиент видел новые файлы, нам просто нужно отправить пустой запрос POST в конечную точку‘/refresh', который был добавлен исполнительным механизмом:

$> curl -X POST http://localhost:8080/refresh

Мы вернем файл JSON с обновленными свойствами:

[
  "user.role"
]

Наконец, мы можем проверить, была ли обновлена ​​роль пользователя:

$> curl http://localhost:8080/whoami/Mr_Pink
Hello Mr_Pink! You are a(n) Programmer and your password is 'd3v3L'.

Роль пользователя была успешно обновлена ​​путем вызова конечной точки‘/refresh'. Клиент обновил конфигурацию без перезапуска.

4. Spring Cloud Bus

Используя Actuator, мы можем обновлять клиентов. Однако в облачной среде нам необходимо перейти к каждому клиенту и перезагрузить конфигурацию, получив доступ к конечной точке привода.

Чтобы решить эту проблему, мы можем использовать Spring Cloud Bus.

4.1. клиент

Нам нужно обновить клиент облачной конфигурации, чтобы он мог подписаться на обмен RabbitMQ:


    org.springframework.cloud
    spring-cloud-starter-bus-amqp
    1.3.1.RELEASE

Последнюю версию можно найтиhere.

Чтобы завершить изменения конфигурации клиента, нам просто нужно добавить детали RabbitMQ в файлapplication.yml:

---
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

Обратите внимание, что мы используем имя пользователя и пароль по умолчанию. Это должно быть обновлено для реальных, производственных приложений. Для этого урока это хорошо.

Теперь у клиента будет другая конечная точка‘/bus/refresh'. Вызов этой конечной точки вызовет:

  • получить последнюю конфигурацию с сервера конфигурации и обновить ее конфигурацию с пометкой@RefreshScope

  • отправить сообщение в биржу AMQP с информацией о событии обновления

  • все подписанные узлы также обновят свою конфигурацию

Таким образом, нам не нужно переходить к отдельным узлам и запускать обновление конфигурации.

4.2. сервер

Наконец, давайте добавим две зависимости к серверу конфигурации, чтобы полностью автоматизировать изменения конфигурации.


    org.springframework.cloud
    spring-cloud-config-monitor
    1.3.1.RELEASE

Последнюю версию можно найтиhere.


    org.springframework.cloud
    spring-cloud-starter-stream-rabbit
    1.2.1.RELEASE

Самую последнюю версию можно найтиhere.

Мы будем использоватьspring-cloud-config-monitor для отслеживания изменений конфигурации и широковещательных событий, используя RabbitMQ в качестве транспорта.

Нам просто нужно обновитьapplication.properties и предоставить сведения о RabbitMQ:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

4.3. GitHub Webhook

Все установлено сейчас. Как только сервер получит уведомление об изменениях конфигурации, он передаст это в виде сообщения в RabbitMQ. Клиент будет прослушивать сообщения и обновлять свою конфигурацию при передаче события изменения конфигурации. Тем не менее, как сервер теперь будет о модификации?

Нам нужно настроить GitHub Webhook. Давайте зайдем на GitHub и откроем наш репозиторий, содержащий свойства конфигурации. Теперь давайте выберемSettings иWebhook. Нажмите кнопкуAdd webhook.

URL-адрес полезной нагрузки - это URL-адрес конечной точки нашего сервера конфигурации‘/monitor'. В нашем случае URL будет примерно таким:

http://root:[.cf_email # [электронная почта защищена] #_ IP: 8888 / монитор]

Нам просто нужно изменитьContent type в раскрывающемся меню наapplication/json.. Затем оставьте полеSecret пустым и нажмите кнопкуAdd webhook - после этого все готово.

5. тестирование

Убедимся, что все приложения работают. Если мы вернемся и проверим клиент, он покажетuser.role как‘Programmer' иuser.password как «d3v3L»:

$> curl http://localhost:8080/whoami/Mr_Pink
Hello Mr_Pink! You are a(n) Programmer and your password is 'd3v3L'.

Раньше нам приходилось использовать конечную точку‘/refresh' для перезагрузки изменений конфигурации. Давайте откроем файл свойств, изменимuser.role обратно наDeveloper и внесем изменения:

user.role=Programmer

Если мы проверим клиента сейчас, мы увидим:

$> curl http://localhost:8080/whoami/Mr_Pink
Hello Mr_Pink! You are a(n) Developer and your password is 'd3v3L'.

Клиент конфигурации обновил свою конфигурацию без перезапуска и без явного обновления почти одновременно. Мы можем вернуться к GitHub и открыть недавно созданный Webhook. В самом низу находятся Недавние поставки. Мы можем выбрать один в верхней части списка (при условии, что это было первое изменение - в любом случае оно будет только одно) и изучить JSON, который был отправлен на сервер конфигурации.

Мы также можем проверить конфигурации и журналы сервера, и мы увидим записи:

o.s.cloud.bus.event.RefreshListener: Received remote refresh request. Keys refreshed []

6. Заключение

В этой статье мы взяли существующий весенний облачный конфигурационный сервер и клиент и добавили конечную точку привода для обновления конфигурации клиента. Затем мы использовали Spring Cloud Bus для трансляции изменений конфигурации и автоматизации обновлений клиента. Мы также настроили GitHub Webhook и протестировали всю настройку.

Как всегда, код, использованный во время обсуждения, можно найтиover on GitHub.