作者簡介
周立
spring cloud中國社群聯合發起人之一,近7年的軟體系統開發經驗,多年系統架構經驗;參與開發多個大型項目,有電信某電信網管項目、某o2o電商平台、某征信系統等;對spring cloud、微服務、持續內建、持續傳遞有一定見地。
熱愛技術交流,曾代表公司參加全球微服務架構高峰論壇、qcon等技術沙龍。擁抱開源,多個項目開源在github與git@osc上,并獲得開源中國的推薦,例如電子書《使用spring cloud與docker實戰微服務》等。
目前,筆者的研究重心是使用spring cloud、docker、微服務,著有《spring cloud與docker微服務架構實戰》,已在京東上架。
筆者部落格:http://itmuch.com,定期分享spring cloud相關部落格。
一、為什麼要統一管理微服務配置
對于傳統的單體應用,我們常使用配置檔案管理所有配置。例如一個spring boot開發的單體應用,我們可将配置内容放在application.yml檔案中。如果需要切換環境,我們可設定多個profile,并在啟動應用時指定spring.profiles.active={profile}。在本書《eureka server的高可用》一節,我們使用的也是這種方式。當然,我們也可借助maven的profile實作環境切換。
然而,在微服務架構中,微服務的配置管理一般有以下需求:
(1) 集中管理配置。一個使用微服務架構的應用系統可能會包含成百上千個微服務,是以集中管理配置是非常有必要的;
(2) 不同環境,不同配置。例如,資料源配置在不同的環境(開發、測試、預釋出、生産等)中是不同的;
(3) 運作期間可動态調整。例如,我們可根據各個微服務的負載情況,動态調整資料源連接配接池大小或熔斷門檻值,并且在調整配置時不停止微服務;
(4) 配置修改後可自動更新。如配置内容發生變化,微服務能夠自動更新配置。
綜上所述,對于微服務架構而言,一個通用的配置管理機制是必不可少的,常見做法是使用配置伺服器幫助我們管理配置。
二、spring cloud config簡介
spring cloud config為分布式系統外部化配置提供了伺服器端和用戶端的支援,它包括config server和config client兩部分。由于config server和config client都實作了對spring environment和propertysource抽象的映射,是以,spring cloud config非常适合spring應用程式,當然也可與任何其他語言編寫的應用程式配合使用。
config server是一個可橫向擴充、集中式的配置伺服器,它用于集中管理應用程式各個環境下的配置,預設使用git存儲配置内容(也可使用subversion、本地檔案系統或vault存儲配置,限于篇幅,本書不作讨論),是以可以很友善地實作對配置的版本控制與内容審計。
config client是config server的用戶端,用于操作存儲在config server中的配置屬性。
圖9-1 spring cloud config架構圖
如圖9-1,所有的微服務都指向config server。各個微服務在啟動時,會請求config server以擷取所需要的配置屬性,然後緩存這些屬性以提高性能。
三、編寫config server
本節我們來編寫一個config server。在本例中,我們使用git作為config server的後端存儲。
内容分别是:
為了測試版本控制,我們為該git倉庫建立config-label-v2.0分支,并将各個配置檔案中的1.0改為2.0。
(2) 建立一個maven工程,artifactid是microservice-config-server ,并為項目添加以下依賴。
(3) 編寫啟動類,在啟動類上添加注解@enableconfigserver,聲明這是一個config server。
(4) 編寫配置檔案application.yml,并在其中添加以下内容。
這樣,一個config server就完成了。
我們可使用config server的端點擷取配置檔案的内容。端點與配置檔案的映射規則如下:
以上端點都可以映射到{application}-{profile}.properties 這個配置檔案,{application} 表示微服務的名稱,{label} 對應git倉庫的分支,預設是master。
按照以上規則,對于本例,我們可使用以下url通路到git倉庫master分支的microservice-foo-dev.properties,例如:
<a>http://localhost:8080/microservice-foo/dev</a>
<a>http://localhost:8080/microservice-foo-dev.properties</a>
<a>http://localhost:8080/microservice-foo-dev.yml</a>
從結果我們可以直覺地看到應用名稱、項目profile、git label、git version、配置檔案url、配置詳情等資訊。
說明獲得了git倉庫config-label-v2.0分支中的配置資訊。
至此,我們已成功建構了config server,并通過構造url的方式,擷取了git倉庫中的配置資訊。
四、編寫config client
前文我們已經建構了一個config server,并使用config server端點擷取配置内容。本節我們來讨論spring cloud微服務如何擷取配置資訊。
下面我們來編寫一個微服務,該微服務整合了config client。
(1) 建立一個maven工程,artifactid是microservice-config-client ,并為項目添加以下依賴。
(2) 建立一個基本的spring boot啟動類。
(3) 編寫配置檔案application.yml,并在其中添加如下内容。
(4) 建立配置檔案bootstrap.yml,并在其中添加如下内容。
其中:
spring.cloud.config.profile:profile對應config server所擷取的配置檔案中的{profile} ;
spring.cloud.config.label:指定git倉庫的分支,對應config server所擷取配置檔案的{label}。
spring cloud有一個“引導上下文”的概念,這是主應用程式的父上下文。引導上下文負責從配置伺服器加載配置屬性,以及解密外部配置檔案中的屬性。和主應用程式加載application.* (yml或properties)中的屬性不同,引導上下文加載bootstrap.* 中的屬性。配置在bootstrap.* 中的屬性有更高的優先級,是以預設情況下它們不能被本地配置覆寫。
如需禁用引導過程,可設定spring.cloud.bootstrap.enabled=false 。
(4) 編寫controller。
在controller中,我們通過注解@value("${profile}") ,綁定git倉庫配置檔案中的profile屬性。
(1) 啟動microservice-config-server。
(2) 啟動microservice-config-client。
dev-1.0
說明config client能夠正常通過config server獲得git倉庫中對應環境的配置。
來源:中生代技術
<a href="https://mp.weixin.qq.com/s/qp60hh6qtlvot_dlabkawa" target="_blank">原文連結</a>