Перейти к основному содержимому

Весенний облачный автобус

· 6 мин. чтения

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 .