二: 分布式配置中心(Spring Cloud Config)

2.1、簡介

在分布式系統(tǒng)中觉至,由于服務(wù)數(shù)量巨多,為了方便服務(wù)配置文件統(tǒng)一管理睡腿,實時更新语御,所以需要分布式配置中心組件。在Spring Cloud中席怪,有分布式配置中心組件Spring Cloud Config 应闯,它支持配置服務(wù)放在配置服務(wù)的內(nèi)存中,也支持放在遠程Git倉庫中挂捻。在Spring Cloud Config 組件中碉纺,分兩個角色,一是config server细层,二是config client惜辑。

2.2、構(gòu)建Config Server

創(chuàng)建一個叫congfig-server的Spring Boot項目疫赎,引入相關(guān)maven包盛撑。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.voyer</groupId>
    <artifactId>config-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>config-server</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.M9</spring-cloud.version>
    </properties>

    <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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>aliyun-maven</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>


</project>

在pom.xml中增加阿里云maven庫,可以提高下載速度捧搞。

        <repository>
            <id>aliyun-maven</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </repository>

在默認的啟動程序上增加congfigservier注解@EnableConfigServer

@SpringBootApplication
@EnableConfigServer
@RestController
public class ConfigServerApplication {

    @RequestMapping("/")
    public String home() {
        return "Hello World!";
    }
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

接下來要在配置文件里配置一下git相關(guān)信息

spring.application.name=config-server
server.port=8888
spring.cloud.config.server.default-application-name=config-server

# 配置git倉庫地址
spring.cloud.config.server.git.uri=https://gitee.com/voyer/config-repo
# 配置倉庫路徑抵卫,多個路徑用逗號分隔
#spring.cloud.config.server.git.search-paths=aliyun
# 配置倉庫的分支
spring.cloud.config.label=master
# 如果Git倉庫為公開倉庫,可以不填寫用戶名和密碼胎撇,如果是私有倉庫需要填寫
# 訪問git倉庫的用戶名
#spring.cloud.config.server.git.username=xxxxoooo
# 訪問git倉庫的用戶密碼 
#spring.cloud.config.server.git.password=xxxxoooo

當然介粘,config也支持配置多個Repositories,也可以通過匹配相關(guān)格式來獲取配置信息晚树,多個匹配格式用逗號分隔姻采,例如:(可以參考官方文檔)。

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          repos:
            simple: https://github.com/simple/config-repo
            special:
              pattern: special*/dev*,*special*/dev*
              uri: https://github.com/special/config-repo
            local:
              pattern: local*
              uri: file:/home/configsvc/config-repo

遠程倉庫中有幾個文件


啟動程序訪問http://localhost:8080/test/dev返回結(jié)果:

{"name":"test","profiles":["dev"],"label":null,"version":"74cdd22f87198215007e8edf138eb59954b66778","state":null,"propertySources":[]}

證明config server可以從遠程git倉庫獲取配置信息爵憎。

http請求地址和資源文件映射關(guān)系如下:

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

2.3慨亲、構(gòu)建一個config client

創(chuàng)建一個叫congfig-client的Spring Boot項目,引入相關(guān)maven包宝鼓。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.voyer</groupId>
    <artifactId>config-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>config-client</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.M9</spring-cloud.version>
    </properties>

    <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>

        <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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>


</project>

注意此處需要引入spring-boot-starter-web刑棵,否則會無法啟動(但是可以編譯通過),接下來要引入配置文件application.properties

spring.application.name=config-client
#指明遠程倉庫的分支
spring.cloud.config.label=master
#配置文件環(huán)境
spring.cloud.config.profile=dev
# 指明配置服務(wù)中心的網(wǎng)址愚铡。
spring.cloud.config.uri=http://localhost:8888/
server.port=8889
# 總結(jié)一下,config-client項目啟動報錯,獲取不到配置文件里的值:
# 1蛉签、首先確定項目config-client與config-service的spring-boot,spring-cloud的依賴版本要一致
# 2、配置文件命名,要遵循一定規(guī)則,如果項目config-client里命名為config-client,那配置文件就應(yīng)該是config-client-**.properties

在程序啟動入口增加獲取config server配置信息的代碼:

@SpringBootApplication
@RestController
public class ConfigClientApplication {
    @Value("${test}")
    String test;
    @RequestMapping(value = "hi")
    public String hi(){
        return test;
    }
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }
}

注意此處的spring.application.name=config-client,當啟動程序時碍舍,會看到控制臺打印的日志:

2018-04-04 16:21:14.904  INFO 32036 --- [           main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://localhost:8888
2018-04-04 16:21:15.795  INFO 32036 --- [           main] c.c.c.ConfigServicePropertySourceLocator : Located environment: name=config-client, profiles=[dev], label=master, version=74cdd22f87198215007e8edf138eb59954b66778, state=null
2018-04-04 16:21:15.796  INFO 32036 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='configService', propertySources=[MapPropertySource {name='configClient'}, MapPropertySource {name='https://gitee.com/voyer/config-repo/config-client-dev.yml'}, MapPropertySource {name='https://gitee.com/voyer/config-repo/config-client.yml'}]}

可以看到加載了兩個配置文件https://gitee.com/voyer/config-repo/config-client-dev.yml柠座、https://gitee.com/voyer/config-repo/config-client.yml,訪問http://localhost:8889/hi,會看到返回信息:

bbb

唔乒验,此處筆者遠程git倉庫的test值為bbb愚隧,各位讀者可以自己定義。
這就說明锻全,config-client從config-server獲取了test的屬性狂塘,而config-server是從git倉庫讀取的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鳄厌,一起剝皮案震驚了整個濱河市荞胡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌了嚎,老刑警劉巖泪漂,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異歪泳,居然都是意外死亡萝勤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門呐伞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敌卓,“玉大人,你說我怎么就攤上這事伶氢√司叮” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵癣防,是天一觀的道長蜗巧。 經(jīng)常有香客問我,道長蕾盯,這世上最難降的妖魔是什么幕屹? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮级遭,結(jié)果婚禮上香嗓,老公的妹妹穿的比我還像新娘。我一直安慰自己装畅,他們只是感情好,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布沧烈。 她就那樣靜靜地躺著掠兄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚂夕,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天迅诬,我揣著相機與錄音,去河邊找鬼婿牍。 笑死侈贷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的等脂。 我是一名探鬼主播俏蛮,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼上遥!你這毒婦竟也來了搏屑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤粉楚,失蹤者是張志新(化名)和其女友劉穎辣恋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體模软,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡伟骨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了燃异。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片携狭。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖特铝,靈堂內(nèi)的尸體忽然破棺而出暑中,到底是詐尸還是另有隱情,我是刑警寧澤鲫剿,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布鳄逾,位于F島的核電站,受9級特大地震影響灵莲,放射性物質(zhì)發(fā)生泄漏雕凹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一政冻、第九天 我趴在偏房一處隱蔽的房頂上張望枚抵。 院中可真熱鬧,春花似錦明场、人聲如沸汽摹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逼泣。三九已至趴泌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拉庶,已是汗流浹背嗜憔。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留氏仗,地道東北人吉捶。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像皆尔,于是被迫代替她去往敵國和親呐舔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

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