openplanning

Tìm hiểu về Spring Cloud Config Server với ví dụ

  1. Mục tiêu của bài học
  2. Config Server - Tại sao?
  3. Config Server lưu trữ dữ liệu thế nào?
  4. Tạo dự án Spring Boot
  5. Cấu hình Config Server
  6. Chạy ứng dụng

1. Mục tiêu của bài học

OK, đây là bước đầu tiên của bạn để xây dựng một ứng dụng phân tán sử dụng Spring Cloud. Trong bài học này tôi sẽ hướng dẫn bạn tạo một dịch vụ quản lý các cấu hình cho các dịch vụ khác.
Các nội dung sẽ được thảo luận trong bài học này bao gồm:
  • Config Server là gì? Tại sao cần một Config Server trong ứng dụng phân tán.
  • Giải thích về Quản lý cấu hình tập trung (Centralized Configuration management), và quản lý cấu hình theo phiên bản (Versioned Configuration Management).
  • Thành lập một kho chứa (Repository), để lưu trữ các thông tin cấu hình.
  • Xây dựng (Build) và chạy (Run) Spring Cloud Config Server.

2. Config Server - Tại sao?

OK, Bây giờ chúng ta sẽ thảo luận tại sao trong một ứng dụng phân tán (Distributed Application) bạn cần phải có một dịch vụ quản lý các cấu hình cho các dịch vụ khác trong ứng dụng.
Dưới đây là một hình ảnh minh họa một ứng dụng phân tán - "Quản lý Taxi", nó gồm 3 dịch vụ con (ứng dụng con), mỗi dịch vụ được triển khai trên một máy chủ.
Mỗi một dịch vụ (ứng dụng) là một Project được phát triển bởi một nhóm lập trình. Trong một project, ngoài mã (code) nó còn chứa các cấu hình, chẳng hạn như các thông tin kết nối vào cơ sở dữ liệu, thông tin vị trí các nguồn dữ liệu khác,... Sẽ là một ý tưởng tồi nếu bạn code cứng (hard code) các thông tin này trong mã của project. Vì vậy các thông tin này thường được đặt trong các tập tin riêng biệt, chúng được gọi là các tập tin cấu hình (Configuration file).
Sau khi hoàn thành Project sẽ được đóng gói (pack) và triển khai lên Server. Thông thường các tập tin cấu hình sẽ được đóng gói cùng với code và tạo thành một sản phẩm (tập tin) duy nhất. Như vậy, nếu có thay đổi gì trong cấu hình bạn cần phải biên dịch (compile), và đóng gói (pack) lại project và triển khai lại lên Server. Đây rõ ràng là một thách thức trong một môi trường ứng dụng phân tán.
Config Server?
Ý tưởng để giải quyết vấn đề ở trên là cần có một dịch vụ (Ứng dụng) quản lý các cấu hình cho các dịch vụ khác, nó chạy độc lập trên một máy chủ.
Ý tưởng trên mang lại các lợi ích sau:
  • TODO
  • Spring Cloud Bus:
Khi bạn thay đổi một tập tin cấu hình trên Config-Server, tất nhiên bạn sẽ muốn thông báo các thay đổi đó đến các Client. Spring Cloud Bus cung cấp một cơ chế để thông báo cho các Client rằng "Có thay đổi" và yêu cầu các Client cập nhập thông tin mới.

3. Config Server lưu trữ dữ liệu thế nào?

Khi bạn đặt tất cả các tập tin cấu hình trên Config Server, bạn sẽ đặt câu hỏi Config Server lưu trữ các tập tin đó như thế nào?
Có 2 cách chính để Config Server lưu trữ các tập tin cấu hình:
  1. Lưu trữ trên ổ cứng của máy chủ như các tập tin hệ thống (Files system).
  2. Sử dụng GIT hoặc SVN (Subversion).
Trong bài học này tôi sẽ tạo một Config Server, lưu trữ các tập tin cấu hình trên GitHub. Tôi đã tạo sẵn một GitHub Repository (Kho chứa):

4. Tạo dự án Spring Boot

Trên Eclipse tạo một dự án Spring Boot:
Nhập vào:
  • Name: SpringCloudConfigServer
  • Group: org.o7planning
  • Artifact: SpringCloudConfigServer
  • Description: Spring Cloud Config Server
  • Package: org.o7planning.scconfigserver
Spring Boot phiên bản thử nghiệm 2.0.0.M..xx đang lỗi với Spring Cloud vì vậy chúng ta sẽ sử dụng Spring Boot 1.5.9.
OK, Project đã được tạo ra:
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. Cấu hình Config Server

Dịch vụ (ứng dụng) này sẽ được triển khai và chạy trên cổng 8888 và lưu trữ các tập tin cấu hình trên GitHub, vì vậy bạn cần một vài cấu hình trong tập tin 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
Nếu Git Server (Hoặc SVN Server) đòi hỏi username/password bạn cần phải cấu hình thêm, bạn có thể tham khảo thêm trong phần phụ lục phía cuối bài viết này.

6. Chạy ứng dụng

Nhấn phải chuột vào Project chọn:
  • Run As/Spring Boot App