JavaRush /Курсы /Модуль 5. Spring /Лекция 224: Динамическое обновление конфигураций в микрос...

Лекция 224: Динамическое обновление конфигураций в микросервисах

Модуль 5. Spring
23 уровень , 3 лекция
Открыта

Сегодня мы ответим на этот вопрос и научимся применять динамическое обновление конфигураций в реальном времени. Готовьте клавиатуры!


Проблема статичных конфигураций в микросервисах

Представьте, что вы администратор крупного микросервисного зоопарка (да-да, наша любимая метафора). Например, десятки микросервисов зависят от одного и того же параметра, скажем, граничного лимита на выполнение операций. Этот лимит хранится в централизованной конфигурации, но что происходит, если его нужно обновить?

  1. Вы меняете значение в хранилище (например, в Git).
  2. Затем вы перезапускаете каждый микросервис, чтобы он подтянул новое значение.

Звучит как боль. Особенно если микросервисов десятки или сотни. Перезапуск — это не только неудобно, но и может вызвать простой системы. А если параметр меняется часто? Тогда это уже не просто боль, а настоящая катастрофа.

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


Spring Cloud Bus: основы

Spring Cloud Bus — это инструмент для передачи сообщений между микросервисами с использованием брокера сообщений, такого как RabbitMQ или Apache Kafka. Он позволяет:

  • Распространять изменения конфигураций между микросервисами.
  • Уведомлять компоненты системы об изменениях.
  • Реализовывать "событийно-ориентированные" подходы для управления настройками.

Пример рабочего сценария

  1. Администратор изменяет конфигурацию в Git (или другом хранилище).
  2. Spring Cloud Config Server фиксирует изменения и публикует событие об этом в брокер сообщений.
  3. Все подписанные микросервисы получают событие и автоматически обновляют свои конфигурации.

Подходы к динамическому обновлению конфигураций

Динамическое обновление конфигураций реализуется в Spring с помощью нескольких ключевых элементов:

  1. Spring Cloud Bus для доставки событий об изменении конфигурации.
  2. Аннотация @RefreshScope для обновления бинов, зависящих от конфигурации.
  3. Вызов REST-метода для обновления бинов — если вы хотите делать это вручную.

Поговорим о каждом из них.


Spring Cloud Bus в действии

Spring Cloud Bus используют брокеры сообщений (RabbitMQ, Kafka) для передачи событий. В нашем случае мы будем использовать RabbitMQ (так как он легко интегрируется и широко применяется).

Пошагово это выглядит так:

  1. Spring Cloud Config Server публикует событие изменения конфигурации.
  2. Spring Cloud Bus пересылает это событие подписчикам (вашим микросервисам).
  3. Подписчики получают событие и обновляют свои настройки в реальном времени.

Установка RabbitMQ — это отдельная задача, но если вы ещё не настроили его, можно быстро развернуть через Docker:

docker run -d --hostname rabbitmq --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management

Использование аннотации @RefreshScope

Аннотация @RefreshScope — ваш главный инструмент для обновления зависимостей. Если у вас есть бин, который берёт значения из конфигурации, добавление @RefreshScope к этому бину обеспечит его обновление при изменении этих значений.

Вот пример:


@RestController
@RefreshScope
public class ConfigController {

    @Value("${example.config.value}")
    private String exampleConfig;

    @GetMapping("/config")
    public String getConfigValue() {
        return this.exampleConfig;
    }
}

Если параметр example.config.value будет изменён, бин автоматически подтянет обновленное значение после события обновления конфигурации.

Обратите внимание, что @RefreshScope работает только с бинами, которые управляются Spring. Если бин создан вручную (например, через new), чудес не произойдёт.


Вызов REST-метода для обновления конфигураций

Чтобы микросервис понял, что конфигурация обновилась, нужно либо дождаться события Spring Cloud Bus, либо вручную вызвать метод /actuator/refresh. Этот метод нужно включить в настройках:

management.endpoints.web.exposure.include=refresh

Для тестирования можно использовать curl:

curl -X POST http://localhost:8080/actuator/refresh

После вызова /refresh все бины с аннотацией @RefreshScope обновятся, а вместе с ними подтянутся обновлённые параметры.


Практика: настройка Spring Cloud Bus

Давайте попробуем настроить это в боевых условиях. Мы создадим два микросервиса (Config Server и Service), которые будут интегрированы с Spring Cloud Bus через RabbitMQ.

Шаг 1: Настройка Spring Cloud Config Server

Создайте новый Spring Boot проект (например, через Spring Initializr) и добавьте зависимости:


<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
</dependencies>

Включите Config Server в коде:


@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

Настройте application.yml:


spring:
  cloud:
    config:
      server:
        git:
          uri: https://your-repo-url
  rabbitmq:
    host: localhost
    port: 5672

management:
  endpoints:
    web:
      exposure:
        include: "*"

Запустите сервер и проверьте, что он работает.


Шаг 2: Настройка микросервиса (client)

Создайте второй проект и добавьте зависимости:


<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
</dependencies>

Настройте bootstrap.yml для подключения к серверу:


spring:
  application:
    name: client-service
  cloud:
    config:
      uri: http://localhost:8888
  rabbitmq:
    host: localhost
    port: 5672

Добавьте контроллер с динамической конфигурацией:


@RestController
@RefreshScope
public class TestController {

    @Value("${example.config.value:default}")
    private String configValue;

    @GetMapping("/current-config")
    public String getConfigValue() {
        return configValue;
    }
}

Шаг 3: Проверка динамических обновлений

  1. Измените конфигурацию в Git.
  2. Выполните команду в Config Server:

curl -X POST http://localhost:8888/actuator/bus-refresh

Благодаря Spring Cloud Bus обновлённые значения появятся в микросервисах автоматически.


Теперь у вас есть рабочая система, которая обновляет конфигурации в реальном времени. Использование Spring Cloud Bus значительно упрощает управление настройками в распределённых системах, а также позволяет вам спать спокойно, зная, что перезапуск микросервисов — это прошлый век.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ