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

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

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

分布式配置中心

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)容荤西,并在啟動的時(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來存儲配置信息癌瘾,所以使用spring cloud config構(gòu)建的配置服務(wù)器,天然就支持對微服務(wù)應(yīng)用配置信息的版本管理饵溅,并且可以通過git客戶端工具來方便地管理和訪問配置內(nèi)容妨退。當(dāng)然它也提供了對其他存儲方式的支持,比如說svn倉庫蜕企,本地化文件系統(tǒng)咬荷。

快速入門

構(gòu)建一個(gè)基于git存儲的分布式配置中心,并在客戶端中演示如何通過配置指定微服務(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會映射{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文件,就會去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的控制臺中還輸出了下面的內(nèi)容膛锭,配置服務(wù)器在從git中獲取了配置信息后,會存儲一份在config-server-git的文件系統(tǒng)中蚊荣,實(shí)質(zhì)上config-server-git是通過git clone命令將配置內(nèi)容復(fù)制了一份在本地存儲初狰,然后讀取這些內(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請求敲霍,在控制臺中可以輸出如下內(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中存儲的配置文件中各個(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包之外的配置文件加載會優(yōu)于應(yīng)用jar包內(nèi)的配置內(nèi)容翻斟,而通過bootstrap.ymlconfig-server-git的配置,使得該應(yīng)用會從config-server-git中獲取一些外部配置信息说铃,這些信息的優(yōu)先級比本地的內(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中不會覆蓋當(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倉庫:用來存儲配置文件的地方,快速入門中應(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)用在啟動的時(shí)候鲸阔,會向config server請求獲取配置信息來進(jìn)行加載偷霉。

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

  1. 應(yī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)先級高于客戶端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)系作者
  • 序言:七十年代末紧唱,一起剝皮案震驚了整個(gè)濱河市活尊,隨后出現(xiàn)的幾起案子祖凫,更是在濱河造成了極大的恐慌,老刑警劉巖酬凳,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惠况,死亡現(xiàn)場離奇詭異,居然都是意外死亡宁仔,警方通過查閱死者的電腦和手機(jī)稠屠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翎苫,“玉大人权埠,你說我怎么就攤上這事〖宓” “怎么了攘蔽?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呐粘。 經(jīng)常有香客問我满俗,道長,這世上最難降的妖魔是什么作岖? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任唆垃,我火速辦了婚禮,結(jié)果婚禮上痘儡,老公的妹妹穿的比我還像新娘辕万。我一直安慰自己,他們只是感情好沉删,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布渐尿。 她就那樣靜靜地躺著,像睡著了一般矾瑰。 火紅的嫁衣襯著肌膚如雪砖茸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天脯倚,我揣著相機(jī)與錄音渔彰,去河邊找鬼。 笑死推正,一個(gè)胖子當(dāng)著我的面吹牛恍涂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播植榕,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼再沧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尊残?” 一聲冷哼從身側(cè)響起炒瘸,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤淤堵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后顷扩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拐邪,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年隘截,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扎阶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婶芭,死狀恐怖东臀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情犀农,我是刑警寧澤惰赋,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站呵哨,受9級特大地震影響赁濒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仇穗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一流部、第九天 我趴在偏房一處隱蔽的房頂上張望戚绕。 院中可真熱鬧纹坐,春花似錦、人聲如沸舞丛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽球切。三九已至谷誓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吨凑,已是汗流浹背捍歪。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸵钝,地道東北人糙臼。 一個(gè)月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像恩商,于是被迫代替她去往敵國和親变逃。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

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