配置集中化管理--配置中心(Spring Cloud Config)

作者:xcbeyond
瘋狂源自夢(mèng)想,技術(shù)成就輝煌!微信公眾號(hào):《程序猿技術(shù)大咖》號(hào)主,專注后端開(kāi)發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂(lè)于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項(xiàng)目的研發(fā)工作,涉及架構(gòu)設(shè)計(jì)、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對(duì)于Java、微服務(wù)、數(shù)據(jù)庫(kù)、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。

1、簡(jiǎn)介

      在基于微服務(wù)架構(gòu)下開(kāi)發(fā),由于服務(wù)數(shù)量巨多、在高可用性的驅(qū)使下要進(jìn)行集群時(shí),眾多節(jié)點(diǎn)及服務(wù)的配置管理,變得苦不堪言,簡(jiǎn)直成了體力活,稍微不細(xì)心將會(huì)出現(xiàn)配置錯(cuò)誤。為了方便服務(wù)配置信息的統(tǒng)一集中化管理,實(shí)時(shí)更新,SpringCloud中Spring Cloud Config組件(配置中心),就用來(lái)解決這類問(wèn)題,以達(dá)到配置集中化管理,讓你可以把配置集中放到遠(yuǎn)程服務(wù)器,集中化管理集群配置。

      從配置中心Spring Cloud Config的源碼(spring-cloud-config-server)中,可以看出目前配置中心支持本地存儲(chǔ)、Git倉(cāng)庫(kù)存儲(chǔ)、SVN倉(cāng)庫(kù)存儲(chǔ)、數(shù)據(jù)庫(kù)存儲(chǔ)方式,其他存儲(chǔ)方式可參考源碼自行實(shí)現(xiàn)即可。





















2、配置中心服務(wù)端Config Server

        配置中心服務(wù)端依賴于spring-cloud-config-server包,創(chuàng)建一個(gè)普通的springBoot項(xiàng)目springCloudConfig-git(此處以git方式存儲(chǔ)為例),額外添加如下依賴包:

    <!-- config-server配置中心 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
        <version>2.0.0.RELEASE</version>
    </dependency>

      在啟動(dòng)類ConfigServerGitApplication中添加@EnableConfigServer注解,即:開(kāi)啟支持配置中心的功能,如下:

    package com.xcbeyond.springcloud.config;
     
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.config.server.EnableConfigServer;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
     
    /**
     * 配置中心。</br>
     * 以git方式存儲(chǔ)配置
     * @author xcbeyond
     * 2018年9月17日下午11:44:10
     */
    @SpringBootApplication
    //開(kāi)啟配置服務(wù)器的支持
    @EnableConfigServer
    //開(kāi)啟作為Eureka Server的客戶端的支持
    @EnableEurekaClient
    public class ConfigServerGitApplication {
        public static void main(String[] args) {
            SpringApplication.run(ConfigServerGitApplication.class, args);
        }
    }

在配置文件application.yml中進(jìn)行如下配置:

此處為git倉(cāng)庫(kù)集中管理配置文件的配置方式。

(本例中配置了注冊(cè)中心,如果不需要,則可刪除注冊(cè)中心的配置)

    #當(dāng)前配置服務(wù)器端口
    server:
      port: 8888
    spring:
      application:
        name: config-center
     
      cloud:
      #配置中心配置
        config:
          server:
            git:
              #配置git倉(cāng)庫(kù)地址
              uri: https://github.com/xcbeyond/springCloudLearning.git
              #配置倉(cāng)庫(kù)路徑
              search-paths: config-repo
              #配置文件本地臨時(shí)存儲(chǔ)目錄
    #          basedir: target/config
              #訪問(wèn)git倉(cāng)庫(kù)的用戶名.如果Git倉(cāng)庫(kù)為公開(kāi)倉(cāng)庫(kù),可以不填寫用戶名和密碼,如果是私有倉(cāng)庫(kù)需要填寫
    #          username: xxx
    #          password: xxx
          #配置倉(cāng)庫(kù)的分支
          label: master
     
    #Eureka配置
    eureka:
      client:
        serviceUrl:
          #服務(wù)注冊(cè)中心地址,需按照注冊(cè)中心IP進(jìn)行對(duì)應(yīng)修改
          defaultZone: http://register-center:8761/eureka/
      instance:
        prefer-ip-address: true

配置說(shuō)明:

    spring.cloud.config.server.git.uri  配置git倉(cāng)庫(kù)地址
    spring.cloud.config.server.git.search-paths 配置倉(cāng)庫(kù)路徑
    spring.cloud.config.server.git.basedir 配置文件本地臨時(shí)存儲(chǔ)目錄。一般無(wú)需配置。
    spring.cloud.config.server.git.username 訪問(wèn)git倉(cāng)庫(kù)的用戶名.
    spring.cloud.config.server.git.password 訪問(wèn)git倉(cāng)庫(kù)的密碼
    spring.cloud.config.label 配置倉(cāng)庫(kù)的分支

     如果Git倉(cāng)庫(kù)為公開(kāi)倉(cāng)庫(kù),可以不填寫用戶名和密碼,如果是私有倉(cāng)庫(kù)需要填寫。本例中使用的公開(kāi)倉(cāng)庫(kù),故未配置用戶名和密碼,git倉(cāng)庫(kù)地址為https://github.com/xcbeyond/springCloudLearning.git,在目錄config-repo下用來(lái)存放各個(gè)服務(wù)的配置文件進(jìn)行集中管理,其中有一個(gè)config-client.yml配置文件,內(nèi)容如下:

    server:
      port: 8889

    eureka:
      client:
        serviceUrl:
          #服務(wù)注冊(cè)中心地址,需按照注冊(cè)中心IP進(jìn)行對(duì)應(yīng)修改
          defaultZone: http://register-center:8761/eureka/
          
    test: this is a test message!

     啟動(dòng)配置中心springCloudConfig-git服務(wù),訪問(wèn)http://localhost:8888/config-client/test,則會(huì)返回如下結(jié)果,即:包含git上config-client.yml配置文件的內(nèi)容。

{"name":"config-client","profiles":["test"],"label":null,"version":"46cfa51b88a1f5b08ee69bc67af187b1dc054ddf","state":null,"propertySources":[{"name":"https://github.com/xcbeyond/springCloudLearning.git/config-repo/config-client.yml","source":{"server.port":8889,"eureka.client.serviceUrl.defaultZone":"http://register-center:8761/eureka/","test":"this is a test message!"}}]}

由此證明從配置中心獲取配置信息成功,說(shuō)明配置中心搭建成功。

http請(qǐng)求地址和資源文件映射如下:

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

3、配置中心客戶端ConfigClient

      創(chuàng)建另外一個(gè)springboot項(xiàng)目springCloudConfigClient,作為配置中心的客戶端,即從通過(guò)配置中心獲取集中配置信息的服務(wù)??蛻舳艘蕾噑pring-cloud-starter-netflix-eureka-client包,pom.xml中額外添加如下依賴:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
        <version>2.0.0.RELEASE</version>
    </dependency>

    其配置文件為bootstrap.yml,注意該文件名是bootstrap,不再是application。應(yīng)該bootstrap配置文件優(yōu)先于application配置文件加載。bootstrap.ym中只配置配置中心相關(guān)信息,其他配置統(tǒng)一集中存放在git上統(tǒng)一管理,以供該服務(wù)使用。

    bootstrap.yml配置文件內(nèi)容如下:

    spring:
      application:
        name: config-client
      cloud:
        config:
          #配置中心地址
          uri: http://config-center:8888/
          #遠(yuǎn)程配置中心配置文件名
          name: config-client
          #遠(yuǎn)程倉(cāng)庫(kù)的分支
          label: master

    spring.cloud.config.uri 配置中心地址,用于明確訪問(wèn)的是哪個(gè)配置中心
    spring.cloud.config.name 遠(yuǎn)程配置中心配置文件名
    spring.cloud.config.label 遠(yuǎn)程倉(cāng)庫(kù)的分支

寫一個(gè)測(cè)試接口/hi,返回配置文件中test的值,用來(lái)測(cè)試從配置中心的配置文件獲取配置。

    package com.xcbeyond.springcloud.configclient.controller;
     
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    /**
     * 從服務(wù)配置中心獲取配置信息
     * @author xcbeyond
     * 2018年8月7日下午4:11:00
     */
    @RestController
    public class GetConfigServerController {
        //通過(guò)服務(wù)配置中心獲取git上配置文件里的key
        @Value("${test}")
        private String test;
        
        @RequestMapping("/hi")
        public String hi() {
            return test;
        }
    }

啟動(dòng)springCloudConfigClient,通過(guò)訪問(wèn)http://localhost:8889/hi,則會(huì)返回“this is a test message!”