Spring Cloud Config,Spring Cloud Bus動態刷新配置

SpringCloudConfig是什麼?

SpringCloudConfig爲微服務架構中的微服務提供集中化的外部配置支持,配置服務器爲各個不同微服務應用的所有環境提供了一箇中心化的外部配置.

SpringCloudConfig爲分佈式系統中的外部配置提供服務器和客戶端支持。Config Server在所有環境中管理應用程序的外部屬性。服務器存儲後端的默認使用git,支持標籤版本的配置環境。

最簡單的配置中心就是啓動一個服務作爲服務方,之後各個需要獲取配置的服務作爲客戶端來這個服務方獲取配置。

1.在github創建倉庫springcloud-config,在master分支下創建兩個文件:config-dev.yml,config-test.yml對應實際開發中的測試分支和開發分支.

服務端獲取github上的配置信息

創建SpringBoot項目,作爲服務端,項目名稱:springcloud-config-server-3344

1.pom.xml中引入maven依賴

2.創建bootstrap.yml,application.yml.

bootstrap.yml和application.yml兩個文件的區別:

application.yml是用戶級別的配置項

bootstrap.yml是系統級別的,優先級更高。

Spring Cloud會創建一個“Bootstrap Context”,作爲Spring應用的Application Context的上下文,初始化的時候,Bootstrap負責從外部源加載配置屬性並解析配置,這兩個上下文共享一個從外部獲取的Environment。Bootstrap屬性有更高的優先級,默認情況下,他們不會被本地配置覆蓋。BootstrapContext和AppliactionContext有着不同的約定,所以新增了一個bootstrap.yml文件,保證Bootstrap.Context和ApplicationContext的配置分離.

要將Client模塊下的application.yml文件改爲application.yml是很關鍵的。因爲bootstrap.yml是比application.yml先加載的,而且優先級更高。

3.SpringCloudConfigServer啓動類

4.運行,測試。Server獲取github上的配置信息。

Spring Cloud Config 有它的一套訪問規則,通過這套規則在瀏覽器上直接訪問就可以。

/{application}/{profile}[/{label}]

/{application}-{profile}.yml

/{label}/{application}-{profile}.yml

/{application}-{profile}.properties

/{label}/{application}-{profile}.properties

{application} 就是應用名稱,對應到配置文件上來,就是配置文件的名稱部分.

{profile} 就是配置文件的版本,項目有開發版本、測試環境版本、生產環境版本,對應到配置文件上來就是以 application-{profile}.yml 加以區分,例如application-dev.yml、application-sit.yml、application-prod.yml。

{label} 表示 git 分支,默認是 master 分支,如果項目是以分支做區分也是可以的,那就可以通過不同的 label 來控制訪問不同的配置文件了

客戶端從服務端獲取GitHub上的配置信息

1.創建Client項目,名稱springcloud-config-client-3355,從服務端springcloud-config-server-3344獲取配置信息。

(1)pom.xml導入maven依賴。客戶端導入的是config,服務端導入server

(2)創建bootstrap.yml,application.yml

label:對應GitHub上的分支;name:文件的名稱;profile:文件版本後綴;uri:服務端訪問連接.拼湊起來就是之前測試的鏈接http://localhost:3344/config-dev.yml

(3)創建controller包,創建ConfigController類,屬性對應github文件裏面的字段

(4)創建SpringCloudConfigClient啓動類

(5)運行,測試http://localhost:3355/configInfo,客戶端從服務端獲取GitHub上的配置信息

通過以上步驟,client可以通過server獲取GitHub上的配置信息。但是當配置改變是,client不能立刻反應過來,即時刷新。

spring cloud bus實現自動刷新配置

Spring Cloud Bus提供了批量刷新配置的機制,它使用輕量級的消息代理(例如RabbitMQ、Kafka等)連接分佈式系統的節點,這樣就可以通過Spring Cloud Bus廣播配置的變化或者其他的管理指令。

什麼是總線

在微服務架構的系統中,通常會使用輕量級的消息代理來構建一個共用的消息主題,並讓系統中所有微服務實例都連接上來。由於該主題中產生的消息會被所有實例監聽和消費,所以稱它爲消息總線,在總線上的各個實例,都可以方便地廣播一些需要讓其他連接在該主題上的實例都知道的消息。

基本原理

ConfigClient實例都監聽MQ中同一個topic(默認是SpringCloudBus)當一個服務刷新數據的時候,它會把這個信息放入topic中,這樣其他監聽同一Topic的服務就能得到通知,然後去更新自身的配置。

(1)安裝RabbitMQ,配置環境。

什麼是RabbitMQ

兩個(多個)系統間需要通過定時任務來同步某些數據,異構系統的不同進程間相互調用、通訊,消息服務讓你可以解決這些問題。

消息服務擅長於解決多系統、異構系統間的數據交換(消息通知/通訊)問題,也可以把它用於系統間服務的相互調用(RPC)。RabbitMQ就是當前最主流的消息中間件之一。

1.RabbitMQ是一個由erlang開發的AMQP(Advanced Message Queue 高級消息隊列協議 )的開源實現,能夠實現異步消息處理

(1)RabbitMQ是一個消息代理:它接受和轉發消息。

優點:異步消息處理

 業務解耦錯峯流控

靈活的路由(Flexible Routing) :在消息進入隊列之前,通過 Exchange 來路由消息的。對於典型的路由功能,RabbitMQ 已經提供了一些內置的 Exchange 來實現。針對更復雜的路由功能,可以將多個 Exchange 綁定在一起,也通過插件機制實現自己的 Exchange 。

RabbitMQ網站端口號:15672,程序裏面實現的端口爲:5672

(2)queue隊列

Queue(隊列)RabbitMQ的作用是存儲消息,隊列的特性是先進先出。生產者生產消息最終被送到RabbitMQ的內部對象Queue中去,而消費者則是從Queue隊列中取出數據。

(3)消息隊列

 消息(Message)是指在應用間傳送的數據。消息可以非常簡單,比如只包含文本字符串,也可以更復雜,可能包含嵌入對象。 

消息隊列(Message Queue)是一種應用間的通信方式,消息發送後可以立即返回,

由消息系統來確保消息的可靠傳遞。消息發佈者只管把消息發佈到 MQ 中而不用管誰來取,消息使用者只管從 MQ 中取消息而不管是誰發佈的。這樣發佈者和使用者都不用知道對方的存在。

(4)消息隊列中間件:kafka   rabbitMQ  activeMQ   rocketMQ(可以處理分佈式事務)

2.在第一個項目springcloud-config-server-3344中添加入動態刷新功能

2.1pom.xml增加bus依賴

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

啓動類不用進行修改

3.在第二個項目springcloud-config-3355中引入動態刷新功能

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"前面一部分是訪問服務端的連接

4.4刷新客戶端頁面,查看是否更新

5.定點局部刷新,某些客戶端的配置更新,某些不更新。在POST請求後面加上特定更新的客戶端名稱和端口號。

curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章