1. 程式人生 > >SpringCloud入門(十): Config 統一配置中心

SpringCloud入門(十): Config 統一配置中心

SpringCloud Config 簡介

  在分散式系統中,由於服務元件過多,為了方便爭對不通的環境下的服務配置檔案統一管理,實時更新,所以出現了分散式配置中心元件。市面上開源的配置中心有很多,360的QConf、淘寶的diamond、百度的disconf都是解決這類問題。國外也有很多開源的配置中心Apache的Apache Commons Configuration等。SpringCloud中選用的是SpringCloud Config。

  SpringCloud Config分為Config Server和Config Client兩部分,為分散式系統外部化配置提供了支援。 由於Config Server和Config Client都實現了對Spring Environment和PropertySource抽象的對映,因此SpringCloud Config非常適合Spring應用程式,當然也可與其他語言應用程式配合使用。

   Config Server是一個可橫向擴充套件、集中式的配置伺服器,它用於集中管理應用程式各個環境下的配置(開發,測試,生產,灰度),預設使用Git儲存配置內容(也可使用Subversion、本地檔案系統或Vault儲存配置),因此可以方便的實現對配置的版本控制與內容審計。 Config Client 是Config Server的客戶端,用於操作儲存在Config Server中的配置屬性。

 

SpringCloud Config帶來的便利

1、集中管理配置,通過Config來對叢集中所有元件服務的配置資訊進行集中管理;

2、爭對不同的環境進行不同的配置(開發,聯調,測試,灰度,生產);

3、執行期間可動態調整,根據伺服器的負載情況動態的設定連線池資訊或者熔斷閾值;

4、配置修改後,不需要關閉服務可自動更新配置;

 

SpringCloud Config入門

1、申請一個自己的git倉庫,將測試專案得yml或properties檔案上傳至Git目錄;

2、構建Config Service

<!-- 1、引入Jar包 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

<!-- 2、配置屬性資訊 -->
server:
  port: 9005
spring:
  application:
    name: ms-cfg-service
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/******/springcloudconfig.git
          username: ******
          password: ******

<!-- 3、加註解@EnableConfigServer -->
@SpringBootApplication
@EnableConfigServer
public class ConfigServiceApplication {

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

備註:配置檔案有三種訪問方式,分別是:

1)通過application-{profiles}.yml來訪問,eg:http://localhost:8080/application-dev.yml

2)通過/application/{profiles}/{lable}來訪問, eg:http://localhost:8080/application/dev/master

3)通過/{lable}/application-{profiles}.yml來訪問,eg:http://localhost:8080/master/application-dev.yml

3、構建Config Client

<!-- 1. 引入Jar包 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

<!-- 2. 建立配置檔案bootstrap.yml -->
spring:
  application:
    name: application
  cloud:
    config:
      uri: http://localhost:8080/
      profile: dev  
      label: master    

備註: spring.application.name 對應訪問規則中的{application}

    spring.cloud.config.profile 對應訪問規則中的{profiles}

    spring.cloud.config.label 對應訪問規則中的{lable}

 

SpringCloud config的常規用法

我們定義一個openTest開關,來控制業務邏輯程式碼走新的邏輯分支還是走老的業務邏輯分支

方法一:

<!-- 1、在屬性檔案中定義一個變數 -->
ycdhz.openTest=dev

<!-- 2、在程式碼中通過@Value註解引用 -->
@Value("${ycdhz.openTest}")
private String openTest;

public void findInfo(){
    if(openTest.equal("dev")){
        System.out.print("開發環境")
    } else if (openTest.equal("test")){
        System.out.print("測試環境")
    } else {
        System.out.print("生產環境")
    }
}

<!-- 3、修改屬性檔案,重啟生效-->

方法二:

<!-- 1、再Client端工程,引入jar包 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>    

<!-- 2、再Client端工程,開啟refresh的監控端點 -->
management:
  endpoints:
    web:
      exposure:
        include: "*"   開啟所有的端點

<!-- 3、在讀取配置檔案中的類上加入@RefreshScope -->    
@RestController
@RequestMapping("/order")
@RefreshScope
public class OrderController {

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

<!-- 4、在git上修改openTest的配置檔案 -->    
通過Post請求,執行http://localhost:8001/actuator/refresh重新整理介面

備註:不在需要重啟,只需要通過Post執行重新整理方法即可。但是當需要在叢集中大面積修改的情況下依舊很繁瑣,需要對每一個服務進行重新整理。

方法三:

配置Config Client

<!-- 1、在client端工程,引入jar包 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

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

<!-- 2、在client端工程,配置屬性 -->
spring:
  application:
    name: application
  cloud:
    config:
      uri: http://localhost:9000/
      label: master
  rabbitmq:
    host: ****IP地址****
    port: ****埠號****
    virtual-host: ****host名****
    username: root
    password: root
    connection-timeout: 10000
    template:
      mandatory: true  
management:
  endpoints:
    web:
      exposure:
        include: "*"
  server:
    port: 8080

配置 config Service

<!-- 1、在Service端工程,引入jar包 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

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

<!-- 2、在Service端工程,配置屬性 -->
server:
  port: 9000
spring:
  application:
    name: ms-cfg-service
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/******/springcloudconfig.git
          username: ******
          password: ******
  rabbitmq:
    host: ****IP地址****
    port: ****埠號****
    virtual-host: ****host名****
    username: root
    password: root
    connection-timeout: 10000
    template:
      mandatory: true
      
<!-- 3、在Git上更新配置資訊,訪問bus-refresh重新整理服務配置 -->
訪問監控端點http://localhost:9000/actuator/bus-refresh重新整理所有服務的配置資訊

備註:使用訊息匯流排bus來實現,不再需要去爭對一個個服務元件做重新整理。原理如圖:

 

&n