Понимание Spring Cloud Config Server с примером

1- Цель статьи

OK, это ваш первый шаг для построения распределенного приложения, используя  Spring Cloud. В данной статье я покажу вам, как создать услугу, чтобы управлять конфигурациями для других услуг.
Содержания, которые будут обсуждать в данной статье включают:
  1. Что такое Config Server? Почему нужен Config Server в распределенном приложении.
  2. Объяснение Централизованного Управления Конфигурацией (Centralized Configuration management), и управление версиями конфигурации (Versioned Configuration Management).
  3. Создать репозиторий (Repository), для хранения информацией конфигурации.
  4. Построить (Build) и запустить (Run) Spring Cloud Config Server.

2- Config Server - Why?

OK, теперь мы обсудим почему в распределенном приложении (Distributed Application) вам нужно иметь услугу управления конфигурациями для других услуг в приложении.
Ниже является изображение распределенного приложения - "Управление Такси", которое имеет 3 подуслуги (подприложения), каждая услуга развернута на одном сервере.
Каждая услуга (приложение) это проект, который был разработан командой программистов. В одном проекте, помимо кода (code) он так же содержит конфигурации, например информация подключения в базу данных, информация позиции других ресурсов данных,... Будет плохой идеей если вы жестко кодируете (hard code) данную информацию в коде проекта. Поэтому данная информация обычно расположена в отдельных файлах, они называются конфигурационными файлами (Configuration file).
После завершения проект будет упакован (pack) и развернут на сервере. Обычно конфигурационные файлы будут упакованы вместе с кодом и формируют один единственный продукт (файл). Таким образом, если есть какие - либо изменения в конфигурации, вам нужно компилировать (compile), и переупаковать (pack) проект и переразвернуть на сервере. Это явно является сложной задачей в среде распределенного приложения.

Config Server?

Идея разрешения проблемы выше это нужно иметь услугу (Приложение) управляющая конфигурациями для других услуг, она работает независимо на сервере.
Идея выше приносит следующие выгоды:
  • TODO
  • Spring Cloud Bus:
Когда вы меняете конфигурационный файл на  Config-Server, конечно вы хотите оповестить об изменениях  Client-ов. Spring Cloud Bus предоставляет механизм для оповещения  Client что "Есть изменение" и требует Client-ов обновить новую информацию.

3- Как Config Server сохраняет данные?

Когда вы ставите все конфигурационные файлы на Config Server, вы зададите вопрос как Config Server сохраняет те данные?
Есть 2 способа для того, чтобы  Config Server сохранил конфигурационные файлы:
  1. Сохранить на жестком диске сервера как системные файлы (Files system).
  2. Использовать GIT или SVN (Subversion).
В данной статье я создам  Config Server, хранящий конфигурационные файлы на  GitHub. Я создал  GitHub Repository (Репозиторий):

4- Создать проект Spring Boot

На  Eclipse создать проект  Spring Boot:
Ввести:
  • Name: SpringCloudConfigServer
  • Group: org.o7planning
  • Artifact: SpringCloudConfigServer
  • Description: Spring Cloud Config Server
  • Package: org.o7planning.scconfigserver
Spring Boot пробной версии 2.0.0.M..xx имеет баги с  Spring Cloud, поэтому мы используем  Spring Boot 1.5.9.
OK, проект создан:
pom.xml
<?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>org.o7planning</groupId>
    <artifactId>SpringCloudConfigServer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>SpringCloudConfigServer</name>
    <description>Spring Cloud Config Server</description>

    <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>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Edgware.RELEASE</spring-cloud.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>${spring-cloud.version}</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>

@EnableConfigServer

SpringCloudConfigServerApplication.java
package org.o7planning.scconfigserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@EnableConfigServer  // ==> Important!!
@SpringBootApplication
public class SpringCloudConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudConfigServerApplication.class, args);
    }
    
}

5- Конфигурация Config Server

Данная услуга (приложение) будет развернута и запущена на порту  8888 и сохранит конфигурационные файлы на GitHub, поэтому вам понадобятся некоторые конфигурации в файле  application.properties.
application.properties
server.port=8888

spring.cloud.config.server.git.uri=https://github.com/o7planning/spring-cloud-config-git-repo-example.git

# For File System:
# spring.profiles.active=native
# spring.cloud.config.server.native.searchLocations=C:/Users/tran/Desktop/config
 
Если  Git Server (Или  SVN Server) потребует  username/password вам нужно дополнительно конфигурировать, вы можете просмотреть далее в аппендиксе данной статьи.

6- Запуск приложения

Нажать на правую кнопку мыши на проект, выбрать:
  • Run As/Spring Boot App

Test:

Следующая статья: