betacode

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

  1. Цель статьи
  2. Config Server - Why?
  3. Как Config Server сохраняет данные?
  4. Создать проект Spring Boot
  5. Конфигурация Config Server
  6. Запуск приложения

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

OK, это ваш первый шаг для построения распределенного приложения, используя Spring Cloud. В данной статье я покажу вам, как создать услугу, чтобы управлять конфигурациями для других услуг.
Содержания, которые будут обсуждать в данной статье включают:
  • Что такое Config Server? Почему нужен Config Server в распределенном приложении.
  • Объяснение Централизованного Управления Конфигурацией (Centralized Configuration management), и управление версиями конфигурации (Versioned Configuration Management).
  • Создать репозиторий (Repository), для хранения информацией конфигурации.
  • Построить (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