1. 程式人生 > >spring cloud學習筆記(6)--spring cloud config

spring cloud學習筆記(6)--spring cloud config

config配置中心介紹

為什麼需要配置中心?
1、集中管理配置
2、不同環境不同配置
3、執行期間動態調整配置
4、自動重新整理
Spring Cloud Config為分散式系統外部化配置提供了伺服器端和客戶端的支援,它包括Config Server和Config Client兩部分Config Server是一個可橫向擴充套件、集中式的配置伺服器,它用於集中管理應用程式各個環境下的配置,預設使用Git儲存配置內容(也可使用Subversion、本地檔案系統或Vault儲存配置),因此可以方便的實現對配置的版本控制與內容審計。Config Client 是Config Server的客戶端,用於操作儲存在Config Server中的配置屬性。

使用config實現配置中心服務端及客戶端

首先新增git配置倉庫中心,地址為:https://gitee.com/cymdengdai/spring-cloud-config-test.git
在倉庫裡增加如下配置檔案:

編寫config配置中心服務端(使用git倉庫儲存)

1.新增依賴,並在啟動類上增加註解@EnableConfigServer

 在啟動類上增加註解@EnableConfigServer

配置檔案application.yml如下:

啟動專案,訪問地址:http://localhost:8080/ms-config/dev,得到整個專案的配置資訊,這樣子config的服務端就配置成功了。

配置檔案對映規則如下:

以上端點都可以對映到{application}-{profile}.properties這個配置檔案,{application}表示微服務的名稱,{label}對應Git倉庫的分支,預設是 master

如:http://localhost:8080/ms-config/test 中的ms-config對應著git倉庫中ms-config-test.properties中的ms-config

編寫config配置中心客戶端

新增依賴

除了預設的application.yml配置檔案,還需增加一個bootstrap.yml的配置檔案,內容如下:

spring cloud有一個“引導上下文"的概念,這是主應用程式的父上下文。引導上下文負責從配置伺服器載入配置屬性,以及解密外部配置檔案中的屬性。和主應用程式載入application.*(yml或 properties)中的屬性不同,引導上下文載入(bootstrap.*)中的屬性。配置在 bootstrap.*中的屬性有更高的優先順序,因此預設情況下它們不能被本地配置覆蓋。

啟動專案,訪問地址:http://localhost:8081/person/1 ,看能不能得到git倉庫中配置的資料庫連線從而訪問資料庫

http://localhost:8081/person/2

說明我們資料庫連線資訊可以從git遠端倉庫那裡獲取到,客戶端配置成功。

config配置中心服務端配置詳解

  • git地址佔位符

  • 子目錄查詢search-path

配置資訊的加解密安全處理

前文是在 Git倉庫中明文儲存配置屬性的。很多場景下,對於某些敏感的配置內容(例如資料庫賬號、密碼等),應當加密儲存。 config server為配置內容的加密與解密提供了支援。

安裝JCE

config server的加解密功能依賴Java Cryptography Extension(JCE)Java8 JCE下載地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html下載JCE並解壓,將其中的jar包覆蓋到JDK/jre/lib/security目錄中

對稱加密
config server提供了加密與解密的介面,分別是/encrypt與/decrypt

引入依賴:

增加一個配置檔案bootstrap.yml,配置對稱加密的金鑰

執行專案,驗證加解密
加密:curl http://localhost:8080/encrypt -d 123456 (這需要用post方式請求,get方式不支援)
解密:curl http://localhost:8080/decrypt -d  4f2b3101566738068779f2ea1eff1a5f41ed0896116425c7e09a8dae2e351aac

在git倉庫增加配置檔案ms-config-dev.properties,內容如下:

我們通過訪問http://localhost:8080/ms-config/dev  能夠得到明文

但是在config server儲存的檔案我們可以發現適合我們git是一樣的。

說明 config server能自動解密配置內容。一些場景下,想要讓 config server直接返回密文字身,而並非解密後的內容,可設定
spring.cloud.config.server.encrypt.enabled=false,這時可由 ConfigCIient自行解密。

配置資訊手動重新整理

很多場景下,需要在執行期間動態調整配置。如果配置發生了修改,微服務要如何實現配置的重新整理呢?

新增依賴如下,其中spring-boot-starter-actuator提供了/refresh端點,用於配置的重新整理(在客戶端新增)

在Controller上添加註解@RefreshScope,新增這個註解的類會在配置更改時得到特殊的處理

 

1、 啟動專案(啟動兩個,一個埠8081,一個埠8082),

訪問地址:

http://localhost:8081/profile,得到結果: today study spring cloud congfig,

訪問地址:
http://localhost:8082/profile,得到結果: today study spring cloud congfig

2、修改git倉庫裡的配置檔案ms-config-dev.properties的內容為:

3、再次訪問地址:http://localhost:8081/profile,得到結果還是 today study spring cloud congfig,說明配置尚未重新整理
4、傳送post請求:http://localhost:8081/refresh,返回結果:"profile",表示profile這個配置屬性已被重新整理(同樣是需要post方式是請求的)注意,這裡還需要把安全認證給關閉了,要不然許可權訪問。


5、再次訪問 http://localhost:8081/profile,得到結果: today study spring cloud congfig 123456678,說明屬性已重新整理
6、再次訪問 http://localhost:8082/profile,得到結果: dev-1.0,說明8082的服務並沒有重新整理,還需再次手動重新整理才能更新配置

配置資訊自動重新整理

前文討論了使用/refresh端點手動重新整理配置,但如果所有微服務節點的配置都需要手動去重新整理,工作量可想而知。不僅如此,隨著系統的不斷擴張,會越來越難以維護。因此,實現配置的自動重新整理是很有必要的,Spring Cloud Bus就可以實現配置的自動重新整理。Spring Cloud Bus使用輕量級的訊息代理(例如 RabbitMQ、 Kafka等)連線分散式系統的節點,這樣就可以廣播傳播狀態的更改(例如配置的更新)或者其他的管理指令。可將Spring Cloud Bus想象成一個分散式的Spring Boot Actuator。

服務端例項

新增依賴

配置檔案增加rabbitmq的配置:

server:
  port: 8080
management:
  security:
    enabled: false  #關掉安全認證
spring:
  application:
    name: microservice-config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/cymdengdai/spring-cloud-config-test.git     # 配置Git倉庫的地址
          username:                                                         # Git倉庫的賬號
          password:                                                         # Git倉庫的密碼
    bus:
      trace:
        enabled: true     # 開啟cloud bus的跟蹤
  rabbitmq:
    host: localhost
    port: 15672
    username: guest
    password: guest


客戶端示例

新增依賴

 配置檔案增加rabbitmq的配置:

spring:
  application:
    name: ms-config    # 對應config server所獲取的配置檔案的{application}
  cloud:
    config:
      uri: http://localhost:8080/
      profile: dev            # profile對應config server所獲取的配置檔案中的{profile} 
      label: master           # 指定Git倉庫的分支,對應config server所獲取的配置檔案的{label}
  rabbitmq:
    host: localhost
    port: 15672
    username: guest
    password: guest

注意我們還要啟動本地的RabbitMQ的服務(在這就不說了,可以參考一下我springboot的學習,裡面有安裝教程)

執行專案(執行一個config server和兩個config client)

訊息佇列中已經有了這三個微服務了,那我們修改git倉庫裡的配置檔案,然後用post方式請求地址:http://localhost:8080/bus/refresh,如果返回成功,則config的所有客戶端的配置都會動態重新整理。

config的安全認證

config服務端:
新增依賴:

application.yml配置如下:

server:
  port: 8080
management:
  security:
    enabled: false  #關掉安全認證
spring:
  application:
    name: microservice-config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/cymdengdai/spring-cloud-config-test.git     # 配置Git倉庫的地址
          username:                                                         # Git倉庫的賬號
          password:                                                         # Git倉庫的密碼
    bus:
      trace:
        enabled: true     # 開啟cloud bus的跟蹤
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

security:
  basic:
    enabled: true               # 開啟基於HTTP basic的認證
  user:
    name: root                  # 配置登入的賬號是user
    password: root       # 配置登入的密碼是password

config客戶端:
在配置檔案裡bootstrap.yml裡增加如下配置:

啟動服務端,這個時候我們想要直接訪問git倉庫中檔案就需要先驗證了。如下:

config配置中心的高可用

1、config server未註冊到eureka上的情況,通過負載均衡器來實現

2、config server註冊到eureka上的情況,client端也註冊到eureka上,則已經實現高可用