Как подключать и обновлять конфигурацию в сервисах с помощью Config Server
Что проверяют
Работали ли вы с Spring Cloud Config руками или знаете его по старым туториалам: способ подключения клиента заметно поменялся. Следом обычно спрашивают, как обновить настройку сразу на всех экземплярах и что без рестарта не обновится.
Как отвечать
Если спрашивают про ваш опыт, опирайтесь на свой проект: сколько сервисов, как выкатывали изменения. Технический каркас такой:
- сервер: отдельное приложение с
@EnableConfigServer, по умолчанию бэкенд Git, есть также файловая система, Vault и JDBC. Конфиги ищутся по схеме/{application}/{profile}/{label}, где label это ветка или тег; - клиент: стартер
spring-cloud-starter-configи вapplication.ymlсвойствоspring.config.importсо значениемoptional:configserver:http://config:8888. Префиксoptional:разрешает старт без сервера. Старыйbootstrap.ymlначиная со Spring Cloud 2020.0 выключен и требует отдельногоspring-cloud-starter-bootstrap; - обновление экземпляра:
POST /actuator/refresh, эндпоинт открывается вmanagement.endpoints.web.exposure.include. Бины с@RefreshScopeпересоздаются при следующем обращении,@ConfigurationPropertiesперепривязываются и без него; - обновление всех: Spring Cloud Bus поверх RabbitMQ или Kafka и
/actuator/busrefresh, аspring-cloud-config-monitorпринимает вебхук от Git; - секреты: не открытым текстом в репозитории, а значения
{cipher}с ключом шифрования на сервере или бэкенд Vault.
Добавьте, что не всё переживает refresh: порт, размер пула соединений и то, что прочитано один раз при старте, требуют перезапуска. В Kubernetes часто обходятся без Config Server: ConfigMap и плавный перезапуск подов.
Где спотыкаются
Ждут, что поле с @Value в обычном синглтоне обновится после refresh. Без @RefreshScope там остаётся значение, внедрённое при старте.
Вызывают /actuator/refresh на одном поде за балансировщиком и считают сервис обновлённым. Остальные экземпляры живут со старыми настройками до bus-события или рестарта.
Указывают только spring.cloud.config.uri. На Spring Boot 2.4 и новее без spring.config.import приложение падает на старте с требованием объявить импорт.