电竞比分网-中国电竞赛事及体育赛事平台

分享

Spring Cloud Config 分布式配置管理 5.3

 印度阿三17 2019-07-17

Spring?Cloud?Config簡(jiǎn)介

  在傳統(tǒng)的單體式應(yīng)用系統(tǒng)中,我們通常會(huì)將配置文件和代碼放在一起,但隨著系統(tǒng)越來(lái)越大,需要實(shí)現(xiàn)的功能越來(lái)越多時(shí),我們又不得不將系統(tǒng)升級(jí)為分布式系統(tǒng),同時(shí)也會(huì)將系統(tǒng)的功能進(jìn)行更加細(xì)化的拆分。拆分后,所有的服務(wù)應(yīng)用都會(huì)有自己的配置文件,當(dāng)需要修改某個(gè)服務(wù)的配置時(shí),我們可能需要修改很多處,并且為了某一項(xiàng)配置的修改,可能需要重啟這個(gè)服務(wù)相關(guān)的所有服務(wù),這顯然是非常麻煩的。
  在傳統(tǒng)的單體式應(yīng)用系統(tǒng)中,我們通常會(huì)將配置文件和代碼放在一起,但隨著系統(tǒng)越來(lái)越大,需要實(shí)現(xiàn)的功能越來(lái)越多時(shí),我們又不得不將系統(tǒng)升級(jí)為分布式系統(tǒng),同時(shí)也會(huì)將系統(tǒng)的功能進(jìn)行更加細(xì)化的拆分。拆分后,所有的服務(wù)應(yīng)用都會(huì)有自己的配置文件,當(dāng)需要修改某個(gè)服務(wù)的配置時(shí),我們可能需要修改很多處,并且為了某一項(xiàng)配置的修改,可能需要重啟這個(gè)服務(wù)相關(guān)的所有服務(wù),這顯然是非常麻煩的。
  Spring?Cloud?Config是Spring?Cloud團(tuán)隊(duì)創(chuàng)建的一個(gè)全新的項(xiàng)目,該項(xiàng)目主要用來(lái)為分布式系統(tǒng)中的外部配置提供服務(wù)器(Config?Server)和客戶端(Config?Client)支持。
  ·服務(wù)器端(Config?Server):也被稱之為分布式配置中心,它是一個(gè)獨(dú)立的微服務(wù)應(yīng)用,主要用于集中管理應(yīng)用程序各個(gè)環(huán)境下的配置,默認(rèn)使用Git存儲(chǔ)配置文件內(nèi)容,也可以使用SVN存儲(chǔ),或者是本地文件存儲(chǔ)。
  ·客戶端(Config?Client):是Config?Server的客戶端,即微服務(wù)架構(gòu)中的各個(gè)微服務(wù)應(yīng)用。它們通過(guò)指定的配置中心(Config?Server)來(lái)管理應(yīng)用資源以及與業(yè)務(wù)相關(guān)的配置內(nèi)容,并在啟動(dòng)時(shí)從配置中心獲取和加載配置信息。
  Spring?Cloud?Config的工作流程如圖5-17所示。

?



  在圖5-17中,用戶會(huì)先將配置文件推送到Git或SVN中,然后在微服務(wù)應(yīng)用(Config?Client)啟動(dòng)時(shí),會(huì)從配置中心(Config?Server)中獲取配置信息,而配置中心會(huì)根據(jù)配置從Git或SVN中獲取相應(yīng)的配置信息。

使用本地存儲(chǔ)的方式實(shí)現(xiàn)配置管理

  通過(guò)上一小節(jié)的學(xué)習(xí),我們已經(jīng)知道Spring?Cloud?Config支持本地、Git和SVN的存儲(chǔ)方式。接下來(lái)本小節(jié)將以本地存儲(chǔ)方式為例,講解Spring?Cloud?Config的使用。
  1.?搭建Config?Server
  (1)創(chuàng)建配置中心工程microservice-config-server,并在其pom.xml中引入Config?Server的依賴,如文件5-12所示。
  文件5-12 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven./POM/4.0.0" xmlns:xsi="http://www./2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven./POM/4.0.0 http://maven./xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.xc</groupId>
        <artifactId>xcservice-springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.xc</groupId>
    <artifactId>xcservice-config-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>xcservice-config-server</name>
    <description>配置管理</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency><!--Config Server的依賴-->
            <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>

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

</project>

?

  (2)編寫配置文件application.yml,添加服務(wù)端口號(hào)和存儲(chǔ)屬性等信息,如文件5-13所示。
  文件5-13 application.yml
server:
  port: 8888

spring:
  application:
    name: xcservice-config-server # 指定應(yīng)用名稱
  profiles:
    active: native # 使用本地文件系統(tǒng)的存儲(chǔ)方式來(lái)保存配置信息

?

 ?。?)在src/main/resources目錄下創(chuàng)建3個(gè)分別用于表示開(kāi)發(fā)、預(yù)發(fā)布和測(cè)試的資源配置文件,并在文件中編寫如下內(nèi)容。
  ·application-dev.yml中編寫內(nèi)容:clientParam:native-dev-1.0
  ·application-prod.yml中編寫內(nèi)容:clientParam:native-prod-1.0
  ·application-test.yml中編寫內(nèi)容:clientParam:native-test-1.0
  上述資源文件是按照“應(yīng)用名 環(huán)境名 格式”的規(guī)范來(lái)命名的,其常見(jiàn)文件的命名方式如下:
   
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

                  

  其中application表示的是應(yīng)用名稱,profile表示變化的文件,而label是可選的,表示Git的分支,默認(rèn)是master。

 ?。?)創(chuàng)建啟動(dòng)類,并在類上增加@EnableConfigServer注解以開(kāi)啟服務(wù)端功能,如文件5-14所示。
  文件5-14 Application.java
package com.xc.xcserviceconfigserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

/**
 * http://localhost:8888/microservice-config-server/dev
 * http://localhost:8888/application-dev.yml
 */
@EnableConfigServer
@SpringBootApplication
public class XcserviceConfigServerApplication {

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

}

?

 ?。?)啟動(dòng)工程,測(cè)試應(yīng)用。應(yīng)用啟動(dòng)成功后,按照如下格式的URL發(fā)起請(qǐng)求:
  http://localhost:8888/{applicationname}/{env}/{label}本應(yīng)用中的訪問(wèn)地址為http://localhost:8888/microservice-config-server/dev,瀏覽器中的JSON信息顯示出了應(yīng)用名microservice-config-server、環(huán)境名dev,以及資源文件路徑和文件內(nèi)容等信息。
  除此之外,我們也可以直接訪問(wèn)資源文件,來(lái)查看資源文件內(nèi)的配置信息。通過(guò)瀏覽器訪問(wèn)地址http://localhost:8888/ap-plication-dev.yml

  2.?搭建Config?Client
 ?。?)創(chuàng)建客戶端工程microservice-config-client,并在其pom.xml中添加Config和Web的依賴,如文件5-15所示。
  文件5-15 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven./POM/4.0.0" xmlns:xsi="http://www./2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven./POM/4.0.0 http://maven./xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.xc</groupId>
        <artifactId>xcservice-springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.xc</groupId>
    <artifactId>xcservice-config-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>xcservice-config-client</name>
    <description>Config Client</description>

    <properties>
        <java.version>1.8</java.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>

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

</project>

?

 ?。?)編寫配置文件bootstrap.yml,在其中配置應(yīng)用名稱、服務(wù)中心地址、需要訪問(wèn)的文件和端口號(hào)等信息,如文件5-16所示。
  文件5-16 bootstrap.yml
server:
  port: 8801

spring:
  application:
    name: xcservice-config-client
  cloud:
    config:
      profile: test # 配置服務(wù)中的{profile}
      uri: http://localhost:8888/  # 配置中心的地址

  需要注意的是,上述配置文件的名稱必須為bootstrap.yml或bootstrap.properties,只有這樣配置中心才能夠正常加載(雖然application.yml也可以被Spring?Boot加載,但是boot-strap.yml會(huì)優(yōu)先加載)。

  (3)創(chuàng)建啟動(dòng)類,并在類上添加@RestController注解,編輯后如文件5-17所示。
  文件5-17 Application.java
package com.xc.xcserviceconfigclient;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * http://localhost:8801/client-Param
 */
@SpringBootApplication
@RestController
public class XcserviceConfigClientApplication {

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

    @RequestMapping("/clientParam")
    public String getParam() {
        return this.clientParam;
    }

    /**
     * http://localhost:8801/hello
     *
     * @return
     */
    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }

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

}

?

 ?。?)啟動(dòng)工程,測(cè)試應(yīng)用。應(yīng)用啟動(dòng)成功后,可以通過(guò)地址http://localhost:8801/hello測(cè)試應(yīng)用是否能夠正常訪問(wèn)
  此時(shí)通過(guò)瀏覽器訪問(wèn)地址http://localhost:8801/clientParam,即可獲取配置文件中的信息
  當(dāng)我們需要訪問(wèn)其他配置文件的信息時(shí),只需修改bootstrap.yml中的profile的屬性值即可。

使用Git存儲(chǔ)的方式實(shí)現(xiàn)配置管理

  Spring?Cloud?Config的服務(wù)端默認(rèn)采用的是Git配置倉(cāng)庫(kù),通過(guò)Git可以非常方便地使用各種第三方工具來(lái)對(duì)其內(nèi)容進(jìn)行更新管理和版本控制,并且Git倉(cāng)庫(kù)的Webhooks功能還可以實(shí)時(shí)地監(jiān)控配置內(nèi)容的修改,所以使用Git存儲(chǔ)的方式是十分方便的。
  掌握了本地存儲(chǔ)方式的使用后,Git存儲(chǔ)方式的使用就很容易掌握了。下面我們同樣以上一小節(jié)的案例為例,來(lái)講解如何通過(guò)Spring?Cloud?Config的客戶端從服務(wù)端獲取Git倉(cāng)庫(kù)中不同版本配置信息。
 ?。?)配置Git。在Git上創(chuàng)建xcservice-study-config目錄,并在目錄中增加開(kāi)發(fā)、預(yù)發(fā)布和測(cè)試的配置文件,分別編輯三個(gè)文件中的內(nèi)容如下:
  ·application-dev.yml中編寫內(nèi)容:clientParam:git-dev-1.0
  ·application-prod.yml中編寫內(nèi)容:clientParam:git-prod-1.0
  ·application-test.yml中編寫內(nèi)容:clientParam:git-test-1.0
 ?。?)修改服務(wù)端配置文件。將xcservice-config-server工程的配置文件中本地文件存儲(chǔ)方式的配置刪除(或注釋),并添加git的配置信息,如文件5-18所示。
  文件5-18 application.yml
server:
  port: 8888

spring:
  application:
    name: xcservice-config-server # 指定應(yīng)用名稱
  #profiles:
  #  active: native # 使用本地文件系統(tǒng)的存儲(chǔ)方式來(lái)保存配置信息
  cloud:
    config:
      server:
        git: # 使用git的方式
          uri: https:///secret8/microservice-study-config.git

?

  在上述配置中,spring.cloud.config.server.git.uri屬性用來(lái)指定Git倉(cāng)庫(kù)的網(wǎng)絡(luò)地址。由于這里配置的是公共倉(cāng)庫(kù),所以不需要填寫用戶名和密碼信息。如果是私有倉(cāng)庫(kù),則需要填寫賬號(hào)信息,此時(shí)可以在git屬性下增加username和password屬性。
 ?。?)修改客戶端配置文件。在xcservice-config-client工程的配置文件中添加屬性label,并將其屬性值設(shè)置為mas-ter(label屬性表示Git中的分支,其屬性默認(rèn)值為master),編輯后如文件5-19所示。
文件5-19 bootstrap.yml
server:
  port: 8801

spring:
  application:
    name: xcservice-config-client
  cloud:
    config:
      profile: test # 配置服務(wù)中的{profile}
      label: master # 對(duì)應(yīng)git中的分支,默認(rèn)為master
      uri: http://localhost:8888/  # 配置中心的地址的地址

?

 ?。?)啟動(dòng)工程,測(cè)試應(yīng)用。分別啟動(dòng)Spring?Cloud?Config的服務(wù)端和客戶端工程,通過(guò)訪問(wèn)地址http://localhost:8801/clientParam,發(fā)現(xiàn)已經(jīng)可以獲取Git中的配置信息了

手動(dòng)更新運(yùn)行中的配置文件

  在實(shí)際項(xiàng)目應(yīng)用中,我們可能需要對(duì)配置文件的內(nèi)容做一些修改,而要想使修改的配置文件生效,通常做法是將應(yīng)用重啟。此種方式對(duì)于小型應(yīng)用,以及使用人數(shù)不多的應(yīng)用來(lái)說(shuō)比較適用,但是對(duì)于大型企業(yè)和互聯(lián)網(wǎng)應(yīng)用來(lái)說(shuō),重啟應(yīng)用是行不通的。這也就要求運(yùn)維人員在修改完應(yīng)用的配置后,要保證配置及時(shí)生效。Spring?Cloud?Config正好提供了這種功能,我們可以在客戶端用POST請(qǐng)求refresh方法來(lái)刷新配置內(nèi)容。
以上一小節(jié)的案例為例,要實(shí)現(xiàn)配置文件的實(shí)時(shí)更新,需要執(zhí)行以下幾步。
 ?。?)在客戶端的pom.xml中添加依賴spring-boot-starter-actuator。該依賴可以監(jiān)控程序在運(yùn)行時(shí)的狀態(tài),其中包括/refresh的功能。pom.xml中添加的依賴信息如下:
<dependency><!--監(jiān)控程序在運(yùn)行時(shí)的狀態(tài)-->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

?

 ?。?)在啟動(dòng)類上添加@RefreshScope注解,開(kāi)啟refresh機(jī)制。添加此注解后,在執(zhí)行/refresh時(shí)會(huì)更新該注解標(biāo)注類下的所有變量值,包括Config?Client從Git倉(cāng)庫(kù)中所獲取的配置。
 ?。?)在配置文件中將安全認(rèn)證信息的enabled屬性設(shè)置為false,其代碼如下:
management:
  security:
    enabled: false # 是否開(kāi)啟actuator安全認(rèn)證

?

  執(zhí)行完上述3步后,下面來(lái)檢測(cè)應(yīng)用是否可以實(shí)現(xiàn)更新運(yùn)行中的配置文件。啟動(dòng)應(yīng)用并訪問(wèn)http://localhost:8801/clientParam
  此時(shí)修改Git中的配置文件application-prod.yml,將其內(nèi)容clientParam:git-prod-1.0,修改為clientParam:git-prod-2.0后,再次通過(guò)瀏覽器訪問(wèn)上述地址,會(huì)發(fā)現(xiàn)瀏覽器的內(nèi)容并沒(méi)有變化,但通過(guò)地址  http://localhost:8888/application/prod訪問(wèn)時(shí),會(huì)發(fā)現(xiàn)服務(wù)器端已經(jīng)獲取到了Git中的更新配置信息
  使用POST請(qǐng)求訪問(wèn)地址http://localhost:8801/refresh后,此時(shí)再次通過(guò)瀏覽器訪問(wèn)http://localhost:8801/clientParam時(shí),瀏覽器中已成功顯示了更新后的配置文件內(nèi)容,這也就說(shuō)明我們已成功實(shí)現(xiàn)了手動(dòng)更新運(yùn)行中的配置文件。? ?來(lái)源:https://www./content-4-337051.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多