Статьи

Введение в Spring Cloud Config Server

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"?>
    <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"?>
  <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"?>
  <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, являются их собственными.