Spring Cloud入門教程(八):統(tǒng)一配置中心(Config)

上一篇:《Spring Cloud入門教程(七):分布式鏈路跟蹤(Sleuth)》

本人和同事撰寫的《Spring Cloud微服務架構(gòu)開發(fā)實戰(zhàn)》一書也在京東、當當?shù)葧晟霞艹呱希蠹铱梢渣c擊這里前往購買杈曲,多謝大家支持和捧場!


對于配置的重要性麻捻,我想我不用進行任何強調(diào)滩届,大家都可以明白其重要性诊沪。在普通單體應用,我們常使用配置文件(application(*).properties(yml))管理應用的所有配置砌函。這些配置文件在單體應用中非常勝任其角色斩披,并沒有讓我們感覺到有頭疼的地方。但隨著微服務框架的引入讹俊,微服務數(shù)量就會在我們產(chǎn)品中不斷增加垦沉,之前我們重點考慮的是系統(tǒng)的可伸縮、可擴展性好仍劈,但隨之就是配置管理的問題就會一一暴露出來厕倍。起初微服務器各自管各自的配置,在開發(fā)階段并沒什么問題贩疙,但到了生產(chǎn)環(huán)境管理就會很頭疼讹弯,如果要大規(guī)模更新某項配置,困難就可想而知屋群。

為此闸婴,在分布式系統(tǒng)中,Spring Cloud提供一個Config子項目芍躏,該項目核心就是配置中心邪乍,通過一個服務端和多個客戶端實現(xiàn)配置服務。我們可使用配置服務器集中的管理所有服務的各種環(huán)境配置文件对竣。配置服務中心默認采用Git的方式進行存儲庇楞,因此我們很容易部署修改,并可以對環(huán)境配置進行版本管理否纬。

Spring Cloud Config具有中心化吕晌、版本控制、支持動態(tài)更新和語言獨立等特性临燃。其特點是:

  • 提供服務端和客戶端支持(Spring Cloud Config Server和Spring Cloud Config Client);
  • 集中式管理分布式環(huán)境下的應用配置;
  • 基于Spring環(huán)境睛驳,實現(xiàn)了與Spring應用無縫集成;
  • 可用于任何語言開發(fā)的程序;
  • 默認實現(xiàn)基于Git倉庫(也支持SVN)烙心,從而可以進行配置的版本管理;

Spring Cloud Config的結(jié)構(gòu)圖如下:

Config-結(jié)構(gòu)圖

從圖中可以看出Spring Cloud Config有兩個角色(類似Eureka): Server和Client。Spring Cloud Config Server作為配置中心的服務端承擔如下作用:

  • 拉取配置時更新Git倉庫副本乏沸,保證是配置為最新;
  • 支持從yml淫茵、json、properties等文件加載配置;
  • 配合Eureke可實現(xiàn)服務發(fā)現(xiàn)蹬跃,配合Cloud Bus(這個后面我們在詳細說明)可實現(xiàn)配置推送更新;
  • 默認配置存儲基于Git倉庫(可以切換為SVN)匙瘪,從而支持配置的版本管理.

而對于,Spring Cloud Config Client則非常方便蝶缀,只需要在啟動配置文件中增加使用Config Server上哪個配置文件即可丹喻。

1. 示例代碼

1.1 構(gòu)建Config-Server

編寫pom.xml文件

Config-Server是一個標準的Spring Boot應用,所以pom.xml也是繼承之前的Parent:

<parent>
    <groupId>twostepsfromjava.cloud</groupId>
    <artifactId>twostepsfromjava-cloud-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <relativePath>../parent</relativePath>
</parent>

<artifactId>config-server</artifactId>
<name>Spring Cloud Sample Projects: Config Server</name>

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

編寫啟動類

/**
 * TwoStepsFromJava Cloud -- Config Server
 *
 * @author CD826(CD826Dong@gmail.com)
 * @since 1.0.0
 */
@SpringBootApplication
@EnableConfigServer
public class Application {

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

}

這里最重要的就是增加@EnableConfigServer翁都,其它與之前的應用一致碍论。

編寫配置文件

server.port=8280

spring.application.name=config-server

spring.cloud.config.server.git.uri=https://github.com/cd826/SpringcloudSamplesConfig
spring.cloud.config.server.git.username=your git username
spring.cloud.config.server.git.password=your git password

這里最重要的是需要配置Git倉庫的地址及登錄用戶名和口令。

創(chuàng)建測試配置文件

我們在SpringcloudSamplesConfig倉庫中增加量個配置文件柄慰。

mallWeb.properties骑冗,文件內(nèi)容如下:

foo = bar

mallWeb-dev.properties,文件內(nèi)容如下:

bar = cd826

注意:這里編寫文件后記得提交先煎,否則會測試失敗。

啟動測試

啟動config-server. 在終端中我們輸入以下命令(或者使用postman):

curl localhost:8280/mallWeb/dev

在終端中會輸出以下內(nèi)容:

{"name":"mallWeb","profiles":["dev"],"label":null,"version":null,"state":null,"propertySources":[
    {"name":"https://github.com/cd826/SpringcloudSamplesConfig/mallWeb-dev.properties","source":{"bar":"cd826"}},  
    {"name":"https://github.com/cd826/SpringcloudSamplesConfig/mallWeb.properties","source":{"foo":"bar"}}
]}

這里可以看到巧涧,我們提交到Git中的配置文件已經(jīng)能夠被config-server正確的讀取到薯蝎。

config-server默認配置

當我們查看源碼會發(fā)現(xiàn)在spring-cloud-config-server.jar包中有一個默認配置文件configserver.yml配置文件,也就是說當我們設置spring.application.name=configserver時谤绳,就會默認加載該配置文件占锯,該配置文件內(nèi)容如下:

info:
  component: Config Server
spring:
  application:
    name: configserver
  jmx:
    default_domain: cloud.config.server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          repos:
            - patterns: multi-repo-demo-*
              uri: https://github.com/spring-cloud-samples/config-repo

server:
  port: 8888
management:
  context_path: /admin

默認使用8888端口,并且從https://github.com/spring-cloud-samples/config-repo這個Git倉庫中查找配置文件缩筛。

因為消略,在上面的示例中我們重新定義了應用名稱和服務端口。

1.2 構(gòu)建config-client

config-client可以是任何一個基于Spring boot的應用瞎抛,這里為了講解方便艺演,我們構(gòu)建一個非常簡單的web工程。

編寫pom.xml文件

我們的config-client項目需要引入對spring-cloud-starter-config的依賴桐臊,如下:

<parent>
    <groupId>twostepsfromjava.cloud</groupId>
    <artifactId>twostepsfromjava-cloud-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <relativePath>../parent</relativePath>
</parent>
    
<artifactId>config-client</artifactId>
<name>Spring Cloud Sample Projects: Config Client</name>

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

編寫啟動類

一個標準的Spring Boot啟動類:

/**
 * TwoStepsFromJava Cloud -- Config Client Project
 *
 * @author CD826(CD826Dong@gmail.com)
 * @since 1.0.0
 */
@SpringBootApplication
public class Application {

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

}

編寫測試Controller

這個測試Controller主要就是驗證我們可以從Git倉庫中獲取配置內(nèi)容胎撤。

/**
 * Config Client Test Controller
 *
 * @author CD826(CD826Dong@gmail.com)
 * @since 1.0.0
 */
@RestController
@RequestMapping("/cfg")
public class ConfigController {
    @Value("${foo}")
    String foo;

    @Value("${bar}")
    String bar;

    @RequestMapping(value = "/foo")
    public String foo(){
        return foo + "——" + bar;
    }
}

編寫配置文件

這里編寫的配置文件名稱為:bootstrap.properties,內(nèi)容如下:

server.port=8080

spring.application.name=mallWeb
spring.cloud.config.profile=dev
spring.cloud.config.uri= http://localhost:8280/

定義了微服務的名稱和profile以及配置服務器的地址断凶。

注意: 這些配置不能夠配置在application.properties文件中伤提,因為在Spring Boot啟動時有引導上下文和應用上下文的概念,只有將配置服務器信息定義在引導上下文中认烁,才能夠從配置服務器中獲取到配置信息肿男。否則介汹,服務啟動時會報找不到foo變量定義的錯誤。

1.3 啟動測試

啟動后我們可以訪問:http://localhost:8080/cfg/foo舶沛,可以看到如下界面:

Config-010

說明嘹承,我們的config-client已經(jīng)成功從config-server上獲取到配置的數(shù)據(jù)了。

1.4 Spring項目配置加載順序

  • 這里是列表文本命令行參數(shù)
  • SPRING_APPLICATION_JSON 參數(shù)
  • 從java:comp/env 加載 JNDI 屬性
  • Java系統(tǒng)屬性 (System.getProperties())
  • 操作系統(tǒng)環(huán)境變量
  • 如果有使用 random.* 屬性配置冠王,則使用 RandomValuePropertySource 產(chǎn)生
  • 外部特定應用配置文件 例如:application-{profile}.properties 或者 YAML variants
  • 內(nèi)部特定應用配置文件 例如:application-{profile}.properties 或者 YAML variants
  • 外部應用配置文件 例如:application.properties 或者 YAML variants
  • 內(nèi)部應用配置文件 例如:application.properties 或者 YAML variants
  • 加載@Configuration類的 @PropertySource 或者 @ConfigurationProperties 指向的配置文件
  • 默認配置赶撰,通過SpringApplication.setDefaultProperties 設置

2. 配置規(guī)則詳解

下面我們來看一看Config Client從Config Server中獲取配置數(shù)據(jù)的流程:

    1. Config Client啟動時,根據(jù)bootstrap.properties中配置的應用名稱(application)柱彻、環(huán)境名(profile)和分支名(label)豪娜,向Config Server請求獲取配置數(shù)據(jù);
    1. Config Server根據(jù)Config Client的請求及配置,從Git倉庫(這里以Git為例)中查找符合的配置文件;
    1. Config Server將匹配到的Git倉庫拉取到本地哟楷,并建立本地緩存;
    1. Config Server創(chuàng)建Spring的ApplicationContext實例瘤载,并根據(jù)拉取的配置文件,填充配置信息卖擅,然后將該配置信息返回給Config Client;
    1. Config Client獲取到Config Server返回的配置數(shù)據(jù)后鸣奔,將這些配置數(shù)據(jù)加載到自己的上下文中。同時惩阶,因為這些配置數(shù)據(jù)的優(yōu)先級高于本地Jar包中的配置挎狸,因此將不再加載本地的配置。

那么断楷,Config Server又是如何與Git倉庫中的配置文件進行匹配的呢锨匆?通常,我們會為一個項目建立類似如下的配置文件:

  • mallweb.properties: 基礎配置文件;
  • mallweb-dev.properties: 開發(fā)使用的配置文件;
  • mallweb-test.properties: 測試使用的配置文件;
  • mallweb-prod.properties: 生產(chǎn)環(huán)境使用的配置文件;

當我們訪問Config Server的端點時冬筒,就會按照如下映射關(guān)系來匹配相應的配置文件:

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

上面的Url將會映射為格式為:{application}-{profile}.properties(yml)的配置文件恐锣。另外,label則對應Git上分支名稱舞痰,是一個可選參數(shù)土榴,如果沒有則為默認的master分支。

Config-Clientbootstrap.properties配置對應如下:

  • spring.application.name <==> application;
  • spring.cloud.config.profile <==> profile;
  • spring.cloud.config.label <==> label.

2.1 Git倉庫配置

Config Server默認使用的就是Git响牛,所以配置也非常簡單玷禽,如上面的配置(application.properties):

spring.cloud.config.server.git.uri=http://
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password

那么客戶端在請求時服務端就會到該倉庫中進行查找。

2.1.1 使用占位符

在服務端配置中我們也可以使用{application}呀打、{profile}{label}占位符论衍,如下:

spring.cloud.config.server.git.uri=http://github.com/cd826/{application}
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password

這樣,我們就可以為每一個應用客戶端創(chuàng)建一個單獨的倉庫聚磺。

這里需要注意的是坯台,如果Git的分支或標簽中包含"/"時,在{label}參數(shù)中需要使用"(_)"替代瘫寝,這個主要是避免與Http URL轉(zhuǎn)義符處理的沖突蜒蕾。

2.1.2 使用模式匹配

我們也可以使用{application}/{profile}進行模式匹配稠炬,以便獲取到相應的配置文件。配置示例如下:

spring.cloud.config.server.git.uri=https://github.com/spring-cloud-samples/config-repo

spring.cloud.config.server.git.repos.simple=https://github.com/simple/config-repo

spring.cloud.config.server.git.repos.special.pattern=special*/dev*,*special*/dev*
spring.cloud.config.server.git.repos.special.uri=https://github.com/special/config-repo

spring.cloud.config.server.git.repos.local.pattern=local*
spring.cloud.config.server.git.repos.local.uri=file:/home/configsvc/config-repo

如果模式中需要配置多個值咪啡,那么可以使用逗號分隔首启。

如果{application}/{profile}沒有匹配到任何資源毅桃,則使用spring.cloud.config.server.git.uri配置的默認URI。

當我們使用yml類型的文件進行配置時钥飞,如果模式屬性是一個YAML數(shù)組衫嵌,也可以使用YAML數(shù)組格式來定義。這樣可以設置成多個配個配置文件楔绞,如:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          repos:
            development:
              pattern:
                - */development
                - */staging
              uri: https://github.com/development/config-repo
            staging:
              pattern:
                - */qa
                - */production
              uri: https://github.com/staging/config-repo

2.1.3 搜索目錄

當我們把配置文件存放在Git倉庫中子目錄中時结闸,可以通過設置serch-path來指定該目錄。同樣酒朵,serch-path也支持上面的占位符桦锄。示例如下:

spring.cloud.config.server.git.uri=https://github.com/spring-cloud-samples/config-repo
spring.cloud.config.server.git.searchPaths=foo,bar*

這樣系統(tǒng)就會自動搜索foo的子目錄,以及以bar開頭的文件夾中的子目錄蔫耽。

2.1.4 SSH配置

如果你不想使用HTTPS和用戶認證察纯,也可以直接使用SSH,這時候我們只需要將ssh需要的keys存儲在~/.ssh目錄即可针肥,并將所配置的uri指向SSH地址即可,如:git@github.com:cd826/SpringcloudSamplesConfig香伴。

如果你清楚的知道你的~/.git目錄慰枕,那么你可以使用git config --global來配置。否則可以使用全局配置即纲,比如:git config --global http.sslVerify false具帮。

2.1.4 代理

Config-Server會使用JGit訪問配置庫,因此我們可以在~/.git/config下配置HTTPS所使用的代理低斋,也可以使用JVM系統(tǒng)屬性-Dhttps.proxyHost-Dhttps.proxyPort來配置蜂厅。

2.1.5 本地緩存

當Config-Server從Git(或SVN)中獲取了配置信息后,將會在本地的文件系統(tǒng)中存儲一份膊畴。默認將存儲在系統(tǒng)臨時目錄下掘猿,并且以config-repo-作為開頭,在Linux系統(tǒng)中默認存儲的目錄為/tmp/config-repo-<randomid>唇跨。Config-Server將配置信息存儲在本地可以有效的防止當Git倉庫出現(xiàn)故障而無法訪問的問題稠通,當Config-Server無法訪問到Git倉庫時就會讀取之前存儲在本地文件中的配置衬衬,然后將這些配置信息返回給Config-Client。比如改橘,當我們斷開網(wǎng)絡進行測試滋尉,當我們啟動Config-Server時會在控制臺中看到以下輸出:

17:18:01 285 [http-nio-8280-exec-1] WARN  o.s.c.c.s.e.MultipleJGitEnvironmentRepository - Could not fetch remote for master remote: https://github.com/cd826/SpringcloudSamplesConfig
17:18:01 660 [http-nio-8280-exec-1] INFO  o.s.c.a.AnnotationConfigApplicationContext - Refreshing 
17:18:01 710 [http-nio-8280-exec-1] INFO  o.s.b.f.a.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
17:18:01 782 [http-nio-8280-exec-1] INFO  o.s.c.c.s.e.NativeEnvironmentRepository - Adding property source: file:/Users/cd826/MyWork/springcloud-sample-projects/config/config-server/tmp/mallWeb-dev.properties
17:18:01 782 [http-nio-8280-exec-1] INFO  o.s.c.c.s.e.NativeEnvironmentRepository - Adding property source: file:/Users/cd826/MyWork/springcloud-sample-projects/config/config-server/tmp/mallWeb.properties

Spring Cloud 官方文檔建議我們在Config-Server中指定本地文件路徑,以避免出現(xiàn)不可預知的錯誤碾篡〉⒚罚可以使用下面的屬性配置來指定本地文件路徑:

## Git倉庫
spring.cloud.config.server.git.basedir=tmp/

## SVN倉庫
spring.cloud.config.server.svn.basedir=tmp/

2.2 SVN配置

如果你的項目中使用的是SVN而不是Git眼姐,那么只需要在Config-Server中進行如下修改就可以支持SVN倉庫众旗。

2.2.1 修改pom.xml

在pom文件中增加以下依賴:

<dependency>
    <groupId>org.tmatesoft.svnkit</groupId>
    <artifactId>svnkit</artifactId>
</dependency>

2.2.2 修改appliaction.properties

spring.cloud.config.server.svn.uri={your svn server}
spring.cloud.config.server.svn.username=username
spring.cloud.config.server.svn.password=password

2.3 文件系統(tǒng)

如果你的Config-Server中不想使用Git或SVN贡歧,那么我們也可以直接從當前classpath或文件系統(tǒng)中加載相應的配置文件利朵,只需在配置文件中設置如下:

spring.profiles.active=native

注意Config-Server默認會從classpath下加載绍弟,我們可以使用spring.cloud.config.server.native.searchLocations屬性來設置配置文件的目錄樟遣。對于文件路徑豹悬,我們的配置必須以file:開頭,如果是Windows系統(tǒng)對于絕對路徑我們還得對/進行轉(zhuǎn)義娇钱,比如,在Windows下我們需要配置如下:file:///${user.home}/config-repo考抄。

此外川梅,當我們使用文件系統(tǒng)作為配置文件倉庫時贫途,spring.cloud.config.server.native.searchLocations的配置也是支持{application} 丢早、{profile} 和 {label} 占位符的怨酝。

Spring Cloud 官方還是推薦在測試和開發(fā)的時候可以使用文件系統(tǒng)农猬,但是在正式環(huán)境中盡量還是使用Git或者SVN斤葱。

另揍堕,Spring Cloud Config中還支持另外一種配置文件方式:Vault Server衩茸,這個后面有空我們再探討。

3. 安全保護

3.1 Config-Server訪問安全

對于我們存儲在配置中心的一些配置內(nèi)容隙畜,總會有一些是敏感信息议惰,比如數(shù)據(jù)庫連接的用戶名和密碼言询,你總不能直接裸奔吧运杭,所以我們還是需要對Config-Server做一些安全控制辆憔。當然虱咧,對于Config-Server的安全控制有很多種腕巡,比如:物理網(wǎng)絡限制绘沉、OAuth2授權(quán)等梆砸。但是帖世,在這里因為我們使用的是SpringBoot赂弓,所以使用SpringSecurity會更容易也更簡單盈魁。這時候杨耙,我們只需要在Config-Server中增加如下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

此時珊膜,當我們啟動Config-Server時车柠,SpringSecurity會默認為我們生產(chǎn)一個訪問密碼竹祷,這種方式常常不是我們需要的感憾,所以一般我們還需要在配置文件中配置用戶名和密碼吹菱,比如:

security.user.name=cd826
security.user.password=pwd

這樣鳍刷,當我們需要訪問Config-Server時就會彈出用戶認證對話框输瓜。此時尤揣,對于Config-Client我們需要在配置文件中增加用戶和訪問口令的配置北戏,如下:

spring.cloud.config.username=cd826
spring.cloud.config.password=pwd

3.2 加密與解密

訪問安全是對整體的控制嗜愈,多數(shù)情況下我們還需要對敏感內(nèi)容加密后存儲蠕嫁,比如之前所說的數(shù)據(jù)庫訪問的用戶名稱和登錄口令剃毒。很幸運赘阀,Spring Cloud Config為我們提供相應的支持基公。

Spring Cloud Config提供了兩種加解密方式: 1)對稱加密; 2)非對稱加密。在描述如何使用之前迄靠,我們先看看一些使用前提掌挚。

3.2.1 安裝JCE(Java Cryptography Extension)

Spring Cloud Config所提供的加解密依賴JCE陡厘,因為糙置,JDK中沒有默認提供谤饭,所以我們需要先安裝JCE揉抵。安裝方法也比較簡單冤今,就是下載相應的Jar包戏罢,然后把這些包替換$JDK_HOME/jar/lib/security相應的文件帖汞,對于JDK8下載地址為:JCE for JDK8.

3.2.2 加解密端點

另外翩蘸,Spring Cloud Config還提供了兩個端點進行加密和解密催首,如下:

  • /encrypt: 加密端點郎任,使用格式如下: curl $CONFIG_SERVER/encrypt -d 所要加密的內(nèi)容
  • /decrypt: 解密端點分井,使用格式如下: curl $CONFIG_SERVER/decrypt -d 所要解密的內(nèi)容

注意:當你測試中所加解密中包含特殊字符時尺锚,需要進行URL編碼瘫辩,這時候你需要使用--data-urlencode而不是-d.

3.2.3 對稱加密

對稱加解密的配置非常簡單伐厌。我們只需要在配置文件中增加加解密所使用的密鑰即可挣轨,如:

encrypt.key=cd826_key

配置好之后刃唐,你可以啟動Config-Server画饥,并使用上面所說的端點進行加解密測試抖甘。

對于衔彻,配置文件我們需要為加密的內(nèi)容增加一個{cipher}前導符艰额。如:

spring.datasource.username=dbuser
spring.datasource.password={cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ

但是,如果你使用的配置文件是yml格式废岂,那么需要使用單引號把加密內(nèi)容引起來拯欧,如下:

spring:
    datasource:
        username:dbuser
        password:'{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'

3.2.4 非對稱加密

非對稱加密相對于對稱加密來說復雜了一些镐作,首先我們需要借助Java的keytool生成密鑰對,然后創(chuàng)建Key Store并復制到服務器目錄下包各。對于keytool的使用可以參考這里:《Spring Cloud入門教程(番外篇四): Keytool證書工具》

  1. 使用keytool生成Key Store六荒,命令如下:
$ keytool -genkeypair -alias tsfjckey -keyalg RSA \
  -dname "CN=Mall Web,OU=TwoStepsFromJava,O=Organization,L=city,S=province,C=china" \ 
  -keypass javatwostepsfrom -keystore server.jks -storepass twostepsfromjava
  1. 將所生成server.jks拷貝到項目的resources目錄下(Config-Server)掏击。

  2. 修改配置文件:

encrypt.key-store.location=server.jks
encrypt.key-store.alias=tsfjckey
encrypt.key-store.password=twostepsfromjava
encrypt.key-store.secret=javatwostepsfrom

非對稱加密相對于對稱加密來說配置也復雜,但安全性也會高很多殴玛。

3.2.5 使用多個加密Key

也許寻仗,我們需要對不同的敏感信息使用不同的加密key署尤,這時候我們的配置文件只需要按如下進行編寫:

foo.bar={cipher}{key:testkey}...

Config-Server在解密的時候就會嘗試從配置文件中獲取testkey的做為密鑰曹体。

4. 高可用配置

4.1 整合Eureka

看到這里箕别,可能有些童鞋已經(jīng)發(fā)現(xiàn)究孕,我們在Config-Client中配置config.uri時使用的具體的地址厨诸,那么是否可以使用之前的Eureka呢禾酱?答案是肯定,我們可以把Config-Server和其它微服務一樣作為一個服務基本單元陷遮。我們只需要進行如下修改即可垦江。

4.1.1 Config-Server改造

在pom.xml中增加如下依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

在配置文件中配置我們服務的名稱绽族,及之前我們所編寫Eureka服務器的地址:

spring.application.name=config-server

eureka.client.service-url.defaultZone=http://localhost:8260/eureka

啟動類:

/**
 * TwoStepsFromJava Cloud -- Config Server
 *
 * @author CD826(CD826Dong@gmail.com)
 * @since 1.0.0
 */
@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class Application {

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

}

增加@EnableDiscoveryClient注解吧慢。

Ok检诗,到這里為止逢慌,Config-Server修改已經(jīng)完成涕癣。如果我們啟動Config-Server就會在Eureka服務器上看到相應的服務注冊坠韩。

4.1.2 Config-Client改造

在pom.xml中增加如下依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

配置文件修改只搁,注意這里的配置文件為:bootstrap.properties:

spring.application.name=mallWeb
spring.cloud.config.profile=dev

eureka.client.service-url.defaultZone=http://localhost:8260/eureka

spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=config-server

修改啟動類:

/**
 * TwoStepsFromJava Cloud -- Config Client Project
 *
 * @author CD826(CD826Dong@gmail.com)
 * @since 1.0.0
 */
@EnableDiscoveryClient
@SpringBootApplication
public class Application {

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

}

這樣就完成了從Eureka中獲取Config-Server的服務信息氢惋。

這里最重要的就是在配置中增加: spring.cloud.config.discovery.enabled=true,并將原來所配置的spring.cloud.config.uri熊赖,修改為spring.cloud.config.discovery.service-id虑椎。

4.2 快速失敗與響應

4.2.1 開啟Config-Server啟動加載

默認情況下,只有當客戶端請求時服務端才會從配置的Git倉庫中進行加載迎膜,我們可以通過設置clone-on-start磕仅,讓服務端在啟動時就會加載榕订。

spring.cloud.config.server.git.uri=https://git/common/config-repo.git

spring.cloud.config.server.git.repos.team-a.pattern=team-a-*
spring.cloud.config.server.git.repos.team-a.clone-on-start=true
spring.cloud.config.server.git.repos.team-a.uri=http://git/team-a/config-repo.git

spring.cloud.config.server.git.repos.team-b.pattern=team-b-*
spring.cloud.config.server.git.repos.team-b.clone-on-start=false
spring.cloud.config.server.git.repos.team-b.uri=http://git/team-b/config-repo.git

spring.cloud.config.server.git.repos.team-c.pattern=team-c-*
spring.cloud.config.server.git.repos.team-c.uri=http://git/team-a/config-repo.git

上面的配置,對于team-a的則在Config-Server啟動時就會加載相應的配置玩裙,而對于其它則不會吃溅。當然决侈,我們可以通過設置spring.cloud.config.server.git.clone-on-start的值來進行全局配置赖歌。

4.2.2 開啟Config-Client快速失敗

在一些情況下庐冯,我們希望啟動一個服務時無法連接到服務端能夠快速返回失敗展父,那么可以通過下面的配置來設置:

spring.cloud.config.fail-fast=true

4.2.3 設置Config-Client重試

如果在啟動時Config-Server碰巧不可以使用栖茉,你還想后面再進行重試吕漂,那么我們開始開啟Config-Client的重試機制痰娱。首先鲸睛,我們需要配置:

spring.cloud.config.fail-fast=true

然后坡贺,我們需要在我們的的依賴中增加:

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

這樣拳亿,我們就可以為Config-Client開啟了重試機制肺魁,當啟動連接Config-Server失敗時鹅经,Config-Client會繼續(xù)嘗試連接Config-Server,默認會嘗試連接6次蹦误,時間間隔初始為1000毫秒肉津,后面每次嘗試連接會按照1.1倍數(shù)增加嘗試連接時間的間隔妹沙,如果最后還不能夠連接到Config-Server才會返回錯誤涡真。我們可以通過在配置文件中復寫spring.cloud.config.retry.*來進行相關(guān)配置肾筐。

如果你想全權(quán)控制重試機制东亦,可以實現(xiàn)一個類型為:RetryOperationsInterceptor的類典阵,并把bean的id設置為:configServerRetryInterceptor嫉鲸。

4.3 動態(tài)刷新配置

Config-Client中提供了一個refresh端點來實現(xiàn)配置文件的刷新玄渗。要想使用該功能藤树,我們需要在Config-Client的pom.xml文件中增加以下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

這樣岁钓,當修改配置文件并提交到Git倉庫后,就可以使用:http://localhost:8080/refresh刷新本地的配置數(shù)據(jù)囚霸。

但是,最好的方式還是和Spring Cloud Bus進行整合瘸恼,這樣才能實現(xiàn)配置的自動分發(fā)东帅,而不是需要手工去刷新配置。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末球拦,一起剝皮案震驚了整個濱河市靠闭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坎炼,老刑警劉巖愧膀,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谣光,居然都是意外死亡檩淋,警方通過查閱死者的電腦和手機蟀悦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門涎拉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵穆趴,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任媳拴,我火速辦了婚禮抬探,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己烤咧,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布轩娶。 她就那樣靜靜地躺著许溅,像睡著了一般并蝗。 火紅的嫁衣襯著肌膚如雪键畴。 梳的紋絲不亂的頭發(fā)上盼产,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死蛇更,一個胖子當著我的面吹牛痹兜,可吹牛的內(nèi)容都是我干的遗淳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忘苛!你這毒婦竟也來了扮宠?” 一聲冷哼從身側(cè)響起庵楷,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脚线,沒想到半個月后粤铭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怯屉,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡咏瑟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绎狭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凯楔。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖矫废,靈堂內(nèi)的尸體忽然破棺而出柜去,到底是詐尸還是另有隱情郑象,我是刑警寧澤柜砾,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站岖研,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吱瘩。R本人自食惡果不足惜矢门,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一案训、第九天 我趴在偏房一處隱蔽的房頂上張望强霎。 院中可真熱鬧寞酿,春花似錦惨好、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绅络。三九已至,卻和暖如春嘁字,著一層夾襖步出監(jiān)牢的瞬間恩急,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工纪蜒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留衷恭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓纯续,卻偏偏與公主長得像随珠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子杆烁,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

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