Spring Cloud與Docker微服務架構(gòu)實戰(zhàn)

一吮成、為什么要統(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)境的配置而叼。

更多java教程身笤,學習資料請加群:399305398

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市葵陵,隨后出現(xiàn)的幾起案子液荸,更是在濱河造成了極大的恐慌,老刑警劉巖脱篙,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莹弊,死亡現(xiàn)場離奇詭異涤久,居然都是意外死亡,警方通過查閱死者的電腦和手機忍弛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門响迂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人细疚,你說我怎么就攤上這事蔗彤。” “怎么了疯兼?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵然遏,是天一觀的道長。 經(jīng)常有香客問我吧彪,道長待侵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任姨裸,我火速辦了婚禮秧倾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘傀缩。我一直安慰自己那先,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布赡艰。 她就那樣靜靜地躺著售淡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慷垮。 梳的紋絲不亂的頭發(fā)上揖闸,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音料身,去河邊找鬼楔壤。 笑死,一個胖子當著我的面吹牛惯驼,可吹牛的內(nèi)容都是我干的蹲嚣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼祟牲,長吁一口氣:“原來是場噩夢啊……” “哼隙畜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起说贝,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤议惰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乡恕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體言询,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡俯萎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了运杭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夫啊。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辆憔,靈堂內(nèi)的尸體忽然破棺而出撇眯,到底是詐尸還是另有隱情,我是刑警寧澤虱咧,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布熊榛,位于F島的核電站,受9級特大地震影響腕巡,放射性物質(zhì)發(fā)生泄漏玄坦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一绘沉、第九天 我趴在偏房一處隱蔽的房頂上張望煎楣。 院中可真熱鬧,春花似錦梆砸、人聲如沸转质。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沸枯,卻和暖如春日矫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绑榴。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工哪轿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翔怎。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓窃诉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赤套。 傳聞我的和親對象是個殘疾皇子飘痛,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容