1. 程式人生 > >SpringCloud分散式配置中心淺談

SpringCloud分散式配置中心淺談

一、什麼是分散式配置中心?

Spring Cloud Config為服務端和客戶端提供了分散式系統的外部化配置支援。配置伺服器為各應用的所有環境提供了一箇中心化的外部配置。它實現了對服務端和客戶端對Spring Environment和PropertySource抽象的對映,所以它除了適用於Spring構建的應用程式,也可以在任何其他語言執行的應用程式中使用。作為一個應用可以通過部署管道來進行測試或者投入生產,我們可以分別為這些環境建立配置,並且在需要遷移環境的時候獲取對應環境的配置來執行。

二、使用配置中心的好處

當我們系統業務擴充套件到一定程度的時候;免不了會增加很多的配置檔案和資訊,例如證書檔案、介面對接的引數資訊、資料庫連線資訊等;傳統的單體式架構系統,SSH、SSM還是Struts等,只能是一個檔案一個檔案的增加堆積到專案系統中。每次更改配置資訊的時候,都要重啟伺服器,影響線上業務浪費時間等。當配置檔案數量達到一定程度的時候,整個專案就會看起來非常臃腫冗餘,更甚者可能會拿錯配置資訊導致程式崩潰等。那麼,這時候分散式系統採用的配置中心的優勢就突出出來了。由業務拆分的多個模組系統的各配置檔案,全部配置在配置中心統一管理;與程式分離,做到動態配置獲取配置資訊。無需重啟伺服器即可動態重新整理載入配置資訊。

GitLab的使用見另一篇文章:GitLab的使用和優勢

三、SrpingCloudConfig基本配置原理

  • git 上存放我們的遠端配置檔案 
  • config-server 連線到 git 
  • config-client 連線到config-server 
  • 當我們啟動config-client 服務的時候,client 會通過連線的 config-server 拿到遠端git 上面的配置檔案,然後通過 Spring 載入到物件中

1、搭建Config Server註冊中心

pom.xml依賴

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

建立Spring Boot的程式主類,並新增@EnableConfigServer註解,開啟Config Server

@EnableConfigServer
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }
}

application.properties中配置服務資訊以及git資訊;由於開發完成後,Config Server的svn許可權以及配置資訊等,都已做了限制許可權,沒法查閱。

簡單介紹下:

# gitLab管理配置,倉庫位置,連線資訊,url等
# gitLab使用者名稱
# gitLab密碼

配置倉庫中,根據不同環境新建了下面四個配置檔案:

  • didispace.properties
  • didispace-dev.properties
  • didispace-test.properties
  • didispace-prod.properties

同時建立一個config-label-test分支,並將各配置檔案中的值用2.0作為字尾

URL與配置檔案的對映關係如下:

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

搭建好config Server後,就把服務註冊到Eureka;經過zuul進行路由轉發,以供各個服務模組可以呼叫。

Zuul的原理和使用介紹見另一篇文章:SpringCloud的路由閘道器Zuul簡單使用介紹

2、客戶端config Client呼叫服務端Server獲取配置

整個系統只能有一個Config Server服務中心,其他模組只能作為客戶端config Client註冊到Eureka中,然後讀取服務中心的配置資訊。(SpringCloud的生態決定,不能有多個服務中心)

pom.xml依賴

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

建立bootstrap.properties配置,來指定config server

#bootstrap.properties的載入也是先於application.properties

#bootstrap.properties配置,來指定config server

#對應前配置檔案中的{application}部分
spring.application.name=didispace
#對應前配置檔案中的{profile}部分
spring.cloud.config.profile=test
#對應前配置檔案的git分支
spring.cloud.config.label=config-label-test
#配置中心的地址
spring.cloud.config.uri=http://localhost:7001/
#spring boot port
server.port=7002
  • spring.application.name:對應前配置檔案中的{application}部分
  • spring.cloud.config.profile:對應前配置檔案中的{profile}部分
  • spring.cloud.config.label:對應前配置檔案的git分支
  • spring.cloud.config.uri:配置中心的地址

上面這些屬性必須配置在bootstrap.properties中,config部分內容才能被正確載入。因為config的相關配置會先於application.properties,而bootstrap.properties的載入也是先於application.properties

 

建立最基本的Spring Boot啟動主類

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }
}

 

config-client 工程中新增依賴監控模組,其中包含了/refresh重新整理API

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

在需要自動更新配置變數的Java類上,使用註解 @RefreshScope 修飾  

 

 以後當我們再更新git上面的配置檔案後,在 config-client 端執行POST 請求 http://localhost:8080/refresh 就可以更新重新整理配置變數到記憶體中了。

 

這樣就做到,配置一個Config Server註冊中心,在Gitlab下配置各模組和對應環境的配置資訊;Confid Client通過Eureka經由Zuul閘道器路由讀取到對應的配置;達到動態分散式配置中心讀取的效果。

 

關注個人技術公眾號:nick_coding1024

不定期分享最新前沿技術框架和bat大廠常用技術等,加群不定期分享行業內大牛直播講課以及獲得內退一線網際網路公司機會。