SpringCloudConfig是什么?
SpringCloudConfig為微服務(wù)架構(gòu)中的微服務(wù)提供集中化的外部配置支持,配置服務(wù)器為各個不同微服務(wù)應(yīng)用的所有環(huán)境提供了一個中心化的外部配置.
SpringCloudConfig為分布式系統(tǒng)中的外部配置提供服務(wù)器和客戶端支持。Config Server在所有環(huán)境中管理應(yīng)用程序的外部屬性。服務(wù)器存儲后端的默認(rèn)使用git,支持標(biāo)簽版本的配置環(huán)境。
最簡單的配置中心就是啟動一個服務(wù)作為服務(wù)方,之后各個需要獲取配置的服務(wù)作為客戶端來這個服務(wù)方獲取配置。
1.在github創(chuàng)建倉庫springcloud-config,在master分支下創(chuàng)建兩個文件:config-dev.yml,config-test.yml對應(yīng)實際開發(fā)中的測試分支和開發(fā)分支.



服務(wù)端獲取github上的配置信息
創(chuàng)建SpringBoot項目,作為服務(wù)端,項目名稱:springcloud-config-server-3344
1.pom.xml中引入maven依賴

2.創(chuàng)建bootstrap.yml,application.yml.
bootstrap.yml和application.yml兩個文件的區(qū)別:
application.yml是用戶級別的配置項
bootstrap.yml是系統(tǒng)級別的,優(yōu)先級更高。
Spring Cloud會創(chuàng)建一個“Bootstrap Context”,作為Spring應(yīng)用的Application Context的上下文,初始化的時候,Bootstrap負(fù)責(zé)從外部源加載配置屬性并解析配置,這兩個上下文共享一個從外部獲取的Environment。Bootstrap屬性有更高的優(yōu)先級,默認(rèn)情況下,他們不會被本地配置覆蓋。BootstrapContext和AppliactionContext有著不同的約定,所以新增了一個bootstrap.yml文件,保證Bootstrap.Context和ApplicationContext的配置分離.
要將Client模塊下的application.yml文件改為application.yml是很關(guān)鍵的。因為bootstrap.yml是比application.yml先加載的,而且優(yōu)先級更高。


3.SpringCloudConfigServer啟動類

4.運行,測試。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} 就是配置文件的版本,項目有開發(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 分支,如果項目是以分支做區(qū)分也是可以的,那就可以通過不同的 label 來控制訪問不同的配置文件了

客戶端從服務(wù)端獲取GitHub上的配置信息
1.創(chuàng)建Client項目,名稱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)運行,測試http://localhost:3355/configInfo,客戶端從服務(wù)端獲取GitHub上的配置信息

通過以上步驟,client可以通過server獲取GitHub上的配置信息。但是當(dāng)配置改變是,client不能立刻反應(yīng)過來,即時刷新。
spring cloud bus實現(xiàn)自動刷新配置
Spring Cloud Bus提供了批量刷新配置的機制,它使用輕量級的消息代理(例如RabbitMQ、Kafka等)連接分布式系統(tǒng)的節(jié)點,這樣就可以通過Spring Cloud Bus廣播配置的變化或者其他的管理指令。

什么是總線
在微服務(wù)架構(gòu)的系統(tǒng)中,通常會使用輕量級的消息代理來構(gòu)建一個共用的消息主題,并讓系統(tǒng)中所有微服務(wù)實例都連接上來。由于該主題中產(chǎn)生的消息會被所有實例監(jiān)聽和消費,所以稱它為消息總線,在總線上的各個實例,都可以方便地廣播一些需要讓其他連接在該主題上的實例都知道的消息。

基本原理
ConfigClient實例都監(jiān)聽MQ中同一個topic(默認(rèn)是SpringCloudBus)當(dāng)一個服務(wù)刷新數(shù)據(jù)的時候,它會把這個信息放入topic中,這樣其他監(jiān)聽同一Topic的服務(wù)就能得到通知,然后去更新自身的配置。
(1)安裝RabbitMQ,配置環(huán)境。
什么是RabbitMQ
兩個(多個)系統(tǒng)間需要通過定時任務(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是一個由erlang開發(fā)的AMQP(Advanced Message Queue 高級消息隊列協(xié)議 )的開源實現(xiàn),能夠?qū)崿F(xiàn)異步消息處理
(1)RabbitMQ是一個消息代理:它接受和轉(zhuǎn)發(fā)消息。
優(yōu)點:異步消息處理
?業(yè)務(wù)解耦錯峰流控
靈活的路由(Flexible Routing) :在消息進(jìn)入隊列之前,通過 Exchange 來路由消息的。對于典型的路由功能,RabbitMQ 已經(jīng)提供了一些內(nèi)置的 Exchange 來實現(xiàn)。針對更復(fù)雜的路由功能,可以將多個 Exchange 綁定在一起,也通過插件機制實現(xiàn)自己的 Exchange 。
RabbitMQ網(wǎng)站端口號:15672,程序里面實現(xiàn)的端口為:5672
(2)queue隊列
Queue(隊列)RabbitMQ的作用是存儲消息,隊列的特性是先進(jìn)先出。生產(chǎn)者生產(chǎn)消息最終被送到RabbitMQ的內(nèi)部對象Queue中去,而消費者則是從Queue隊列中取出數(shù)據(jù)。
(3)消息隊列
?消息(Message)是指在應(yīng)用間傳送的數(shù)據(jù)。消息可以非常簡單,比如只包含文本字符串,也可以更復(fù)雜,可能包含嵌入對象。?
消息隊列(Message Queue)是一種應(yīng)用間的通信方式,消息發(fā)送后可以立即返回,
由消息系統(tǒng)來確保消息的可靠傳遞。消息發(fā)布者只管把消息發(fā)布到 MQ 中而不用管誰來取,消息使用者只管從 MQ 中取消息而不管是誰發(fā)布的。這樣發(fā)布者和使用者都不用知道對方的存在。
(4)消息隊列中間件:kafka ? rabbitMQ ?activeMQ ? rocketMQ(可以處理分布式事務(wù))
2.在第一個項目springcloud-config-server-3344中添加入動態(tài)刷新功能
2.1pom.xml增加bus依賴

2.2bootstrap.yml增加rabbitmq配置和熱部署

啟動類不用進(jìn)行修改
3.在第二個項目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,運行curl -X POST "http://localhost:3344/actuator/bus-refresh"前面一部分是訪問服務(wù)端的連接
4.4刷新客戶端頁面,查看是否更新
5.定點局部刷新,某些客戶端的配置更新,某些不更新。在POST請求后面加上特定更新的客戶端名稱和端口號。
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"