1. Обзор
В этой статье мы рассмотрим новый проект Spring Cloud Bus. Spring Cloud Bus использует упрощенный брокер сообщений для связи узлов распределенной системы. Основное использование — широковещательная рассылка изменений конфигурации или другой управляющей информации. Мы можем думать об этом как о распределенном актуаторе .
В качестве транспорта проект использует брокера AMQP, но вместо RabbitMQ можно использовать Apache Kafka или Redis. Другие транспорты пока не поддерживаются.
В ходе этого руководства мы собираемся использовать RabbitMQ в качестве нашего основного транспорта, который, естественно, у нас уже запущен.
2. Предпосылки
Прежде чем мы начнем, рекомендуется уже выполнить « Краткое введение в конфигурацию Spring Cloud ». Мы возьмем существующий облачный сервер конфигурации и клиент, чтобы расширить их и добавить автоматические уведомления об изменениях конфигурации.
2.1. RabbitMQ
Начнем с RabbitMQ, который мы рекомендуем запускать как RabbitMQ в качестве образа докера . Это довольно просто настроить — чтобы RabbitMQ работал локально, нам нужно установить 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 , который покажет форму входа в консоль управления. Имя пользователя по умолчанию: «гость»
; пароль: «гость»
. RabbitMQ также будет прослушивать порт 5672.
3. Добавление привода в клиент Cloud Config
У нас должны быть запущены сервер облачной конфигурации и клиент облачной конфигурации. Для обновления изменений конфигурации требуется каждый раз перезапуск клиента, что не идеально.
Давайте остановим клиент конфигурации и аннотируем класс контроллера ConfigClient с помощью
@RefreshScope
:
@SpringBootApplication
@RestController
@RefreshScope
public class SpringCloudConfigClientApplication {
// Code here...
}
Наконец, давайте обновим файл pom.xml
и добавим Actuator:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
Последнюю версию можно найти здесь .
По умолчанию все конфиденциальные конечные точки, добавленные исполнительным механизмом, защищены. Сюда входит конечная точка «/refresh»
. Для простоты мы отключим безопасность, обновив application.yml
:
management:
security:
enabled: false
Кроме того, начиная с Spring Boot 2, конечные точки привода по умолчанию не отображаются . Чтобы сделать их доступными для доступа, нам нужно добавить это в application.yml
:
management:
endpoints:
web:
exposure:
include: "*"
Давайте сначала запустим клиент и изменим роль пользователя с существующего «Разработчик»
на «Программист»
в файле свойств на GitHub. Сервер конфигурации сразу покажет обновленные значения; однако клиент этого не сделает. Чтобы клиент увидел новые файлы, нам просто нужно отправить пустой запрос POST на конечную точку /refresh
, которая была добавлена приводом:
$> curl -X POST http://localhost:8080/actuator/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. Весенний облачный автобус
Используя Actuator, мы можем обновлять клиентов. Однако в облачной среде нам нужно будет перейти к каждому отдельному клиенту и перезагрузить конфигурацию, обратившись к конечной точке привода.
Чтобы решить эту проблему, мы можем использовать Spring Cloud Bus.
4.1. Клиент
Нам нужно обновить клиент облачной конфигурации, чтобы он мог подписаться на обмен RabbitMQ:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
Последнюю версию можно найти здесь .
Чтобы завершить изменения конфигурации клиента, нам нужно добавить детали RabbitMQ и включить облачную шину в файле application.yml :
---
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
cloud:
bus:
enabled: true
refresh:
enabled: true
Обратите внимание, что мы используем имя пользователя и пароль по умолчанию. Это необходимо обновить для реальной жизни, производственных приложений. Для этого урока это нормально.
Теперь у клиента будет другая конечная точка «/bus-refresh»
. Вызов этой конечной точки вызовет:
- получить последнюю конфигурацию с сервера конфигурации и обновить ее конфигурацию, аннотированную
@RefreshScope
- отправить сообщение на биржу AMQP, информирующее о событии обновления
- все подписанные узлы также обновят свою конфигурацию
Таким образом, нам не нужно переходить к отдельным узлам и запускать обновление конфигурации.
4.2. Сервер
Наконец, давайте добавим две зависимости к серверу конфигурации, чтобы полностью автоматизировать изменения конфигурации.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-monitor</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
Последнюю версию можно найти здесь .
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
<version>3.0.4.RELEASE</version>
</dependency>
Самую последнюю версию можно найти здесь .
Мы будем использовать 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
Теперь все установлено. Как только сервер получает уведомление об изменениях конфигурации, он передает это как сообщение RabbitMQ. Клиент будет прослушивать сообщения и обновлять свою конфигурацию при передаче события изменения конфигурации. Однако, как теперь обстоят дела с модификацией сервера?
Нам нужно настроить GitHub Webhook. Перейдем на GitHub и откроем наш репозиторий со свойствами конфигурации. Теперь давайте выберем Settings
и Webhook
. Нажимаем кнопку « Добавить вебхук»
.
URL-адрес полезной нагрузки — это URL-адрес конечной точки нашего сервера конфигурации «/monitor»
. В нашем случае URL будет примерно таким:
http://root: s3cr3t@REMOTE _IP:8888/монитор
Нам просто нужно изменить тип содержимого
в раскрывающемся меню на application/json.
Затем оставьте Secret
пустым и нажмите кнопку «Добавить веб-перехватчик»
— после этого все готово.
5. Тестирование
Убедимся, что все приложения запущены. Если мы вернемся и проверим клиент, он покажет user.role
как «Программист»
и 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 и клиент и добавили конечную точку привода для обновления конфигурации клиента. Затем мы использовали Spring Cloud Bus для трансляции изменений конфигурации и автоматизации клиентских обновлений. Мы также настроили GitHub Webhook и протестировали всю установку.
Как всегда, код, использованный во время обсуждения, можно найти на GitHub .