一吮成、為什么要統(tǒng)一管理微服務配置
對于傳統(tǒng)的單體應用鳄虱,我們常使用配置文件管理所有配置蒜田。例如一個Spring Boot開發(fā)的單體應用,我們可將配置內(nèi)容放在application.yml文件中膜廊。如果需要切換環(huán)境乏沸,我們可設置多個Profile,并在啟動應用時指定spring.profiles.active={profile}爪瓜。在本書《Eureka Server的高可用》一節(jié)蹬跃,我們使用的也是這種方式。當然铆铆,我們也可借助Maven的Profile實現(xiàn)環(huán)境切換蝶缀。
然而,在微服務架構(gòu)中薄货,微服務的配置管理一般有以下需求:
(1) 集中管理配置翁都。一個使用微服務架構(gòu)的應用系統(tǒng)可能會包含成百上千個微服務,因此集中管理配置是非常有必要的谅猾;
(2) 不同環(huán)境荐吵,不同配置。例如赊瞬,數(shù)據(jù)源配置在不同的環(huán)境(開發(fā)先煎、測試、預發(fā)布巧涧、生產(chǎn)等)中是不同的薯蝎;
(3) 運行期間可動態(tài)調(diào)整。例如谤绳,我們可根據(jù)各個微服務的負載情況占锯,動態(tài)調(diào)整數(shù)據(jù)源連接池大小或熔斷閾值,并且在調(diào)整配置時不停止微服務缩筛;
(4) 配置修改后可自動更新消略。如配置內(nèi)容發(fā)生變化,微服務能夠自動更新配置瞎抛。
綜上所述艺演,對于微服務架構(gòu)而言,一個通用的配置管理機制是必不可少的桐臊,常見做法是使用配置服務器幫助我們管理配置胎撤。
二、Spring Cloud Config簡介
Spring Cloud Config為分布式系統(tǒng)外部化配置提供了服務器端和客戶端的支持断凶,它包括Config Server和Config Client兩部分伤提。由于Config Server和Config Client都實現(xiàn)了對Spring Environment和PropertySource抽象的映射,因此认烁,Spring Cloud Config非常適合Spring應用程序肿男,當然也可與任何其他語言編寫的應用程序配合使用介汹。
Config Server是一個可橫向擴展、集中式的配置服務器舶沛,它用于集中管理應用程序各個環(huán)境下的配置痴昧,默認使用Git存儲配置內(nèi)容(也可使用Subversion、本地文件系統(tǒng)或Vault存儲配置冠王,限于篇幅,本書不作討論)舌镶,因此可以很方便地實現(xiàn)對配置的版本控制與內(nèi)容審計柱彻。
Config Client是Config Server的客戶端,用于操作存儲在Config Server中的配置屬性餐胀。
圖9-1 Spring Cloud Config架構(gòu)圖
如圖9-1哟楷,所有的微服務都指向Config Server。各個微服務在啟動時否灾,會請求Config Server以獲取所需要的配置屬性卖擅,然后緩存這些屬性以提高性能。
三墨技、編寫Config Server
本節(jié)我們來編寫一個Config Server惩阶。在本例中,我們使用Git作為Config Server的后端存儲扣汪。
(1) 在Git倉庫https://git.oschina.net/itmuch/spring-cloud-config-repo?中新建幾個配置文件断楷,例如:
為了測試版本控制,我們?yōu)樵揋it倉庫創(chuàng)建config-label-v2.0分支崭别,并將各個配置文件中的1.0改為2.0冬筒。
(2) 創(chuàng)建一個Maven工程,ArtifactId是microservice-config-server 茅主,并為項目添加以下依賴舞痰。
(3) 編寫啟動類,在啟動類上添加注解@EnableConfigServer诀姚,聲明這是一個Config Server响牛。
(4) 編寫配置文件application.yml,并在其中添加以下內(nèi)容赫段。
這樣娃善,一個Config Server就完成了。
Config Server的端點
我們可使用Config Server的端點獲取配置文件的內(nèi)容瑞佩。端點與配置文件的映射規(guī)則如下:
以上端點都可以映射到{application}-{profile}.properties 這個配置文件聚磺,{application} 表示微服務的名稱,{label} 對應Git倉庫的分支炬丸,默認是master瘫寝。
按照以上規(guī)則蜒蕾,對于本例,我們可使用以下URL訪問到Git倉庫master分支的microservice-foo-dev.properties焕阿,例如:
http://localhost:8080/microservice-foo/dev
http://localhost:8080/microservice-foo-dev.properties
http://localhost:8080/microservice-foo-dev.yml
測試
(1) 訪問http://localhost:8080/microservice-foo/dev?咪啡,可獲得如下結(jié)果。
從結(jié)果我們可以直觀地看到應用名稱暮屡、項目profile撤摸、Git label、Git version褒纲、配置文件URL准夷、配置詳情等信息。
(2) 訪問http://localhost:8080/microservice-foo-dev.properties?莺掠,返回配置文件中的屬性:
(3) 訪問http://localhost:8080/config-label-v2.0/microservice-foo-dev.properties?衫嵌,可獲得如下結(jié)果:
說明獲得了Git倉庫config-label-v2.0分支中的配置信息。
至此彻秆,我們已成功構(gòu)建了Config Server楔绞,并通過構(gòu)造URL的方式,獲取了Git倉庫中的配置信息唇兑。
WARNING
需要注意的是酒朵,訪問http://localhost:8080/microservice-foo/dev?,結(jié)果中類似https://git.oschina.net/itmuch/spring-cloud-config-repo/microservice-foo-dev.properties?的URL并不能訪問扎附。這是正常的耻讽,因為它并不代表配置文件的實際URL路徑,而只是一個標識帕棉。有興趣的讀者可前往該頁面拓展閱讀:https://github.com/spring-cloud/spring-cloud-config/issues/571?针肥。
四、編寫Config Client
前文我們已經(jīng)構(gòu)建了一個Config Server香伴,并使用Config Server端點獲取配置內(nèi)容慰枕。本節(jié)我們來討論Spring Cloud微服務如何獲取配置信息。
下面我們來編寫一個微服務即纲,該微服務整合了Config Client具帮。
(1) 創(chuàng)建一個Maven工程,ArtifactId是microservice-config-client 低斋,并為項目添加以下依賴蜂厅。
(2) 創(chuàng)建一個基本的Spring Boot啟動類。
(3) 編寫配置文件application.yml膊畴,并在其中添加如下內(nèi)容掘猿。
(4) 創(chuàng)建配置文件bootstrap.yml,并在其中添加如下內(nèi)容唇跨。
其中:
spring.application.name:對應Config Server所獲取的配置文件中的{application} 稠通;
spring.cloud.config.uri:指定Config Server的地址衬衬,默認是http://localhost:8888?;
spring.cloud.config.profile:profile對應Config Server所獲取的配置文件中的{profile} 改橘;
spring.cloud.config.label:指定Git倉庫的分支滋尉,對應Config Server所獲取配置文件的{label}。
值得注意的是飞主,以上屬性應配置在bootstrap.yml狮惜,而不是application.yml中。如果配置在application.yml中碌识,該部分配置就不能正常工作碾篡。例如,Config Client會連接spring.cloud.config.uri的默認值http://localhost:8888?丸冕,而并非我們配置的http://localhost:8080/?。
Spring Cloud有一個“引導上下文”的概念薛窥,這是主應用程序的父上下文胖烛。引導上下文負責從配置服務器加載配置屬性,以及解密外部配置文件中的屬性诅迷。和主應用程序加載application.* (yml或properties)中的屬性不同佩番,引導上下文加載bootstrap.* 中的屬性。配置在bootstrap.* 中的屬性有更高的優(yōu)先級罢杉,因此默認情況下它們不能被本地配置覆蓋趟畏。
如需禁用引導過程,可設置spring.cloud.bootstrap.enabled=false 滩租。
(4) 編寫Controller赋秀。
在Controller中,我們通過注解@Value("${profile}") 律想,綁定Git倉庫配置文件中的profile屬性猎莲。
測試:
(1) 啟動microservice-config-server。
(2) 啟動microservice-config-client技即。
(3) 訪問http://localhost:8081/profile?著洼,可獲得如下的結(jié)果。
dev-1.0
說明Config Client能夠正常通過Config Server獲得Git倉庫中對應環(huán)境的配置而叼。