如下部分純屬我的理解,可是結果都是通過demo驗證。git
1、spring cloud config介紹github
spring cloud是spring家族中的一個微服務工具包,其中包含了不少微服務的工具。偏向於與spring boot相似的配置方式,有許多許多默認配置。spring cloud config是其中的一個工具包,用於配置的拉取更新。spring
舉一個小小的例子,當咱們程序中有一個配置文件須要修改,可是服務已經啓動,配置文件中的配置已經讀取到內存中,爲了修改配置,咱們須要重啓服務;若是是一臺或者幾臺機器重啓,還算容易,可是若是是一個集羣,重啓就變成一個很是耗時的工做;若是咱們使用spring cloud config,就能夠在服務運行時,拉取git(svn等,下面以git爲例)的配置,修改內存中的配置。app
2、spring cloud config邏輯介紹svn
config-server:提供對git的鏈接,配置拉取,這裏的拉取是被動拉取。微服務
config-client:鏈接config-server,經過URI請求對應的配置文件,獲取配置屬性工具
如圖表示client從server拉取配置的過程:測試
一、client根據配置向server發送配置請求url
二、server根據配置從git拉取全部文件(git clone的過程)spa
三、git將整個倉庫下發
四、server解析client的URI請求,返回相應的配置屬性或者錯誤信息(不存在相應的配置屬性)
如圖表示client發送刷新配置請求的過程:
一、client向server發送refresh請求
二、server向從git更新本地配置(git pull)
三、git下發更新
四、server對比更新,發現client須要的配置有更新時,會將更新信息發給client
理解:一、在client第一次向server發送URI請求時,server會根據配置的git地址,拉取對應倉庫的全部文件(與git clone@{git adress})(在config-server本地/tmp目錄下能夠找到git本地倉庫);
二、值得注意的是,在client發送刷新配置請求(refresh)時,server會根據本地倉庫的狀況處理:
(1)若是server本地倉庫有未提交的commit和未commit的修改時,server就不會從git上拉取更新(不會git pull),只會將本地倉庫中對應的配置屬性傳給client;
(2)若是server本地倉庫沒有任何修改和commit,server會從git上拉取更新(git pull),而後將本地倉庫對應的配置屬性傳給client。
三、還有一個坑點,我在demo測試過程當中發現,若是git倉庫過大,拉取過程很長,在server拉取的時候會出錯(有一個最大等待時長,超過會出現超時錯誤)。爲了實現大的二進制文件的正常拉取,能夠切到本地倉庫地址,手動拉取一次更新。
(1)在建立本地倉庫時就採用手動拉取的方式:在配置文件application.properties中,設置git的url地址爲本地文件地址,初始化時,手動git clone遠程倉庫地址到設置的本地文件地址。在更新配置的時候,config-server也會自動從遠程拉取更新。
(2)若是是更新的時候有大文件的修改致使不能拉取更新:application.properties配置文件中git的url爲遠程倉庫地址,初始化時可以自動拉取,若是有大文件更新,利用git工具,手動切到本地/tmp目錄下,利用git命令手動拉取更新就能夠拉取大文件的更新,在以後的小文件更新中,config-server就可以正常自動更新。
總之就是,client向server發送一個URI請求:「我要**屬性,你那裏有嗎?」,而後server根據自身的配置,拉取git倉庫,而後去找client須要的那個屬性,而後告訴client:「我這裏有(沒有)這個屬性,(有就給client)」;刷新過程就是,client向server發送一個URI請求:「我請求的屬性值變了嗎?」,而後server處理以後,回覆client:「變了,這是新的值。(沒變)」。
3、配置文件介紹
一、client配置文件以下:
spring.application.name = test 1 spring.cloud.config.lable = master 2 spring.cloud.config.profile = dev 3 spring.cloud.config.uri = http://localhost:8881/ 4
解釋:1和3組成了訪問的配置文件名,如test-dev.properties
2決定了git的分支,此處爲master分支
4表示config-server的地址
請求的URI就是由這個配置決定的,網上關於這點的說明不少,此處再也不贅述
二、server配置文件以下:
spring.cloud.config.server.git.uri = https://github.com/lucknot/songxh_scse/ 1 spring.cloud.config.server.git.searchPaths = test 2
解釋:1表示git倉庫的地址,這裏是個人github倉庫地址(並無乾貨)
2表示配置搜索的文件夾,在client請求配置時,只會在這個文件夾下進行搜索
事實上將1和2拼接在一塊兒就組成了搜索配置屬性的URL地址。
針對配置文件須要說明如下,label表示的分支只與client的配置相關:client中配置的是哪一個分支就取哪一個分支的配置
ps:在寫這篇博客的時候忽然想到一個問題,client在像server請求時是否只是請求須要的屬性的值,仍是請求對應的屬性文件。我的感受是取對應文件名的配置文件,在client拿到配置文件後再將讀取對應的屬性,與spring boot中從配置文件中讀取屬性相似(事實上就是兩個上下文,spring cloud的上下文有高優先級)。