1. 程式人生 > 其它 >微服務之配置中心Config

微服務之配置中心Config

一、什麼是配置中心?

  微服務意味著要將單體應用中的業務拆分成一個個子服務,這些服務都需要必要配置資訊才能執行,每個微服務都包含一個類似application.yml的配置檔案,單個管理顯得極其麻煩,於是集中式的管理思想誕生了,該思想旨在微服務模組之外提供一個集中化的外部配置支援平臺,為每個微服務提供配置支援,這個平臺稱為配置中心。

  SpringCloudConfig是SpringCloud整合的一種配置中心服務框架,分為客戶端和服務端兩部分。服務端叫分散式配置中心,它是一個獨立的微服務應用,用於連線配置伺服器並向客戶端提供配置資訊,伺服器預設採用git來儲存配置資訊。客戶端也就是其它的一個個微服務,它通過指定的服務端來管理應用資源,在啟動時從服務端獲取配置資訊。以下是配置中心架構圖

二、Config配置中心搭建

  搭建配置中心步驟:

    1、建立配置中心倉庫:按照配置中心架構圖分析,我們首先需要註冊一個git賬號,建立一個配置中心倉庫Repository,建立一個config-test.yml配置檔案,記錄下git倉庫地址。

    2、建立配置中心微服務模組步驟:

      a.服務模組引入config-server包

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

      b.配置application.yml檔案:程式碼示例如下,表示配置中心獲取配置資訊時從[email protected]:xxxx/springcloud-config.git/springcloud-config路徑下獲取,選擇分支為master分支。

server:
  port: 3344
spring:
 application:
   name:cloud-config-center   #註冊進Eureka伺服器的微服務名
cloud: config: server: git: uri: [email protected]:xxxx
/springcloud-config.git #GitHub上面的git倉庫地址 search-paths: - springcloud-config #搜尋目錄路徑 label: master #倉庫分支
eureka : client: service
-url: defaultzone: http://localhost:8099/eureka #註冊該模組到eureka註冊中心

      c.主啟動類上增加@EnableConfigServer註解啟用配置中心功能。

  完成以上3步,啟動時就可以通過配置中心去獲取git上的配置檔案了,在瀏覽器上訪問http://localhost:3344/master/config-test.yml即可獲取。配置中心將配置檔案以REST介面的形式暴露供客戶端使用,需要注意的是,官方提供了幾種獲取配置的規則(根據該規則,要求配置檔案的名稱應該按照規則格式來書寫),具體如下:

URL格式 說明

/{label}/{application}-{profile}.yml

label表示分支,application表示服務名稱,profile表示環境(test、prod、dev)

/{application}-{profile}.yml

application表示服務名稱,profile表示環境(test、prod、dev)

/{application}/{profile}[/{label}]

label表示分支(可選),application表示服務名稱,profile表示環境(test、prod、dev)

/{label}/{application}-{profile}.properties

label表示分支,application表示服務名稱,profile表示環境(test、prod、dev)

三、客戶端從配置中心獲取配置檔案

  前面講述瞭如何建立配置中心服務模組,以及配置中心從git獲取配置檔案的方式,接下來講解客戶端又是如何從配置中心獲取配置檔案的。

  配置中心服務模組引入的jar包是spring-cloud-config-server,而客戶端需要引入的是spring-cloud-starter-config。程式碼如下

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

  在進行客戶端配置檔案編輯之前,我們先了解一下bootstrap.yml配置檔案和application.yml檔案的區別。applocation.yml檔案時是使用者級別的資源配置檔案,而bootstrap.yml是系統級別的,優先順序更高,在載入時bootstrap要比application先載入。在springCloud啟東時會建立一個bootstrap上下文,作為spring應用Application上下文的父級,在初始化時Bootstrap上下文會從外部源載入配置屬性。因此在建立客戶端模組時我們先選擇使用bootstrap.yml檔案,建立和配置方式與application.yml一樣。

  以下是bootstrap.yml的示例程式碼:

server:
  port: 3355
spring:
 application:
   name:cloud-config-client   #註冊進Eureka伺服器的微服務名
 cloud:
   config:
     label: master           #分支名稱
     name: config            #配置檔名稱
     profile: dev            #讀取字尾名稱
     uri: //localhost:3344/  #配置中心地址
eureka :
  client:
    service-url:
     defaultzone: http://localhost:8099/eureka   #註冊該模組到eureka註冊中心

  進行如上配置之後,接下來建立一個從配置中心上獲取配置資訊的Controller,示例程式碼如下:

@RestController
public class ConfigClientController
{
   value("${config.info}")  /*讀取配置檔案資訊,系統會根據bootstrap配置檔案裡的config資訊從註冊中心獲取配置檔案資訊*/
   private string configInfo;

   GetMapping("/configInfo")
   public string getConfigInfo()
  {
    return configInfo;
  }
}

  完成以上步驟後,啟動配置中心和客戶端,訪問http://localhost:3355/configInfo,系統將會根據bootstrap配置資訊從註冊中心獲取git配置檔案。

四、分散式配置檔案動態重新整理

  完成前面的客戶端和配置中心模組開發後,在git倉庫中修改配置檔案的內容,分別訪問http://localhost:3344/master/config-test.yml 和http://localhost:3355/configInfo ,通過註冊中心3344訪問能夠及時的獲取到最新更改的內容,而通過客戶端3355返回的還是最初的內容,也就是說3355客戶端沒能獲取到最新的更改內容(除非重啟客戶端)。真實情況下,運維工程師可能會根據需求調整配置檔案內容,但每次調整都不可能要求重啟每一個客戶端模組,因此需要修改3355模組對配置檔案進行監控,實時重新整理最新檔案。

  客戶端實現實時重新整理的步驟:

  1、引入actuator監控工具包:

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

  2、修改yml暴露監控端點:

#暴露監控端點
management:
   endpoints:
web:
base-path:/actuator #actuator提供的api介面根路徑 exposure: include:
"*" #需要開放的端點,預設只打開health、info,*表示所有
exclude: #需要排除的端點

  3、在業務類Controller上增加@RefreshScope註解:

@RestController
@Refreshscope   
public class ConfigClientController
{
   value("${config.info}")  /*讀取配置檔案資訊,系統會根據bootstrap配置檔案裡的config資訊從註冊中心獲取配置檔案資訊*/
   private string configInfo;

   GetMapping("/configInfo")
   public string getConfigInfo()
  {
    return configInfo;
  }
}

  4、通知客戶端配置檔案需要重新整理:

    a.手動重新整理端點:傳送post請求到 http://localhost:3355/actuator/refresh 通知3355客戶端配置檔案已經改變,客戶端收到該請求後動態重新整理配置檔案。

    b.自動重新整理端點:結合git網路鉤子程式,在配置檔案修改後,git自動post訪問客戶端暴露的端點實現自動重新整理。或者結合訊息匯流排SpringCloudBus完成自動重新整理。

  到此,從客戶端到配置中心的配置檔案動態獲取功能已完成。