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 @SpringBootApplication public class ConfigServiceApplication { public static void main(String[] args) { SpringApplication.run(ConfigServiceApplication. class , args); } } |
4.2 application.properties
Чтобы гарантировать отсутствие конфликта между портами для нашей службы настройки и клиента, мы указываем другой порт для службы настройки:
1
2
3
|
server.port= 8888 spring.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
|
@SpringBootApplication public class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication. class , args); } } @RefreshScope @RestController class 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-client spring.cloud.config.uri=http: //localhost:8888 management.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, являются их собственными. |