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上,則已經實現高可用