Весенний облачный автобус
1. Обзор
В этой статье мы посмотрим на новый проект Spring Cloud Bus. Spring Cloud Bus использует легкого брокера сообщений для связи распределенных узлов системы. Основное использование заключается в трансляции изменений конфигурации или другой управленческой информации. Мы можем думать об этом как распределенный актуатор .
Проект использует брокера АМЗП в качестве транспорта, но Apache Kafka или Redis могут быть использованы вместо RabbitM. Другие транспортные перевозки пока не поддерживаются.
В течение этого учебника, мы собираемся использовать RabbitM’ в качестве нашего основного транспорта – который мы, естественно, работает уже.
2. Предпосылки
Прежде чем мы начнем, рекомендуется уже завершили ” Быстрый Введение в весеннюю конфигурацию облака “. Мы собираемся взять существующий облачный сервер конфигурации и клиента, чтобы расширить их и добавить автоматические уведомления об изменениях конфигурации.
2.1. КроликМЗ
Начнем с RabbitM, который мы рекомендуем работать как Кроликм как докеру изображение . Это довольно просто установить – для того чтобы получить RabbitM’ бежать местно, нам нужно установить Docker и выполнять следующие команды после успешной установки Docker:
docker pull rabbitmq:3-management
Эта команда вытягивает изображение докера RabbitM’ вместе с установленным и включенным по умолчанию плагином управления.
Далее, мы можем запустить RabbitM:
docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
Как только мы выполнили команду, мы можем перейти в веб-браузер и открыть http://localhost:15672 , который покажет форму входа консоли управления. Имя пользователя по умолчанию: “Гость” ; пароль: “Гость” . КроликМЗ также будет слушать на порт 5672.
3. Добавление привода в облачный клиент Config
Мы должны иметь облако config сервера и облако config клиента как работает. Для обновления конфигурации каждый раз требуется перезагрузка клиента, что не идеально.
Давайте прекратим мешать клиенту и аннотировать КонфигКлиент класс контроллера с @RefreshScope :
@SpringBootApplication @RestController @RefreshScope public class SpringCloudConfigClientApplication { // Code here... }
Наконец, давайте обновим пом.xml файл и добавить актуатор:
org.springframework.boot spring-boot-actuator 2.2.6.RELEASE
Последнюю версию можно найти здесь .
По умолчанию все чувствительные конечные точки, добавленные приводом, защищены. Это включает в ‘/обновить’ конечная точка. Для простоты мы отключим безопасность, обновив bootstrap.properts :
management.security.enabled=false
Кроме того, начиная с весенней загрузки 2, конечные точки привода не подвергаются воздействию по умолчанию . Чтобы сделать их доступными для доступа, мы должны добавить это в application.yml :
management: endpoints: web: exposure: include: "*"
Давайте сначала начнем работу с клиентом и обновим роль пользователя с существующих ‘Разработчик’ ‘Программист’ в файле свойств на GitHub. Сервер Config сразу же покажет обновленные значения; однако, клиент не будет. Чтобы клиент увидел новые файлы, нам просто нужно отправить пустой запрос POST ‘/обновить’ конечная точка, которая была добавлена приводом:
$> 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'.
Роль пользователя была успешно обновлена и, позвонив ‘/обновить’ конечная точка. Клиент обновил конфигурацию без перезагрузки.
4. Весенний облачный автобус
Используя Actuator, мы можем обновить клиентов. Тем не менее, в облачной среде, мы должны пойти к каждому клиенту и перезагрузить конфигурацию, доступ к конечной точке привода.
Для решения этой проблемы мы можем использовать весенний облачный автобус.
4.1. Клиент
Нам нужно обновить облако config клиента, так что он может подписаться на обмен RabbitM’:
org.springframework.cloud spring-cloud-starter-bus-amqp 2.2.1.RELEASE
Последнюю версию можно найти здесь .
Для завершения изменений в клиентах нам необходимо добавить сведения о RabbitM и включить облачный автобус в application.yml файл:
--- spring: rabbitmq: host: localhost port: 5672 username: guest password: guest cloud: bus: enabled: true refresh: enabled: true
Обратите внимание, что мы используем имя пользователя и пароль по умолчанию. Это должно быть обновлено для реальной жизни, производственных приложений. Для этого учебника это нормально.
Теперь у клиента будет еще одна конечная точка ‘/автобус-обновление’ . Вызов этой конечной точки вызовет:
- получить последнюю конфигурацию с сервера конфигурации и обновить его конфигурацию, аннотированную @RefreshScope
- отправить сообщение на биржу АМЗП, информирующее о событии обновления
- все узлы, подписавшиеся на подписку, также обновят свою конфигурацию
Таким образом, нам не нужно идти в отдельные узлы и вызывать обновление конфигурации.
4.2. Сервер
Наконец, давайте добавим две зависимости к серверу конфигурации, чтобы полностью автоматизировать изменения конфигурации.
org.springframework.cloud spring-cloud-config-monitor 2.2.2.RELEASE
Последнюю версию можно найти здесь .
org.springframework.cloud spring-cloud-starter-stream-rabbit 3.0.4.RELEASE
Самая последняя версия может быть найдена здесь .
Мы будем использовать весна-облако-конфиг-монитор для мониторинга изменений конфигурации и трансляции событий с использованием RabbitM’ в качестве транспорта.
Нам просто нужно обновить application.properts и дать КроликМЗ подробную информацию:
spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
4.3. GitHub Webhook
Теперь все готово. Как только сервер получает уведомление об изменении конфигурации, он будет транслировать это как сообщение RabbitM. Клиент будет слушать сообщения и обновлять свою конфигурацию при передаче события изменения конфигурации. Однако, как сервер будет теперь о модификации?
Нам нужно настроить GitHub Webhook. Давайте перейдите на GitHub и откроем наш репозиторий, держащий свойства конфигурации. Теперь давайте выберем Настройки и Вебхук . Давайте нажимаем на Добавить webhook пуговица.
URL полезной нагрузки является URL для нашего сервера ‘/монитор’ конечная точка. В нашем случае URL будет что-то вроде этого:
http://root: (электронная почта защищена) _IP:8888/monitor
Нам просто нужно изменить Тип содержимого в выпадают меню для приложение/json. Далее, пожалуйста, оставьте Секретный пустой и нажмите на Добавить webhook кнопка – после этого, мы все готово.
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'.
Раньше мы должны были использовать ‘/обновить’ конечная точка для перезагрузки изменений конфигурации. Давайте откроем файл свойств, изменим user.role вернуться к Разработчик и нажмите изменения:
user.role=Programmer
Если мы проверим клиента сейчас, мы увидим:
$> curl http://localhost:8080/whoami/Mr_Pink Hello Mr_Pink! You are a(n) Developer and your password is 'd3v3L'.
Клиент Config обновил свою конфигурацию без перезагрузки и без явного обновления почти одновременно. Мы можем вернуться к GitHub и открыть недавно созданный Webhook. В самом низу, Есть последние поставки. Мы можем выбрать один в верхней части списка (если это было первое изменение – там будет только один в любом случае) и изучить JSON, который был отправлен на сервер config.
Мы также можем проверить журналы config и сервера, и мы увидим записи:
o.s.cloud.bus.event.RefreshListener: Received remote refresh request. Keys refreshed []
6. Заключение
В этой статье мы взяли существующий сервер и клиент весеннего облака и добавили конечную точку привода для обновления конфигурации клиента. Далее мы использовали Spring Cloud Bus для трансляции изменений конфигурации и автоматизации обновления клиентов. Мы также настроили GitHub Webhook и протестировали всю настройку.
Как всегда, код, используемый во время обсуждения, можно найти более на GitHub .