1. 程式人生 > >什麼是SpringCloudBus?如何使用SpringCloudBus實現自動更新配置功能?

什麼是SpringCloudBus?如何使用SpringCloudBus實現自動更新配置功能?

這裡是修真院後端小課堂,每篇分享文從

【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】

八個方面深度解析後端知識/技能,本篇分享的是:

【什麼是SpringCloudBus?如何使用SpringCloudBus實現自動更新配置功能? 】

大家好,我是IT修真院鄭州分院第11期的學員何爽,一枚正直純潔善良的後端程式設計師,今天給大家分享一下,修真院官網java(職業)任務10,深度思考中的知識點——什麼是SpringCloudBus?如何使用SpringCloudBus實現自動更新配置功能?

 

 

1.背景介紹

 

 

一、簡介

在微服務架構的系統中,我們通常會使用輕量級的訊息代理來構建一個共用的訊息主題讓系統中所有微服務例項都連線上來,

由於該主題中產生的訊息會被所有例項監聽和消費,所以我們稱它為訊息匯流排。Spring Cloud Bus就像一個分散式執行器,

用於擴充套件的Spring Boot應用程式,但也可以用作應用程式之間的通訊通道。那麼這裡就涉及到了訊息代理,目前流行的訊息代理中介軟體有不少,

Spring Cloud Bus支援RabbitMQ和Kafka,本文我們主要來看看RabbitMQ的基本使用。

 

二、訊息代理

訊息代理(Message Broker)是一種訊息驗證、傳輸、路由的架構模式。它在應用程式之間起到通訊排程並最小化應用之間的依賴的作用,

使得應用程式可以高效地解耦通訊過程。訊息代理是一箇中間件產品,它的核心是一個訊息的路由程式,用來實現接收和分發訊息,

 並根據設定好的訊息處理流來轉發給正確的應用。

它包括獨立的通訊和訊息傳遞協議,能夠實現組織內部和組織間的網路通訊

 

 

設計代理的目的就是為了能夠從應用程式中傳入訊息,並執行一些特別的操作,下面這些是在企業應用中,我們經常需要使用訊息代理的場景:

將訊息路由到一個或多個目的地。

訊息轉化為其他的表現方式。

執行訊息的聚集、訊息的分解,並將結果傳送到它們的目的地,然後重新組合響應返回給訊息使用者。

呼叫Web服務來檢索資料。

響應事件或錯誤。

使用釋出-訂閱模式來提供內容或基千主題的訊息路由。

 

 

2.知識剖析

 

RabbitMQ的基礎知識和使用方法

 

 1、簡介

 MQ(Message Queue)訊息佇列,用於應用系統解耦、訊息非同步分發。 RabbitMQ是一個在AMQP基礎上完整的,可複用的企業訊息系統。其優點如下:

          1)Reliability-可靠性高。

  2)Flexible Routing-路由靈活。

  3)Clustering-支援叢集。

  4)Federation-支援互聯。

  5)Tracing-便於追蹤。

 

2、安裝

RabbitMQ是用Erlang語言編寫的,因此安裝RabbitMQ之前我們要先安裝Erlang環境,首先去http://www.erlang.org/downloads地址下載erlang,

下載到的是一個exe檔案,直接雙擊安裝即可,然後去http://www.rabbitmq.com/downl...地址下載RabbitMQ,下載成功之後,也是一個exe,雙擊安裝即可

 

RabbitMQ安裝成功之後,預設會建立系統服務,將和Windows系統一起啟動。所以安裝成功之後,開啟系統服務,我們如果看到如下結果表示安裝成功了:

<img src="20181107183341.png"/>

 

安裝成功之後,我們可以使用web來管理我們的RabbitMQ,管理之前需要我們先開啟web管理功能,開啟方式:進入到安裝目錄的sbin目錄下,

然後執行 .rabbitmq-plugins enable rabbitmq_management命令,如下:

<img src="14x.png"/>

執行成功之後,開啟瀏覽器,輸入http://localhost:15672進入到web管理頁面,需要先登入,預設使用者名稱密碼都是guest,頁面如下:

<img src="0181107183750.png"/>

進入裡面之後我們可以新建一個使用者,使用者的級別分別為:management、none、policymaker、monitoring和administrator,不同取值所對應的許可權區別如下:

 

none:不能訪問 management plugin

management:使用者可以通過AMQP做的任何事外加:

1.列出自己可以通過AMQP登入的virtual hosts 

2.檢視自己的virtual hosts中的queues, exchanges 和 bindings 

3.檢視和關閉自己的channels 和 connections 

4.檢視有關自己的virtual hosts的“全域性”的統計資訊,包含其他使用者在這些virtual hosts中的活動

policymaker:management可以做的任何事外加:檢視、建立和刪除自己的virtual hosts所屬的policies和parameters

 

monitoring:management可以做的任何事外加:

1.列出所有virtual hosts,包括他們不能登入的virtual hosts 

2.檢視其他使用者的connections和channels 

3.檢視節點級別的資料如clustering和memory使用情況 

4.檢視真正的關於所有virtual hosts的全域性的統計資訊

administrator:policymaker和monitoring可以做的任何事外加:

1.建立和刪除virtual hosts 

2.檢視、建立和刪除users 

3.檢視建立和刪除permissions 

4.關閉其他使用者的connections

 

這裡我建立一個root使用者,建立好之後,給使用者設定virtual hosts,否則一會使用這個使用者的時候會報錯。設定如下:

<img src="2592230910-59f055cf0c2cd_articlex.png"/>

 

OK,配置完成後,接下來我們來看一個Spring Boot和RabbitMQ整合的案例,來對RabbitMQ做進一步的瞭解,具體的見編碼實戰。

 

 

3.常見問題 

 

什麼時候用cloud bus

 

 

4.解決方案

 

 

 

spring cloud bus在整個後端服務中起到聯通的作用,聯通後端的多臺伺服器。我們為什麼需要他做聯通呢?

後端伺服器一般都做了叢集化,很多臺伺服器,而且在大促活動期經常發生服務的擴容、縮容、上線、下線。這樣,後端伺服器的數量、IP就會變來變去,如果我們想進行一些線上的管理和維護工作,就需要維護伺服器的IP。

比如我們需要更新配置、比如我們需要同時失效所有伺服器上的某個快取,都需要向所有的相關伺服器傳送命令,也就是呼叫一個介面。

 

你可能會說,我們一般會採用zookeeper的方式,統一儲存伺服器的ip地址,需要的時候,向對應伺服器傳送命令。這是一個方案,但是他的解耦性、靈活性、實時性相比訊息匯流排都差那麼一點。

總的來說,就是在我們需要把一個操作散發到所有後端相關伺服器的時候,就可以選擇使用cloud bus了。

 

5.編碼實戰

 

 

6.擴充套件思考

 

利用Spring Cloud Bus做配置更新:

 

<img src="QQ圖片20181107191914.png"/>

 

這時Spring Cloud Bus做配置更新步驟如下:

1、提交程式碼觸發post請求給bus/refresh

2、server端接收到請求併發送給Spring Cloud Bus

3、Spring Cloud bus接到訊息並通知給其它客戶端

4、其它客戶端接收到通知,請求Server端獲取最新配置

5、全部客戶端均獲取到最新的配置

具體的實現過程和步驟可參考下面的網址:

https://www.cnblogs.com/ityouknow/p/6931958.html

 

 

7.參考文獻

 

 

https://www.cnblogs.com/ityouknow/p/6931958.html

 

https://www.jb51.net/article/137875.htm

 

https://segmentfault.com/a/1190000011827203

 

 

8.更多討論

 

 

 

Q1:提問人wyq:

 

 

 

Eureka開啟自我保護的提示

 

 

 

A1:回答人(h):

 

 

 

 EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

 

 

 

Q2:提問人:zhh

 

 

 

Eureka註冊服務慢的問題如何解決?

 

 

 

A2:回答人(h):

 

 

 

  eureka.instance.leaseRenewalIntervalInSeconds

 

參考文件:

 

http://cloud.spring.io/spring-cloud-static/Camden.SR1/#_why_is_it_so_slow_to_register_a_service

 

 

 

Q3:提問人:zyq

 

 

 

 如何解決Eureka Server不踢出已關停的節點的問題?

 

 

 

A3:回答人(h):

 

 

server端:

 

eureka.server.enable-self-preservation                 (設為false,關閉自我保護主要)

 

eureka.server.eviction-interval-timer-in-ms     清理間隔(單位毫秒,預設是60*1000)

 

client端:

 

eureka.client.healthcheck.enabled = true                            開啟健康檢查(需要spring-boot-starter-actuator依賴)

 

eureka.instance.lease-renewal-interval-in-seconds =10        租期更新時間間隔(預設30秒)

 

eureka.instance.lease-expiration-duration-in-seconds =30  租期到期時間(預設90秒)

 

 

 

 

9.鳴謝

 

 

 

此教程是自我查詢資料的基礎上完善而成。

 

 

10.結束語

 

 

 

今天的分享就到這裡啦,歡迎大家點贊、轉發、留言、拍磚~

 

 

PPT連結 視訊連結

更多內容,可以加入IT交流群565734203與大家一起討論交流

這裡是技能樹·IT修真院:https://www.jnshu.com,初學者轉行到網際網路的聚集地