1. 程式人生 > >Spring cloud Config客戶端和服務端快速入門環境搭建

Spring cloud Config客戶端和服務端快速入門環境搭建

一.構建配置中心

通過Spring Cloud Config構建一個配置中心非常簡單,可以分為三步:

  • 建立一個基礎的spring boot專案, 命名為config-server,並在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>com.config</groupId>
    <artifactId>server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>server</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.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>Greenwich.M1</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>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>


</project>

  • 建立spring boot的程式主類,並新增你@EnableConfigServer註解,開啟Spring Cloud Config的服務端功能:
package com.config.server;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@EnableConfigServer
@SpringBootApplication
public class ServerApplication {

    public static void main(String[] args) {

        SpringApplication.run(ServerApplication.class, args);
    }
}
  • 在application.properties中新增配置服務的基本資訊以及Git倉庫的相關資訊,我是使用GitHub做的測試:
spring.applica七ion.name=config-server 
server.port=7001
[email protected]:xxxx/config-center.git
spring.cloud.config.server.git.searchPaths=spring-cloud-config
[email protected]
spring.cloud.config.server.git.password=6xxxx8

其中Git的配置資訊分別表示如下:

  • 其中spring.cloud.config.server.git.uri:配置Git倉庫的位置。
  • spring.cloud.config.server.git.searchPaths:配置倉庫路徑下的相對搜尋位置,可以配置多個。
  • spring.cloud.config.server.git.username:訪問Git倉庫的使用者名稱。
  • spring.cloud.config.server.g江.password:訪問Git倉庫的使用者密碼。 到這一步我們通過Spring Cloud Config實現,並使用Git管理配置內容的分散式配置中心就完成了;然後我們啟動伺服器看有沒有報錯,沒有說明以上的配置就是OK的,執行結果如下: 在這裡插入圖片描述

二、配置規則詳解

為了驗證上面完成的分散式配置中心config-server,根據Git配置資訊中指定的倉庫位置,在[email protected]:xxxx/config-center.git下建立一個spring-cloud-config目錄作為配置倉庫,並根據不同的環境新建4個配置檔案:

  • server.properties

  • server-dev.properties

  • server-test.properties

  • server-prod.properties 在上面的4個檔案中均設定了一個from屬性,並未每個配置檔案分別設定了不同的值,如下所示:

  • from=git-default-1.0

  • from=git-test-1.0

  • from=git-dev-1.0

  • from=git-prod-1.0

將上面的4個配置檔案提交到GitHub上: 在這裡插入圖片描述 為了測試版本控制,在該Git倉庫的master分支中,我們為from屬性加入1.0的字尾,同時建立了一個dev分支,並將配置檔案中的值用2.0做字尾。

完成了上面這些工作之後我們可以在瀏覽器中訪問我們的配置了,訪問配置資訊的URL與配置檔案的對映關係如下所示:

  • /{application}/{profile}[/{label}]
  • {/application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties 上面的url會對映到{application}-{profile}.properties對應的配置檔案,其中{label}對應Git上不同的分支,預設是master分支;如下我們通過http://localhost:7001/server/test/master訪問的結果:
{
    "name": "server",
    "profiles": [
        "test"
    ],
    "label": "master",
    "version": "2f64482a317ebe84e0ab47196d05c80623438b8c",
    "state": null,
    "propertySources": [
        {
            "name": "[email protected]:yaomy2072608191/config-center.git/spring-cloud-config/server-test.properties",
            "source": {
                "from": "git-test-1.0"
            }
        },
        {
            "name": "[email protected]:yaomy2072608191/config-center.git/spring-cloud-config/server.properties",
            "source": {
                "from": "git-default-1.0"
            }
        }
    ]
}

我們將{label}更換為dev分支訪問結果是:

{
    "name": "server",
    "profiles": [
        "test"
    ],
    "label": "dev",
    "version": "18e4edba793210ff965050ce447061b4e3e5977a",
    "state": null,
    "propertySources": [
        {
            "name": "[email protected]:yaomy2072608191/config-center.git/spring-cloud-config/server-test.properties",
            "source": {
                "from": "git-test-2.0"
            }
        },
        {
            "name": "[email protected]:yaomy2072608191/config-center.git/spring-cloud-config/server.properties",
            "source": {
                "from": "git-default-2.0"
            }
        }
    ]
}

我們可以看到JSON中返回了應用名server,環境名test,分支名dev/master;以及default和dev環境的配置內容。另外還有一個version版本號,它對應的是在Git上的commit號。

同時,我們可以看到config-server的控制檯中還輸出了下面的內容,配置伺服器從Git中獲取配置資訊後,會儲存一份在config-server的檔案系統中,實質上config-server是通過git clone命令將配置內容複製了一份在本地儲存,然後讀取這些內容並返回給微服務應用進行載入。

2018-11-03 11:38:53.043  INFO 3695 --- [nio-7001-exec-8] o.s.c.c.s.e.NativeEnvironmentRepository  : Adding property source: file:/var/folders/zx/tkgn67q979j6wxk0lqd9t2fm0000gn/T/config-repo-4776505257090435200/spring-cloud-config/server-test.properties
2018-11-03 11:38:53.043  INFO 3695 --- [nio-7001-exec-8] o.s.c.c.s.e.NativeEnvironmentRepository  : Adding property source: file:/var/folders/zx/tkgn67q979j6wxk0lqd9t2fm0000gn/T/config-repo-4776505257090435200/spring-cloud-config/server.properties

config-server通過Git在本地倉庫暫存,可以有效防止當Git倉庫出現故障而引起無法載入配置資訊的情況。

三、客戶端應用程式配置對映

上面我們完成了配置中心得配置,並且可以正常的執行,下面我們嘗試如何在微服務應用中獲取上述配置資訊。

  • 建立一個spring boot應用,命名為config-client,並在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>com.config</groupId>
    <artifactId>client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>client</name>
    <description>Spring config client</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.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>Greenwich.M1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</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>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>


</project>

  • 建立一個spring boot主類,如下:
package com.config.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class ClientApplication {

    public static void main(String[] args) {

        SpringApplication.run(ClientApplication.class, args);
    }
}

  • 建立bootstrap.properties配置,來指定獲取配置檔案的config-server位置,如下配置:
spring.application.name=server 
spring.cloud.config.profile=prod
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:7001/
server.port=7002

上述配置引數與Git中儲存的配置檔案中的各個部分的對應關係如下:

  • spring.cloud.config.profile:對應配置檔案規則中的{profile}部分。
  • spring.cloud.config.label:對應配置檔案中的{label}部分。
  • spring.cloud.config.uri:對應config-server配置中心的地址。 這裡需特別注意上面在和諧屬性必須配置在bootstrap.properties中,這樣config-server中的配置資訊才能被正確載入。

這裡說明一下spring boot對配置檔案的載入順序,對於本應用jar包之外的配置檔案載入會優先於應用jar包內的配置內容,而通過bootstrap.properties對於config-server的配置,使得該應用會從config-server中獲取一些外部配置資訊,這些資訊的優先順序比本地的內容要高,從而實現了外部化配置。

建立一個RestFul介面,獲取配置中心得配置資訊:

package com.config.client;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RefreshScope
@RestController
public class TestController {

    @Value("${from}")
    private String from;

    @RequestMapping("/from")
    public String from(){
        System.out.println("-----///////");
        return this.from;
    }
}

啟動config-client,通過http://localhost:7002/from來訪問可以獲取不同環境的內容。