1. Обзор
В этом руководстве мы рассмотрим основы Spring Cloud Config Server . Мы настроим сервер конфигурации, а затем создадим клиентское приложение, которое использует конфигурацию при запуске, а затем обновит конфигурацию без перезапуска. Приложение, которое мы создаем, является тем же приложением «Hello World», которое обсуждается в Руководстве по началу работы с централизованной конфигурацией , но мы более подробно рассмотрим концепции Spring Cloud Config Server в этой статье.
Полный исходный код учебника находится на Github .
2. Что такое сервер Spring Cloud Config?
Как кратко говорится в документации , «Spring Cloud Config обеспечивает поддержку на стороне сервера и на стороне для внешней конфигурации в распределенной системе». В стандартной реализации серверного хранилища данных используется git , поэтому он с легкостью поддерживает маркированные версии конфигурационных сред и доступен для многих инструментов управления контентом.
Spring Cloud Config очень хорошо вписывается в приложения Spring, потому что его концепции клиента и сервера точно соответствуют абстракциям Spring Environment и PropertySource . Однако Spring Cloud Config можно использовать с любым приложением, работающим на любом языке.
3. Создать многомодульный проект
Приложение, которое мы создаем, будет иметь два модуля: один для службы конфигурации, а другой для клиента конфигурации. Из-за этого нам нужно создать родительский пом .
3.1 Родитель
В нашей IDE давайте создадим новый проект. Я использую Spring Tool Suite, но это всего лишь личное предпочтение.
В нашем pom.xml давайте определим два наших модуля:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.michaelcgood</groupId> <artifactId>com.michaelcgood</artifactId> <version>0.0.1</version> <packaging>pom</packaging> <name>michaelcgood-spring-cloud-config-server</name> <description>Intro to Spring Cloud Config Server</description> <modules> <module>mcg-configuration-client</module> <module>mcg-configuration-service</module> </modules></project> |
3.2 Сервис конфигурации
В нашей IDE давайте создадим новый модуль Maven для нашей службы конфигурации и вставим его в наш pom :
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
<?xml version="1.0"?><project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <groupId>com.michaelcgood</groupId> <artifactId>mcg-configuration-service</artifactId> <version>0.0.1</version> <packaging>jar</packaging> <name>mcg-configuration-service</name> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project> |
3.3 Конфигурация клиента
Теперь нам просто нужно сделать модуль для нашего клиента конфигурации. Итак, давайте сделаем еще один модуль Maven и вставим его в наш pom :
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
<?xml version="1.0"?><project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <groupId>com.michaelcgood</groupId> <artifactId>mcg-configuration-client</artifactId> <version>0.0.1</version> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project> |
Структура нашего проекта выглядит следующим образом:

4. Конфиг Сервер
Теперь мы создадим Config Servic e, который будет выступать в качестве посредника между нашим клиентом и git-хранилищем .
4.1 Включить Config Server
Мы используем @EnableConfigServer Spring Cloud для создания сервера конфигурации, с которым можно связаться. Итак, это обычное приложение Spring Boot с одной аннотацией, добавленной для включения сервера конфигурации :
|
1
2
3
4
5
6
7
8
|
@EnableConfigServer@SpringBootApplicationpublic class ConfigServiceApplication { public static void main(String[] args) { SpringApplication.run(ConfigServiceApplication.class, args); }} |
4.2 application.properties
Чтобы гарантировать отсутствие конфликта между портами для нашей службы настройки и клиента, мы указываем другой порт для службы настройки:
|
1
2
3
|
server.port=8888spring.cloud.config.server.git.uri=${HOME}/Desktop/mcg-config |
Вторая строка spring.cloud.config.server.git.uri = $ {HOME} / Desktop / mcg-config указывает на репозиторий git, который мы создадим следующим.
4.3 Git
В системе * nix мы можем делать все из командной строки.
Мы делаем папку на нашем рабочем столе:
|
1
|
mkdir mcg-config |
Мы создаем файл с именем a-bootiful-client.properties, используя vim :
|
1
|
vim a-bootiful-client.properties |
Мы добавляем сообщение «Hello World», но это может быть что угодно. После того, как мы напишем (: w), мы покинем (: q) vim.
Теперь давайте создадим новый репо:
|
1
|
git init |
Теперь мы добавляем файл, который содержит наше сообщение:
|
1
|
git add a-bootiful-client.properties |
Давайте совершим:
|
1
|
git commit |
5. Клиент конфигурации
Теперь давайте создадим новое приложение Spring Boot, которое использует сервер конфигурации для загрузки своей собственной конфигурации и обновляет свою конфигурацию, чтобы отразить изменения в сервере конфигурации по требованию, без перезапуска JVM.
Spring увидит файлы свойств конфигурации так же, как и любой файл свойств, загруженный из application.properties , application.yml или любого другого PropertySource .
5.1 Отражение изменений
Клиент может получить доступ к любому значению на сервере конфигурации, используя стандартные способы Spring, такие как @ConfigurationProperties или @Value («$ {…}») .
Имея это в виду, мы создаем REST-контроллер, который возвращает значение разрешенного свойства сообщения:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
@SpringBootApplicationpublic class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class, args); }}@RefreshScope@RestControllerclass MessageRestController { @Value("${message:Hello default}") private String message; @RequestMapping("/message") String getMessage() { return this.message; }} |
Конфигурация по умолчанию позволяет считывать значения только при запуске клиента, а не снова. Таким образом, используя @RefreshScope, мы заставляем bean-компонент обновить свою конфигурацию, что означает, что он будет извлекать обновленные значения с сервера Config, а затем инициирует событие обновления.
5.2 bootstrap.properties
Свойства для настройки клиента конфигурации должны быть прочитаны до того, как остальная часть конфигурации приложения будет считана с сервера конфигурации, во время фазы начальной загрузки.
Мы указываем клиенту spring.application.name и расположение сервера конфигурации spring.cloud.config.uri :
|
1
2
3
|
spring.application.name=a-bootiful-clientspring.cloud.config.uri=http://localhost:8888management.security.enabled=false |
Примечание:
Мы отключили безопасность с помощью нашего параметра management.security.enabled = false, чтобы упростить нам тестирование и настройку.
6. Демо
Сначала нам нужно изменить каталог на наш сервис конфигурации и запустить его:
|
1
|
mcg-configuration-service mike$ mvn spring-boot:run |
А затем сделайте то же самое для нашего клиента:
|
1
|
mcg-configuration-client mike$ mvn spring-boot:run |
Мы можем видеть в нашем терминале сервис конфигурации, когда добавлен a-bootiful-client.properties :
|
1
|
INFO 5921 --- [nio-8888-exec-1] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/var/folders/dk/48l9cm2x3vnfl5ymh6dtxpwc0000gn/T/config-repo-7195892194658362240/a-bootiful-client.properties |
Давайте откроем наш браузер и зайдем на http: // localhost: 8080 / message . Мы видим «Hello World».
Теперь давайте снова изменим сообщение в a-bootiful-client.properties и на этот раз добавим: «Привет! :-)».
После сохранения и выполнения фиксации мы заходим на http: // localhost: 8888 / a-bootiful-client / default, чтобы подтвердить наши изменения.
Теперь мы вызываем конечную точку ссылки Spring Boot Actuator для обновления нашего клиента:
|
1
|
curl -X POST http://localhost:8080/refresh |
Мы заходим на http: // localhost: 8080 / message и видим наше сообщение «Привет! ? ».
Для получения дополнительной информации о приводе Spring Boot см. Учебное пособие Создание службы Spring Boot RESTful + привод Spring Boot .
7. Заключение
Мы только что завершили централизацию конфигурации наших сервисов весной. Мы достигли этого, установив сервер Spring Cloud Config и создав клиент для использования конфигурации при запуске, а затем обновив ее без перезапуска.
С помощью Cloud Cloud Config Server можно сделать много других вещей, которые мы не затронули, например:
- Зарегистрируйте сервер Config в службе обнаружения для Spring Cloud Netflix, Eureka Service Discovery или Spring Cloud Consul
- Настройка конфигурации в формате YAML или Свойства
- Служите простыми текстовыми файлами конфигурации
- Вставить сервер конфигурации в приложение
Полный исходный код можно найти на Github .
| Опубликовано на Java Code Geeks с разрешения Майкла Гуда, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Введение в Spring Cloud Config Server
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |