SpringCloudConfig是什么?
SpringCloudConfig為微服務(wù)架構(gòu)中的微服務(wù)提供集中化的外部配置支持,配置服務(wù)器為各個(gè)不同微服務(wù)應(yīng)用的所有環(huán)境提供了一個(gè)中心化的外部配置.
SpringCloudConfig為分布式系統(tǒng)中的外部配置提供服務(wù)器和客戶端支持刀脏。Config Server在所有環(huán)境中管理應(yīng)用程序的外部屬性。服務(wù)器存儲后端的默認(rèn)使用git,支持標(biāo)簽版本的配置環(huán)境超凳。
最簡單的配置中心就是啟動一個(gè)服務(wù)作為服務(wù)方愈污,之后各個(gè)需要獲取配置的服務(wù)作為客戶端來這個(gè)服務(wù)方獲取配置。
1.在github創(chuàng)建倉庫springcloud-config,在master分支下創(chuàng)建兩個(gè)文件:config-dev.yml,config-test.yml對應(yīng)實(shí)際開發(fā)中的測試分支和開發(fā)分支.
服務(wù)端獲取github上的配置信息
創(chuàng)建SpringBoot項(xiàng)目轮傍,作為服務(wù)端,項(xiàng)目名稱:springcloud-config-server-3344
1.pom.xml中引入maven依賴
2.創(chuàng)建bootstrap.yml,application.yml.
bootstrap.yml和application.yml兩個(gè)文件的區(qū)別:
application.yml是用戶級別的配置項(xiàng)
bootstrap.yml是系統(tǒng)級別的钙畔,優(yōu)先級更高。
Spring Cloud會創(chuàng)建一個(gè)“Bootstrap Context”,作為Spring應(yīng)用的Application Context的上下文金麸,初始化的時(shí)候擎析,Bootstrap負(fù)責(zé)從外部源加載配置屬性并解析配置,這兩個(gè)上下文共享一個(gè)從外部獲取的Environment挥下。Bootstrap屬性有更高的優(yōu)先級揍魂,默認(rèn)情況下,他們不會被本地配置覆蓋棚瘟。BootstrapContext和AppliactionContext有著不同的約定现斋,所以新增了一個(gè)bootstrap.yml文件,保證Bootstrap.Context和ApplicationContext的配置分離.
要將Client模塊下的application.yml文件改為application.yml是很關(guān)鍵的偎蘸。因?yàn)閎ootstrap.yml是比application.yml先加載的庄蹋,而且優(yōu)先級更高。
3.SpringCloudConfigServer啟動類
4.運(yùn)行迷雪,測試限书。Server獲取github上的配置信息。
Spring Cloud Config 有它的一套訪問規(guī)則章咧,通過這套規(guī)則在瀏覽器上直接訪問就可以倦西。
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
{application} 就是應(yīng)用名稱,對應(yīng)到配置文件上來赁严,就是配置文件的名稱部分.
{profile} 就是配置文件的版本扰柠,項(xiàng)目有開發(fā)版本粉铐、測試環(huán)境版本、生產(chǎn)環(huán)境版本卤档,對應(yīng)到配置文件上來就是以 application-{profile}.yml 加以區(qū)分蝙泼,例如application-dev.yml、application-sit.yml劝枣、application-prod.yml踱承。
{label} 表示 git 分支,默認(rèn)是 master 分支哨免,如果項(xiàng)目是以分支做區(qū)分也是可以的茎活,那就可以通過不同的 label 來控制訪問不同的配置文件了
客戶端從服務(wù)端獲取GitHub上的配置信息
1.創(chuàng)建Client項(xiàng)目,名稱springcloud-config-client-3355琢唾,從服務(wù)端springcloud-config-server-3344獲取配置信息载荔。
(1)pom.xml導(dǎo)入maven依賴〔商遥客戶端導(dǎo)入的是config,服務(wù)端導(dǎo)入server
(2)創(chuàng)建bootstrap.yml,application.yml
label:對應(yīng)GitHub上的分支懒熙;name:文件的名稱;profile:文件版本后綴普办;uri:服務(wù)端訪問連接.拼湊起來就是之前測試的鏈接http://localhost:3344/config-dev.yml
(3)創(chuàng)建controller包工扎,創(chuàng)建ConfigController類,屬性對應(yīng)github文件里面的字段
(4)創(chuàng)建SpringCloudConfigClient啟動類
(5)運(yùn)行衔蹲,測試http://localhost:3355/configInfo,客戶端從服務(wù)端獲取GitHub上的配置信息
通過以上步驟肢娘,client可以通過server獲取GitHub上的配置信息。但是當(dāng)配置改變是舆驶,client不能立刻反應(yīng)過來橱健,即時(shí)刷新。
spring cloud bus實(shí)現(xiàn)自動刷新配置
Spring Cloud Bus提供了批量刷新配置的機(jī)制沙廉,它使用輕量級的消息代理(例如RabbitMQ拘荡、Kafka等)連接分布式系統(tǒng)的節(jié)點(diǎn),這樣就可以通過Spring Cloud Bus廣播配置的變化或者其他的管理指令撬陵。
什么是總線
在微服務(wù)架構(gòu)的系統(tǒng)中珊皿,通常會使用輕量級的消息代理來構(gòu)建一個(gè)共用的消息主題,并讓系統(tǒng)中所有微服務(wù)實(shí)例都連接上來巨税。由于該主題中產(chǎn)生的消息會被所有實(shí)例監(jiān)聽和消費(fèi)蟋定,所以稱它為消息總線,在總線上的各個(gè)實(shí)例垢夹,都可以方便地廣播一些需要讓其他連接在該主題上的實(shí)例都知道的消息溢吻。
基本原理
ConfigClient實(shí)例都監(jiān)聽MQ中同一個(gè)topic(默認(rèn)是SpringCloudBus)當(dāng)一個(gè)服務(wù)刷新數(shù)據(jù)的時(shí)候,它會把這個(gè)信息放入topic中果元,這樣其他監(jiān)聽同一Topic的服務(wù)就能得到通知促王,然后去更新自身的配置。
(1)安裝RabbitMQ而晒,配置環(huán)境蝇狼。
什么是RabbitMQ
兩個(gè)(多個(gè))系統(tǒng)間需要通過定時(shí)任務(wù)來同步某些數(shù)據(jù),異構(gòu)系統(tǒng)的不同進(jìn)程間相互調(diào)用、通訊,消息服務(wù)讓你可以解決這些問題倡怎。
消息服務(wù)擅長于解決多系統(tǒng)迅耘、異構(gòu)系統(tǒng)間的數(shù)據(jù)交換(消息通知/通訊)問題,也可以把它用于系統(tǒng)間服務(wù)的相互調(diào)用(RPC)监署。RabbitMQ就是當(dāng)前最主流的消息中間件之一颤专。
1.RabbitMQ是一個(gè)由erlang開發(fā)的AMQP(Advanced Message Queue 高級消息隊(duì)列協(xié)議 )的開源實(shí)現(xiàn),能夠?qū)崿F(xiàn)異步消息處理
(1)RabbitMQ是一個(gè)消息代理:它接受和轉(zhuǎn)發(fā)消息钠乏。
優(yōu)點(diǎn):異步消息處理
?業(yè)務(wù)解耦錯(cuò)峰流控
靈活的路由(Flexible Routing) :在消息進(jìn)入隊(duì)列之前栖秕,通過 Exchange 來路由消息的。對于典型的路由功能晓避,RabbitMQ 已經(jīng)提供了一些內(nèi)置的 Exchange 來實(shí)現(xiàn)簇捍。針對更復(fù)雜的路由功能,可以將多個(gè) Exchange 綁定在一起俏拱,也通過插件機(jī)制實(shí)現(xiàn)自己的 Exchange 暑塑。
RabbitMQ網(wǎng)站端口號:15672,程序里面實(shí)現(xiàn)的端口為:5672
(2)queue隊(duì)列
Queue(隊(duì)列)RabbitMQ的作用是存儲消息锅必,隊(duì)列的特性是先進(jìn)先出事格。生產(chǎn)者生產(chǎn)消息最終被送到RabbitMQ的內(nèi)部對象Queue中去,而消費(fèi)者則是從Queue隊(duì)列中取出數(shù)據(jù)搞隐。
(3)消息隊(duì)列
?消息(Message)是指在應(yīng)用間傳送的數(shù)據(jù)分蓖。消息可以非常簡單,比如只包含文本字符串尔许,也可以更復(fù)雜么鹤,可能包含嵌入對象。?
消息隊(duì)列(Message Queue)是一種應(yīng)用間的通信方式味廊,消息發(fā)送后可以立即返回蒸甜,
由消息系統(tǒng)來確保消息的可靠傳遞。消息發(fā)布者只管把消息發(fā)布到 MQ 中而不用管誰來取余佛,消息使用者只管從 MQ 中取消息而不管是誰發(fā)布的柠新。這樣發(fā)布者和使用者都不用知道對方的存在。
(4)消息隊(duì)列中間件:kafka ? rabbitMQ ?activeMQ ? rocketMQ(可以處理分布式事務(wù))
2.在第一個(gè)項(xiàng)目springcloud-config-server-3344中添加入動態(tài)刷新功能
2.1pom.xml增加bus依賴
2.2bootstrap.yml增加rabbitmq配置和熱部署
啟動類不用進(jìn)行修改
3.在第二個(gè)項(xiàng)目springcloud-config-3355中引入動態(tài)刷新功能
3.1pom.xml引入一樣的依賴
3.2bootstrap.yml
3.3Contrller類中加入@RefreshScope注解
(4)開始測試
4.1啟動rabbit-server
4.2修改github上的配置信息
4.3打開cmd,運(yùn)行curl -X POST "http://localhost:3344/actuator/bus-refresh"前面一部分是訪問服務(wù)端的連接
4.4刷新客戶端頁面辉巡,查看是否更新
5.定點(diǎn)局部刷新恨憎,某些客戶端的配置更新,某些不更新。在POST請求后面加上特定更新的客戶端名稱和端口號憔恳。
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"