spring cloud config學(xué)習(xí)一:快速入門

為什么要統(tǒng)一管理配置?

  • 集中管理配置文件
  • 不同環(huán)境不同配置
  • 運(yùn)行期間動(dòng)態(tài)調(diào)整配置
  • 自動(dòng)刷新

分布式配置中心

spring cloud configspring cloud團(tuán)隊(duì)創(chuàng)建的一個(gè)全新項(xiàng)目,用來為分布式系統(tǒng)中的基礎(chǔ)設(shè)施和微服務(wù)應(yīng)用提供集中化的外部配置支持,它分為服務(wù)端和客戶端兩部分,其中服務(wù)端也稱為分布式配置中心,它是一個(gè)獨(dú)立的微服務(wù)應(yīng)用,用來連接配置倉庫并為客戶端提供獲取配置信息,加密/解密信息等訪問接口,而客戶端則是微服務(wù)架構(gòu)中的各個(gè)微服務(wù)應(yīng)用或基礎(chǔ)設(shè)施,它們通過指定的配置中心管理應(yīng)用資源與業(yè)務(wù)相關(guān)的配置內(nèi)容,并在啟動(dòng)的時(shí)候從配置中心獲取和加載配置信息。spring cloud config實(shí)現(xiàn)了對服務(wù)端和客戶端中環(huán)境變量和屬性設(shè)置的抽象映射,所以它除了適用于spring構(gòu)建的應(yīng)用程序之外,也可以在任何其他語言運(yùn)行的應(yīng)用程序中使用。由于spring cloud config實(shí)現(xiàn)的配置中心默認(rèn)采用git來存儲(chǔ)配置信息,所以使用spring cloud config構(gòu)建的配置服務(wù)器,天然就支持對微服務(wù)應(yīng)用配置信息的版本管理,并且可以通過git客戶端工具來方便地管理和訪問配置內(nèi)容。當(dāng)然它也提供了對其他存儲(chǔ)方式的支持,比如說svn倉庫,本地化文件系統(tǒng)。

快速入門

構(gòu)建一個(gè)基于git存儲(chǔ)的分布式配置中心,并在客戶端中演示如何通過配置指定微服務(wù)應(yīng)用的所屬配置中心,并讓其能夠從配置中心獲取配置信息并綁定到代碼的整個(gè)過程。

構(gòu)建配置中心

創(chuàng)建一個(gè)名為config-server-git的服務(wù)

第一步,加入依賴:

<dependencies>
   <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
   </dependency>
   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>
</dependencies>

我構(gòu)建的是父子依賴,關(guān)于spring cloud的版本定義可以在父依賴中查看,相關(guān)代碼可以在博客最下方查看。

第二步,創(chuàng)建springboot程序主類,加上注解@EnableConfigServer,開啟spring cloud config的服務(wù)端功能。

@EnableConfigServer
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

第三步,在application.yml中添加配置服務(wù)的基本信息以及git倉庫的相關(guān)信息

spring:
  application:
    name: config-server-git
  cloud:
    config:
      server:
        git:
          uri: http://git.oschina.net/zhihaomiao/config-repo-demo
          username: zhihao.miao
          password: 13579qwertyu
          search-paths: config-repo
server:
  port: 9090

其中g(shù)it的配置分別表示如下內(nèi)容

  • spring.cloud.config.server.git.uri: 配置的git倉庫位置
  • spring.cloud.config.server.git.search-paths: 配置倉庫路徑下的相對搜索位置,可以配置多個(gè)
  • spring.cloud.config.server.git.username: 訪問git的用戶名
  • spring.cloud.config.server.git.password: 訪問git倉庫的用戶密碼

配置規(guī)則詳解

在git配置信息中指定的倉庫位置,http://git.oschina.net/zhihaomiao/config-repo-demo/config-repo目錄下創(chuàng)建五個(gè)不同的配置文件

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

內(nèi)容分別是:
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分支中,我們?yōu)?code>from屬性加入1.0的后綴,同時(shí)創(chuàng)建一個(gè)config-label-test分支,并將各配置文件中的值用2.0做為后綴.

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

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

上面的url會(huì)映射{application}-{profile}.yml對應(yīng)的配置文件,其中{label}對應(yīng)git上不同的分支,默認(rèn)是master。我們可以嘗試構(gòu)造不同的url來訪問不同的配置內(nèi)容,比如,要訪問config-label-test分支,zhihao應(yīng)用的prod環(huán)境,就可以訪問這個(gè)url:http://localhost:9090/zhihao/pro/config-label-test

{
  name: "zhihao",
  profiles: [
      "pro"
  ],
  label: "config-label-test",
  version: "13c5f9da27b75ea85b1585803a39b00d8a9b75d4",
  state: null,
  propertySources: [
      {
          name: "http://git.oschina.net/zhihaomiao/config-repo-demo/config-repo/zhihao-pro.yml",
          source: {
              from: "git-pro-3.0",
              spring.datasource.username: "user_pro3.0"
          }
      },
      {
          name: "http://git.oschina.net/zhihaomiao/config-repo-demo/config-repo/zhihao.yml",
          source: {
              from: "git-test-2.0",
              spring.datasource.username: "user_default"
          }
      },
      {
          name: "http://git.oschina.net/zhihaomiao/config-repo-demo/config-repo/application.yml",
          source: {
              from: "git-pro-2.0",
              spring.datasource.username: "zhihao.miao2"
          }
      }
  ]
}

我們看到j(luò)son中返回了應(yīng)用名是zhihao,環(huán)境是prod,分支名是config-label-test,以及default環(huán)境和prod環(huán)境的配置內(nèi)容,還包括applocation.yml的內(nèi)容。另外之前提到的version,也可以觀察到,對應(yīng)于最后提交的git的commit_id

也可以輸入http://localhost:9090/abc/pro/config-label-test,此時(shí)沒有abc.yml文件,就會(huì)去application.yml文件中查找,所以application.yml可以匹配任何{application}

{
    name: "abc",
    profiles: [
        "pro"
    ],
    label: "config-label-test",
    version: "13c5f9da27b75ea85b1585803a39b00d8a9b75d4",
    state: null,
    propertySources: [
        {
            name: "http://git.oschina.net/zhihaomiao/config-repo-demo/config-repo/application.yml",
            source: {
                from: "git-pro-2.0",
                spring.datasource.username: "zhihao.miao2"
            }
        }
    ]
}

同時(shí),我們可以看到config-server-git的控制臺(tái)中還輸出了下面的內(nèi)容,配置服務(wù)器在從git中獲取了配置信息后,會(huì)存儲(chǔ)一份在config-server-git的文件系統(tǒng)中,實(shí)質(zhì)上config-server-git是通過git clone命令將配置內(nèi)容復(fù)制了一份在本地存儲(chǔ),然后讀取這些內(nèi)容并返回給微服務(wù)應(yīng)用進(jìn)行加載。

2017-08-15 22:10:07.568  INFO 28701 --- [io-9090-exec-10] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@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.AnnotationConfigApplicationContext@5ac2c286: startup date [Tue Aug 15 22:10:07 CST 2017]; root of context hierarchy

config-server-git通過從git在本地的倉庫暫存,可以有效的防止當(dāng)git倉庫出現(xiàn)故障而引起無法加載配置信息的情況。我們可以通過斷開網(wǎng)絡(luò)(斷開wifi),再次發(fā)起從http://localhost:9090/zhihaomiao/pro/config-label-test請求,在控制臺(tái)中可以輸出如下內(nèi)容,這些內(nèi)容源于之前訪問時(shí)存在于config-server-git服務(wù)本地文件系統(tǒng)中的配置信息。

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.springframework.context.annotation.AnnotationConfigApplicationContext@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.springframework.context.annotation.AnnotationConfigApplicationContext@7060493e: startup date [Tue Aug 15 22:23:15 CST 2017]; root of context hierarchy

通過http訪問git server資源的格式:

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

比如

http://localhost:9090/config-label-test/abc-pro.yml

等等。

客戶端配置映射

如何在微服務(wù)應(yīng)用中獲取上面的配置信息?

  • 創(chuàng)建一個(gè)應(yīng)用config-client,并在pom文件中引入依賴:
    <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-actuator</artifactId>
        </dependency>
    </dependencies>
  • 創(chuàng)建springboot的應(yīng)用主類:
@SpringBootApplication
public class ConfigClientApplication {

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


}
  • 創(chuàng)建bootstrap.yml配置,來獲取配置文件的config-server-git位置,如下:
spring:
  application:
    name: zhihaomiao
  cloud:
    config:
      uri: http://localhost:9090/
      profile: pro
      label: config-label-test
server:
  port: 8080

上述配置參數(shù)與git中存儲(chǔ)的配置文件中各個(gè)部分的對應(yīng)關(guān)系如下:

  • spring.application.name: 對應(yīng)配置文件規(guī)則中的{application}部分
  • spring.cloud.config.profile:對應(yīng)配置文件規(guī)則中{profile}部分
  • spring.cloud.config.label:對應(yīng)配置文件規(guī)則中的{label}部分
  • spring.cloud.config.uri:配置中心config-server的地址。

這里需要格外注意,上面的屬性必須配置在bootstrap.yml中,這樣config-server中的配置信息才能被正確加載。springboot對配置文件的加載順序,對于本應(yīng)用jar包之外的配置文件加載會(huì)優(yōu)于應(yīng)用jar包內(nèi)的配置內(nèi)容,而通過bootstrap.ymlconfig-server-git的配置,使得該應(yīng)用會(huì)從config-server-git中獲取一些外部配置信息,這些信息的優(yōu)先級(jí)比本地的內(nèi)容要高,從而實(shí)現(xiàn)了外部化配置。

springboot應(yīng)用配置文件加載的順序是bootstrap.yml-> config server中的配置 -> application.yml中的配置,這樣的順序進(jìn)行加載。

如果在application.yml中配置和遠(yuǎn)程配置相同的配置
application.yml

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

那么application.yml中不會(huì)覆蓋當(dāng)前在config server中的配置,并且讀取的還是遠(yuǎn)程倉庫的配置,那么如何進(jìn)行屬性覆蓋呢,可以看下面的博客。

@RestController
public class ConfigClientController {

    private Logger log = LoggerFactory.getLogger(getClass());

    @Value("${spring.datasource.username}")
    private String username;

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

    @GetMapping("/index")
    public String index(){
        log.info("username="+username+",form=="+from);
        return "username="+username+",form=="+from;
    }
}

訪問

http://localhost:8080/index

頁面顯示:

username=user_pro,form==git-pro-2.0

服務(wù)端詳解

基本結(jié)構(gòu)
  • 遠(yuǎn)程git倉庫:用來存儲(chǔ)配置文件的地方,快速入門中應(yīng)用名為zhihao的多環(huán)境配置文件:zhihao-{profile}.properties.
  • config server:這是我們快速入門中構(gòu)建的分布式配置中心,config-server-git項(xiàng)目,在該工程中指定了所要連接的git倉庫位置以及賬戶,密碼等連接信息。
  • 本地git倉庫:在config server的文件系統(tǒng)中,每次客戶端請求獲取配置信息時(shí),Config Server從git倉庫中獲取最新的配置到本地,然后在本地git倉庫中讀取并返回。當(dāng)遠(yuǎn)程倉庫無法獲取時(shí),直接將本地的內(nèi)容返回。
  • Service A,Service B:具體的微服務(wù)應(yīng)用,他們指定了config Server地址,從而實(shí)現(xiàn)從外部化獲取應(yīng)用自己要用的配置信息。這些應(yīng)用在啟動(dòng)的時(shí)候,會(huì)向config server請求獲取配置信息來進(jìn)行加載。

客戶端應(yīng)用從配置管理中獲取配置信息遵從下面的執(zhí)行流程:

  1. 應(yīng)用啟動(dòng)時(shí),根據(jù)bootstrap.yml中配置的應(yīng)用名{application},環(huán)境名{profile},分支名{label},向config server請求獲取配置信息
  2. config server根據(jù)自己維護(hù)的git倉庫信息和客戶端傳遞過來的配置信息去查找配置信息。
  3. 根據(jù)git clone命令將找到的配置信息下載到Config Server的文件系統(tǒng)中
  4. Config Server創(chuàng)建Spring的ApplictionContext實(shí)例,并從git本地倉庫中加載配置文件,最后將這些配置內(nèi)容讀取出來返回給客戶端應(yīng)用。
  5. 客戶端應(yīng)用在獲取外部配置文件后加載到客戶端的ApplicationContext實(shí)例,該配置內(nèi)容的優(yōu)先級(jí)高于客戶端jar包內(nèi)部的配置內(nèi)容,所以在jar包中重復(fù)的內(nèi)容不再被加載

Config Server巧妙的通過git clone將配置信息存于本地,起到了緩存的作用,即使當(dāng)git服務(wù)端無法訪問的時(shí)候,依然可以取Config Server中緩存內(nèi)容進(jìn)行試驗(yàn)。

參考文檔
官網(wǎng)The Bootstrap Application Context
官網(wǎng)Quick Start
官網(wǎng)Client Side Usage

本博客代碼
代碼地址
配置倉庫

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容