Узнайте, как создать сервер конфигурации с поддержкой Git, используя Spring Cloud Config Server и используя параметры конфигурации из приложения Spring Boot.

В отличие от традиционного монолитного приложения, в котором все выполняется в одном экземпляре, приложение на основе микросервисов состоит из нескольких экземпляров служб, работающих на нескольких серверах. Управление параметрами конфигурации для каждого из этих экземпляров службы может быть сложной задачей, поскольку поддержание нескольких копий параметров конфигурации на разных серверах, в разных местах и в разных средах подвержено ошибкам и затруднено в управлении. Это особенно верно для растущего числа сервисов в архитектуре микросервисов и сервисов, развернутых в облаке с функцией автоматического масштабирования, когда серверы приходят и уходят в облаке. В результате выросла потребность в улучшенном механизме управления параметрами конфигурации в приложениях на основе микросервисов. Это то место, где централизованный сервер конфигурации вступает в действие, чтобы перенести эти параметры конфигурации в централизованное место, которое извлекается из распределенных служб.
В этой статье мы узнаем, как создать централизованный сервер конфигурации с помощью сервера конфигурации Spring Cloud, который использует репозиторий Git в качестве хранилища конфигурации. Мы также рассмотрим, как использовать параметры удаленной конфигурации из сборки службы с помощью Spring Boot.
Сервер Spring Cloud Config
Сервер конфигурации Spring Cloud - один из наиболее популярных серверов централизованной конфигурации, используемых в приложении на основе микросервисов. Это особенно верно в связи с растущей тенденцией разработчиков Java создавать свои приложения с использованием Spring Boot; практически не прилагая усилий для интеграции своего приложения с сервером конфигурации Spring Cloud. Он использует типичный клиент-серверный подход для хранения и обслуживания параметров конфигурации в этих распределенных службах.
Предпосылки
Прежде чем приступить к написанию кода, нам нужно создать два проекта Spring Boot: серверный и клиентский. В этой статье мы будем использовать Apache Maven. Вы можете использовать веб-сайт Spring Initializr для создания этих проектов с зависимостью Spring Boot 2.x. В качестве альтернативы вы можете скачать образцы серверного и клиентского проекта с GitHub.
Создание сервера конфигурации с использованием хранилища локальной файловой системы
Для серверного проекта требуется модуль сервера конфигурации Spring Cloud, а также Spring Boot Starter Security и модуль Spring Boot Starter Web в качестве зависимостей.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency>
Если вы начинаете с пустого проекта Maven, не забудьте добавить эти зависимости в файл Maven, POM.xml для нашего сервера конфигурации. Если вы используете веб-сайт Spring Initializr, не забудьте добавить в свой проект зависимости Config Server и Spring Security.
Модуль Spring Boot Starter Web необходим для любого создания веб-приложений, включая приложения RESTful, использующие Spring MVC.
Модуль Spring Boot Starter Security позволяет нам удобно добавлять и настраивать область базовой аутентификации в наш серверный проект без написания кода. Все это благодаря автоконфигурации Spring Boot. В целях этой демонстрации мы настроим имя пользователя и пароль в файле application.yaml.
spring:
security:
user:
name: user
password: password
Как и в случае с любым другим приложением Spring Boot, нам нужен основной класс для запуска Spring ApplicationContext. Создайте класс ConfigServer с аннотацией @SpringBootApplication, при этом основной метод записи вызывает SpringApplication.run () Spring Boot для запуска сервера. Добавьте аннотацию @EnableConfigServer для автоматической настройки нашего сервера конфигурации.
@EnableConfigServer
@SpringBootApplication
public class Application {
public static final void main(final String[] args) {
SpringApplication.run(Application.class, args);
}
}
Наш сервер конфигурации по умолчанию работает на порту 8080, но мы можем переключить его на любой произвольный порт различными способами. Здесь мы используем самый простой способ: настроить свойство server.port в файле конфигурации нашего приложения, application.yaml, чтобы наш сервер работал на порту 8888 .
server: port: 8888
Spring Cloud Config Server поддерживает локальную файловую систему, репозиторий Git и HashiCorp Vault в качестве хранилища конфигурации. Сначала мы узнаем, как использовать хранилище конфигурации с поддержкой локальной файловой системы, чтобы быстро запустить наш сервер Config, а в более поздней части мы перейдем к использованию репозитория Git в качестве хранилища конфигурации. Теперь давайте настроим наш активный профиль как собственный с помощью свойства spring.profiles.active в application.yaml.
spring:
profiles:
active: native
При использовании собственного профиля Spring Cloud Config Server загружает файлы конфигурации из локального пути к классам (или из файловой системы, настроенной с помощью spring.cloud.config.server.native.searchLocations собственность). Местами поиска по умолчанию являются путь к классам: /, путь к классам: / config, файл: ./ и файл: ./ config.
Мы будем использовать [classpath: ./ config] в качестве нашего хранилища конфигурации. Создайте каталог config и файл config-client.yaml в нем в рамках ресурсов нашего серверного проекта. Любые произвольные настройки выставляйте в файле config-client.yaml.
logging:
level:
org.springframework.boot: DEBUG
Нажмите кнопку запуска и посмотрите, как запускается ваш сервер конфигурации. Из консоли вы заметите, что наш сервер конфигурации работает с собственным профилем на порту 8888.
The following profiles are active: native ... Tomcat started on port(s): 8888 Started ConfigServer
Единственный код, который нам нужно написать на нашем сервере Config, - это основной метод входа для запуска нашего приложения Spring. Остальная часть работы - настроить профиль нашего приложения и некоторые базовые параметры безопасности в application.yaml; Spring подготовит все остальное во время выполнения.
Получение конфигураций с помощью CURL
Теперь, когда наш сервер конфигурации запущен и работает, мы будем использовать CURL (инструмент командной строки) для получения конфигурации с сервера. Откройте свой терминал и запустите команду CURL, чтобы получить свойства конфигурации для config-client, используя профиль по умолчанию.
curl --user user:password http://localhost:8888/config-client/default
Нам необходимо предоставить настроенное имя пользователя и пароль user: password на нашем сервере конфигурации, чтобы запросить конфигурацию. Как ранее было настроено на нашем сервере конфигурации, модуль Spring Security выполнит базовую аутентификацию для имени пользователя и пароля, прежде чем модуль Spring Cloud Config Server обработает запрос конфигурации.
Запрос к URL-адресу http: // localhost: 8888 / config-client / default вернет ответ JSON с запрошенными свойствами конфигурации.
{
"name":"config-client",
"profiles":[
"default"
],
"label":null,
"version":null,
"state":null,
"propertySources":[
{
"name":"classpath:/config/config-client.yaml",
"source":{
"logging.level.org.springframework.boot":"DEBUG",
"greeting.message":"hi, this is a message served from local file system config server"
}
}
]
}
Модуль Spring Cloud Config Server найдет запрошенные конфигурации следующим образом в соответствии с параметрами пути запроса:
/{application}/{profile}[/{label}]
/{application}.yaml
/{application}-{profile}.yaml
/{label}/{application}-{profile}.yaml
/{application}.properties
/{application}-{profile}.properties
/{label}/{application}-{profile}.propertiesPlaceholder {application} will map to spring.application.name on the client-side properties.
Заполнитель {profile} будет отображаться на spring.profiles.active, список, разделенный запятыми, на клиентском компьютере. побочные свойства. Заполнитель {label} будет отображаться на git label на стороне сервера и по умолчанию используется в качестве master {label}. - необязательный параметр.
Хранилище конфигурации, поддерживаемое локальным путем к классам или файловой системой, которую мы в настоящее время используем, возможно только в среде разработки, где у нас есть единственный экземпляр Config Server. Кроме того, любые изменения в наших настройках конфигурации не проверяются в локальной файловой системе.
Настройка хранилища с поддержкой Git
Spring Cloud Config Server поддерживает использование репозитория Git в качестве хранилища конфигурации. Очень удобно управлять обновлениями и контролировать изменения параметров конфигурации с помощью хранилища конфигурации на основе Git (по сравнению с локальной файловой системой). Spring Cloud Config Server использует хранилище конфигурации с поддержкой Git в качестве реализации по умолчанию, поэтому, чтобы настроить наш сервер конфигурации для использования хранилища конфигурации с поддержкой Git, мы можем либо оставить native в активном профиле или замените его на Git.
spring:
profiles:
active: git
Следующее, что нужно сделать, - настроить расположение нашего репозитория Git с помощью свойства spring.cloud.config.server.git.URI в application.yaml.
spring:
cloud:
config:
server:
git:
uri: https://github.com/getstarted-spring/config-store.git
cloneOnStart: true
Здесь мы настроим наш сервер конфигурации для использования нашего образца репозитория Git через хранилище конфигурации на GitHub. Config-store состоит из двух файлов конфигурации YAML - config-client.yaml и config-client-development.yaml -, которые будут использоваться в последней части нашей статьи. . На данный момент давайте проигнорируем содержимое обоих файлов. Обратите внимание, что в нашем файле application.yaml мы также указали нашему серверу Config клонировать из репозитория Git каждый раз, когда он запускается со свойством spring.cloud.config.server.cloneOnStart.
Чтобы выделить различия в нашем сервере конфигурации при работе с собственным профилем (по сравнению с профилем Git), мы настроим наш уровень ведения журнала для Spring Cloud Config Server на уровень DEBUG. Обратите внимание, что это не связано с включением хранилища конфигурации с поддержкой Git.
logging:
level:
org.springframework.cloud.config.server: DEBUG
Когда все готово, нажмите кнопку запуска и посмотрите, как наш сервер конфигурации работает с хранилищем конфигурации на основе Git.
The following profiles are active: git ... No credentials provider required for URI https://github.com/getstarted-spring/configstore.git
Из консоли вы заметите, что на нашем сервере конфигурации теперь работает профиль Git. Также будет дополнительный журнал, в котором говорится, что для нашего настроенного местоположения Git не требуется поставщик учетных данных. В реальной среде мы всегда будем настраивать учетные данные для нашего репозитория Git в целях безопасности, но, чтобы упростить эту статью, мы оставим это как есть. Теперь у нас есть сервер конфигурации, работающий с хранилищем конфигурации на основе Git, без особых усилий.
Использование конфигураций из приложения Spring Boot
Теперь, когда наш сервер конфигурации запущен и работает, мы создадим веб-приложение Spring Boot для использования конфигурации с нашего сервера конфигурации. Чтобы максимально упростить наше веб-приложение Config Client, мы будем использовать только модуль Spring Boot Starter Web и модуль Spring Cloud Starter Config в качестве его зависимостей, игнорируя меры безопасности. механизм нашего веб-приложения.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
Опять же, если вы начинаете с пустого проекта Maven, не забудьте добавить эти две зависимости в файл Maven, POM.xml. Если вы используете веб-сайт Spring Initializr для создания своего проекта, не забудьте добавить в проект зависимости Config Client и Web.
Добавление модуля Spring Boot Starter Web заставит наш клиент конфигурации работать как веб-приложение с использованием Spring MVC. Модуль Spring Cloud Starter Config позволяет нам использовать Spring Cloud Config Server в качестве приложения Spring Boot. Без написания кода для получения конфигурации с нашего сервера конфигурации Spring подготовит все во время выполнения. Когда наше веб-приложение запускается, оно получает свою конфигурацию с настроенного сервера конфигурации через свойства конфигурации начальной загрузки и инициализирует Spring Environment с удаленными источниками свойств.
Чтобы все это произошло, нам нужно настроить URI и настроить имя пользователя и пароль для доступа к нашему серверу конфигурации с помощью spring.cloud.config.uri, spring.cloud.config.username и spring.cloud.config.password в нашем файле конфигурации Bootstrap, bootstrap.yaml.
spring:
cloud:
config:
uri: http://localhost:8888
username: user
password: password
Следующим важным параметром в нашем клиентском приложении является имя приложения через свойство spring.application.name. Это обязательный параметр для запроса свойств конфигурации с сервера Config.
spring:
application:
name: config-client
Хотя нет необходимости устанавливать активный профиль в нашем конфигурационном клиенте (поскольку Spring использует профиль по умолчанию для запроса конфигурации), мы хотели, чтобы наш конфигурационный клиент запрашивал конфигурацию разработки, чтобы показать, как Spring Cloud Config Server может находить и обслуживать свойства конфигурации при наличии активного профиля.
spring:
profiles:
active: development
Как обычно, нам нужен основной класс для запуска ApplicationContext Spring. Создайте класс ConfigClient с аннотацией @SpringBootApplication, основным методом записи, вызывающим SpringApplication.run () Spring Boot для запуска сервера.
@SpringBootApplication
public class ConfigClient {
public static final void main(final String[] args) {
SpringApplication.run(ConfigClient.class, args);
}
}
Затем мы создадим RestController в нашем клиенте Config, чтобы продемонстрировать, что свойства удаленной конфигурации, обслуживаемые нашим сервером Config, являются полученными свойствами и инициализируются в среде Spring в приложении.
Создайте класс ConfigRestController с аннотацией @RestController.
@RestController
public class ConfigRestController {
}
Добавляет частную строковую переменную HelloMessage с аннотацией @Value, чтобы связать ее со значением свойства Hello.message в свойствах среды Spring.
@Value("${greeting.message}")
private String greetingMessage;
Наконец, добавьте метод getGreetingMessage () с аннотацией @GetMapping, которая сообщает Spring предоставить этот метод как HTTP-запрос GET с путем запроса «/». . Метод getGreetingMessage () вернет значение связи из переменной welcomeMessage.
@GetMapping(path = "/")
public String getGreetingMessage() {
return greetingMessage;
}
На этом все для нашего Config Client. Нажмите кнопку запуска и посмотрите, как запускается ваше приложение Config Client. Вы заметите из консоли, что активный профиль Config Client разработан и работает на порту 8080.
The following profiles are active: development ... Tomcat started on port(s): 8080 Started ConfigClient
В журнале будут дополнительные записи о том, что он получает конфигурацию с сервера и расположенной среды с именем config-client и профилем разработки. Это дополнительные записи журнала, которые создаются Spring Cloud Config и показывают, что то, что мы создали, работает соответствующим образом. Наш клиент конфигурации получает свойства конфигурации с нашего запущенного сервера конфигурации.
Fetching config from server at : http://localhost:8888 Located environment: name=config-client, profiles=[development]
Кроме того, вы также заметите, что консоль заполнена записями журнала уровня DEBUG из Spring Boot. Это связано с тем, что наш клиент конфигурации был инициализирован с помощью свойства конфигурации выбранного уровня ведения журнала, настроенного в удаленной конфигурации config-client.yaml.
logging:
level:
org.springframework.boot: DEBUG
Теперь откройте свой любимый терминал и запустите команду CURL, чтобы отправить HTTP-запрос Get нашему клиенту конфигурации, чтобы получить приветственное сообщение.
curl http://localhost:8080
Вы получите приветственное сообщение о том, что это сообщение разработки и отправлено из репозитория Git.
hi, this is a development message served from git repository on github
Это сообщение настраивается в свойстве Hello.message в нашем файле удаленной конфигурации, config-client-development.yaml, и извлекается и связывается с переменной приветствияMessage. Помните, что Spring Cloud Config Server использует шаблон /{application}-{profile}.yaml для поиска и обслуживания свойств конфигурации в соответствии с параметрами запроса, предоставленными клиентом.
greeting: message: hi, this is a development message served from git repository on github
Резюме
В этой статье было рассмотрено, как создать централизованный сервер конфигурации с помощью Spring Cloud Config Server, который использует локальную файловую систему или репозиторий Git в качестве конфигурации. место хранения. Мы также узнали, как создать простое веб-приложение Spring Boot, которое использует параметры размещенной конфигурации, с помощью Spring Cloud Config Starter.
Весь исходный код в этой статье можно скачать с GitHub Config-Server, Config-Store и Config-Client.