SpringCloud之Bus 消息總線
接上篇springcloud Config
概念
上篇config的加深和擴充,一言以蔽之:
分布式自動重新整理配置功能
Spring Cloud Bus 配合 Spring Cloud Config
使用可以實作配置的動态重新整理
是什麼:Bus支援兩種消息代理:RabbitMQ和 Kafka
讓用戶端訂閱config server ,然後通過消息中間件,讓用戶端統一去重新整理資訊
能幹嘛:
Spring Cloud Bus 能管理和傳播分布式系統間的消息,就像一個分布式執行器,可用于廣播狀态更改、事件推送等,也可以當做微服務間的通信通道。
什麼是總線:
在微服務架構的系統中,通常會使用輕量級的消息代理來建構一個公用的消息主題,并讓系統中所有微服務執行個體連接配接上來。由于該主題中産生的消息會被所有的執行個體監聽和消費,是以稱它為消息總線。在總線上的各個執行個體。都可以友善地廣播一些需要讓其他連接配接在該主題上的執行個體都知道的消息。
基本原理
ConfigClient執行個體都監聽MQ中同一個topic(預設是springCloudBus)。當一個服務重新整理資料的時候,它會把這個資訊放入到Topic中,這樣其他監聽同一Topic的服務就能得到通知,然後去更新自身的配置。
RabbitMQ環境配置
不同版本erlang ,對應不同的rabbitmq
erlang 21.3 rabbitmq 3.7.14 而且erlang得保證隻有一個版本
1、安裝Erlang,下載下傳位址:http://erlang.org/download/otp_win64_21.3.exe
官網下載下傳慢:http://erlang.org/download/ 可以這裡下載下傳
步驟:https://blog.csdn.net/g6256613/article/details/80191402?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162316383516780255294263%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162316383516780255294263&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-80191402.pc_search_result_cache&utm_term=%E5%AE%89%E8%A3%85erlang&spm=1018.2226.3001.4187
注意:是Path,不是ClassPath
測試安裝:cmd打開,輸入erl
path和Classpath的作用分别是什麼:
a. path是配置Windows可執行檔案的搜尋路徑,即擴充名為.exe的程式檔案所在的目錄,用于指定DOS視窗指令的路徑。
b. Classpath是配置class檔案所在的目錄,用于指定類搜尋路徑,JVM就是通過它來尋找該類的class類檔案的。
2、安裝RabbitMQ,下載下傳位址 https://www.rabbitmq.com/install-windows.html#installer
官網有問題,從github下載下傳
https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.14
https://blog.csdn.net/qq_47588845/article/details/107986373?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162316387316780264011416%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162316387316780264011416&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29_name-1-107986373.pc_search_result_cache&utm_term=%E5%AE%89%E8%A3%85rabbitmq&spm=1018.2226.3001.4187
3、進入RabbitMQ安裝目錄下的sbin目錄
D:\rabbitmq\rabbitmq_server-3.8.16\sbin
4、輸入以下指令啟動管理功能
rabbitmq-plugins enable rabbitmq_management 可視化插件
在sbin目錄下打開cmd并輸入上述指令便可打開
安裝完成後可以在開始windows開始菜單欄發現有相關程式
5、通路位址檢視是否安裝成功
重新啟動服務,輕按兩下sbin目錄下的rabbitmq-server.bat
6、輸入賬号密碼并登入:
打開浏覽器,位址欄輸入 http://127.0.0.1:15672 就可以看到登入頁面
輸入 guest guest 就可以登入
Bus動态重新整理全局廣播
設計思想和選型
必須先具備良好的RabbitMQ環境
示範廣播效果,增加複雜度,再以3355位模闆再制作一個3366
1.建立cloud-config-client-3366
2.POM,與之前的類似
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
3.YML
server:
port: 3366
spring:
application:
name: config-client
cloud:
#config用戶端配置
config:
label: develop #分支名稱
name: config #配置檔案名稱
profile: dev #讀取字尾名
#上面三個的意思是: master分支上config-dev.yml配置檔案被讀取 http://config-3344.com:3344/master/config-dev.yml
uri: http://localhost:3344 #配置中心位址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
#服務注冊到eureka位址
#暴露監控端點
management:
endpoints:
web:
exposure:
include: "*"
- 主啟動類
@EnableEurekaClient @SpringBootApplication public class ConfigClientMain3366 { public static void main(String[] args) { SpringApplication.run(ConfigClientMain3366.class, args); } }
- controller
@RestController @RefreshScope public class ConfigClientController { @Value("${server.port}") private String serverPort; @Value("${config.info}") private String configInfo; @GetMapping("/configInfo") public String ConfigInfo() { return "serverPort: " + serverPort + "\t\n\n configInfo: " + configInfo; } }
設計思想
1.利用消息總線觸發一個用戶端/bus/refresh,而重新整理所有用戶端的配置
2.利用消息總線觸發一個服務端ConfigServer的/bus/refresh端點,而重新整理所有用戶端的配置
兩種思想不同,第二種更合适,第一種不合适
理由: 第一種打破了微服務的職責單一性,因為微服務本身是業務子產品,它本身不應該承擔重新整理的職責。
破壞了微服務各節點的對等性。
有一定的局限性。例如,微服務在遷移時,它的網絡位址常常會發生變化,此時如果想要做到自動重新整理,那就會增加更多的修改。
給cloud-config-center-3344配置中心服務端添加消息總線支援
POM添加:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
YML添加:
#rabbitmq相關配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
management:
endpoints: #暴露bus重新整理配置的端點
web:
exposure:
include: 'bus-refresh'
#rabbitmq相關配置,暴露bus重新整理配置的端點
給cloud-config-client-3355用戶端添加消息總線支援
pom同上
yml有不同:
#rabbitmq相關配置 15672是web管理界面端口,5672是MQ通路端口
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
注意:此處的rabbitmq配置是在spring的配置下的,跟application同級
這裡不用暴露bus重新整理配置的端點
給cloud-config-client-3366用戶端添加消息總線支援
同3355
測試:運維工程師: 1.修改github上配置檔案增加版本号
2.發送post請求 curl -X POST “http://localhost:3344/actuator/bus-refresh” 即config内容裡的那個請求,一次發送,處處生效
配置中心:http://config-3344.com:3344/config-dev.yml
用戶端: http://localhost:3355/configInfo
http://localhost:3366/configInfo
擷取配置資訊,發現都已經重新整理了
Bus動态重新整理定點通知
1、不想全部通知,隻想定點通知,隻通知3355,不通知3366
2.簡單一句話:公式:http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}
/bus/refresh請求不再發送到具體的服務執行個體上,而是發送給config server并通過destination參數類指定需要更新配置的服務或執行個體
案例:隻通知3355:
curl -X POST “http://localhost:3344/actuator/bus-refresh/config-client:3355”
完全解除安裝erlang和rabbitmq
要從計算機中完全解除安裝RabbitMQ和Erlang,請執行以下操作:
(1)打開Windows控制台,輕按兩下“程式和功能”。
(2)在目前安裝的程式清單中,右鍵單擊RabbitMQ Server,然後單擊“解除安裝”。
(3)在目前安裝的程式清單中,右鍵單擊“Erlang OTP”,然後單擊“解除安裝”。
(4)打開Windows任務管理器。
(5)在任務管理器中,查找程序epmd.exe。 如果此程序仍在運作,請右鍵單擊該程序,然後單擊“結束程序”。
(6)删除RabbitMQ和Erlang的所有安裝目錄。
(7)删除檔案C:\Windows\System32\config\systemprofile.erlang.cookie(如果存在)。
(8)轉到使用者檔案夾:C:\ Users \ [username],然後删除檔案.erlang.cookie。删除
(9)同樣在User檔案夾中,轉到AppData \ Roaming \ RabbitMQ。删除RabbitMQ檔案夾。
(10)删除系統資料庫HKEY_LOCAL_MACHINE\SOFTWARE\Ericsson\Erlang\ErlSrv的子項。
(11)打開運作cmd->sc delete RabbitMQ。
(12)打開運作->regedit 找到RabbitMQ節點,删掉即可。
小結:
bus 應用的rabbitmq隻要安裝好就可以了,不需要設定topic,以及路徑,因為引入的元件已經都自動設定了