1. 程式人生 > >springcloud系列—Config—第6章-1: Spring Cloud Config 配置中心

springcloud系列—Config—第6章-1: Spring Cloud Config 配置中心

資料參考:《Spring Cloud 微服務實戰》

目錄

分散式配置中心

快速入門

構建配置中心

配置規則詳解

客戶端配置對映


分散式配置中心

spring cloud configspring cloud團隊建立的一個全新專案,用來為分散式系統中的基礎設施和微服務應用提供集中化的外部配置支援,它分為服務端和客戶端兩部分,其中服務端也稱為分散式配置中心,它是一個獨立的微服務應用,用來連線配置倉庫併為客戶端提供獲取配置資訊,加密/解密資訊等訪問介面,而客戶端則是微服務架構中的各個微服務應用或基礎設施,它們通過指定的配置中心管理應用資源與業務相關的配置內容,並在啟動的時候從配置中心獲取和載入配置資訊。spring cloud config

實現了對服務端和客戶端中環境變數和屬性設定的抽象對映,所以它除了適用於spring構建的應用程式之外,也可以在任何其他語言執行的應用程式中使用。由於spring cloud config實現的配置中心預設採用git來儲存配置資訊,所以使用spring cloud config構建的配置伺服器,天然就支援對微服務應用配置資訊的版本管理,並且可以通過git客戶端工具來方便地管理和訪問配置內容。當然它也提供了對其他儲存方式的支援,比如說svn倉庫,本地化檔案系統。

快速入門

構建一個基於git儲存的分散式配置中心,並在客戶端中演示如何通過配置指定微服務應用的所屬配置中心,並讓其能夠從配置中心獲取配置資訊並繫結到程式碼的整個過程。

構建配置中心

  • 建立一個名為config-server-git的springboot服務,第一步,加入依賴:
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <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>
  • 第二步,建立springboot程式主類,加上註解@EnableConfigServer,開啟spring cloud config的服務端功能。
@SpringBootApplication
@EnableConfigServer
public class GitApplication {

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

}
  • 第三步,在application.yml中新增配置服務的基本資訊以及git倉庫的相關資訊
spring.application.name=config-server-git
server.port=7001

spring.cloud.config.server.git.uri=https://github.com/servef-toto/SpringCloud-Demo/
spring.cloud.config.server.git.search-paths=config-server-file/git-config
spring.cloud.config.server.git.username=xxxxxx
spring.cloud.config.server.git.password=xxxxx

其中git的配置分別表示如下內容

  • spring.cloud.config.server.git.uri: 配置的git倉庫位置
  • spring.cloud.config.server.git.search-paths: 配置倉庫路徑下的相對搜尋位置,可以配置多個
  • spring.cloud.config.server.git.username: 訪問git的使用者名稱
  • spring.cloud.config.server.git.password: 訪問git倉庫的使用者密碼

到這裡,一個基本得基於git得配置中心就好了。

 

配置規則詳解

在git配置資訊中指定的倉庫位置,https://github.com/servef-toto/SpringCloud-Demo/config-server-file/git-config目錄下建立五個不同的配置檔案:

zhihao.yml
zhihao-dev.yml
zhihao-test.yml
zhihao-pro.yml
application.yml

內容分別是:
zhihao.yml

from: git-default-1.0
spring:
  datasource:
    username: user_default

zhihao-dev.yml

from: git-dev-1.0
spring:
  datasource:
    username: user_dev

zhihao-test.yml

from: git-test-1.0
spring:
  datasource:
    username: user_test

zhihao-pro.yml

from: git-pro-1.0
spring:
  datasource:
    username: user_pro

application.yml

from: git-pro-1.0
spring:
  datasource.
    username:
      zhihao.miao1

為了測試版本控制,在git倉庫的master分支中,我們為from屬性加入1.0的字尾,同時建立一個config-label-test分支,並將各配置檔案中的值用2.0做為字尾.

完成上面的工作我們就可以通過url來訪問這些配置內容了。

* /{application}/{profile}/[{label}]
* /{application}-{profile}.yml
* /{label}/{application}-{profile}.yml
* /{application}-{profile}.properties
* /{label}/{application}-{profile}.properties

上面的url會對映{application}-{profile}.yml對應的配置檔案,其中{label}對應git上不同的分支,預設是master。我們可以嘗試構造不同的url來訪問不同的配置內容,比如,要訪問config-label-test分支,zhihao應用的prod環境,就可以訪問這個url:http://localhost:9090/zhihao/pro/config-label-test

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

2017-08-15 22:10:07.568  INFO 28701 --- [io-9090-exec-10] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]5ac2c286: startup date [Tue Aug 15 22:10:07 CST 2017]; root of context hierarchy
2017-08-15 22:10:07.579  INFO 28701 --- [io-9090-exec-10] o.s.c.c.s.e.NativeEnvironmentRepository  : Adding property source: file:/var/folders/p0/kw_s_8xj2gqc929nys7cj2yh0000gn/T/config-repo-2847833657021753497/config-repo/application-pro.yml
2017-08-15 22:10:07.579  INFO 28701 --- [io-9090-exec-10] o.s.c.c.s.e.NativeEnvironmentRepository  : Adding property source: file:/var/folders/p0/kw_s_8xj2gqc929nys7cj2yh0000gn/T/config-repo-2847833657021753497/config-repo/application.yml
2017-08-15 22:10:07.579  INFO 28701 --- [io-9090-exec-10] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.[email protected]: startup date [Tue Aug 15 22:10:07 CST 2017]; root of context hierarchy

config-server-git通過從git在本地的倉庫暫存,可以有效的防止當git倉庫出現故障而引起無法載入配置資訊的情況。我們可以通過斷開網路(斷開wifi),再次發起從http://localhost:9090/zhihaomiao/pro/config-label-test請求,在控制檯中可以輸出如下內容,這些內容源於之前訪問時存在於config-server-git服務本地檔案系統中的配置資訊。

2017-08-15 22:23:15.002  WARN 28701 --- [nio-9090-exec-5] .c.s.e.MultipleJGitEnvironmentRepository : Could not fetch remote for config-label-test remote: http://git.oschina.net/zhihaomiao/config-repo-demo
2017-08-15 22:23:15.074  INFO 28701 --- [nio-9090-exec-5] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]7060493e: startup date [Tue Aug 15 22:23:15 CST 2017]; root of context hierarchy
2017-08-15 22:23:15.088  INFO 28701 --- [nio-9090-exec-5] o.s.c.c.s.e.NativeEnvironmentRepository  : Adding property source: file:/var/folders/p0/kw_s_8xj2gqc929nys7cj2yh0000gn/T/config-repo-2847833657021753497/config-repo/application-pro.yml
2017-08-15 22:23:15.089  INFO 28701 --- [nio-9090-exec-5] o.s.c.c.s.e.NativeEnvironmentRepository  : Adding property source: file:/var/folders/p0/kw_s_8xj2gqc929nys7cj2yh0000gn/T/config-repo-2847833657021753497/config-repo/application.yml
2017-08-15 22:23:15.089  INFO 28701 --- [nio-9090-exec-5] s.c.a.AnnotationConfigApplicationContext : Closing org.spring[email protected]7060493e: startup date [Tue Aug 15 22:23:15 CST 2017]; root of context hierarchy

 

客戶端配置對映

在完成上面得配置之後,確定配置中心已經啟動。如何在微服務應用中獲取上面的配置資訊?

  • 建立一個Springboot應用config-client,並在pom檔案中引入依賴
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/>
    </parent>
    <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>
  • 建立springboot應用主類
  • 建立bootstrap.properties配置,來指定獲取配置檔案得配置中心得位置,和配置檔案得資訊。
#對應配置檔案規則中得{application}部分
spring.application.name=zhihao
#對應配置檔案規則中得{profile}部分
spring.cloud.config.profile=dev
#對應配置檔案規則中得{label}部分
spring.cloud.config.label=master
#對應配置中心得地址
spring.cloud.config.uri=http://localhost:7001/

server.port=7002

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

  • spring.application.name: 對應配置檔案規則中的{application}部分
  • spring.cloud.config.profile:對應配置檔案規則中{profile}部分
  • spring.cloud.config.label:對應配置檔案規則中的{label}部分
  • spring.cloud.config.uri:配置中心config-server的地址。

這裡需要格外注意,上面的屬性必須配置在bootstrap.yml中,這樣config-server中的配置資訊才能被正確載入。springboot對配置檔案的載入順序,對於本應用jar包之外的配置檔案載入會優於應用jar包內的配置內容,而通過bootstrap.ymlconfig-server-git的配置,使得該應用會從config-server-git中獲取一些外部配置資訊,這些資訊的優先順序比本地的內容要高,從而實現了外部化配置。

  • 建立一個介面來獲取配置中心得from屬性,通過@Value("${from}") 獲取Environment物件,來獲取屬性得只
@RefreshScope
@RestController
public class TestController {


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

    @Autowired
    private Environment environment;

    @RequestMapping("/from")
    public String from() {
        return this.from;
    }

    @RequestMapping("/envs")
    public String envs() {
        return this.environment.getProperty("from","undefined");
    }
}

測試訪問http://localhost:7002/from  和  http://localhost:7002/envs

git地址:https://github.com/servef-toto/SpringCloud-Demo/tree/master/config-server-file/git-config