1. 程式人生 > >SpringCloud之訊息匯流排Spring Cloud Bus例項

SpringCloud之訊息匯流排Spring Cloud Bus例項

一、簡介

在微服務架構的系統中,我們通常會使用輕量級的訊息代理來構建一個共用的訊息主題讓系統中所有微服務例項都連線上來,由於該主題中產生的訊息會被所有例項監聽和消費,所以我們稱它為訊息匯流排。

二、訊息代理

訊息代理(Message Broker)是一種訊息驗證、傳輸、路由的架構模式。它在應用程式之間起到通訊排程並最小化應用之間的依賴的作用,使得應用程式可以高效地解耦通訊過程。訊息代理是一箇中間件產品,它的核心是一個訊息的路由程式,用來實現接收和分發訊息, 並根據設定好的訊息處理流來轉發給正確的應用。 它包括獨立的通訊和訊息傳遞協
議,能夠實現組織內部和組織間的網路通訊。設計代理的目的就是為了能夠從應用程式中傳入訊息,並執行一些特別的操作,下面這些是在企業應用中,我們經常需要使用訊息代理的場景:

  • 將訊息路由到一個或多個目的地。
  • 訊息轉化為其他的表現方式。
  • 執行訊息的聚集、訊息的分解,並將結果傳送到它們的目的地,然後重新組合響應返回給訊息使用者。
  • 呼叫Web服務來檢索資料。
  • 響應事件或錯誤。
  • 使用釋出-訂閱模式來提供內容或基千主題的訊息路由。
目前已經有非常多的開源產品可以供大家使用, 比如:
  • ActiveMQ
  • Kafka
  • RabbitMQ
  • RocketMQ
  • 等......

三、SpringCloud+RabbitMQ

(1)RabbitMQ簡介、安裝不贅述。

(2)pom.xml

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-amqp</artifactId>
	</dependency>

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>
(3)application.yml
spring:
  application:
    name: rabbitmq-hello
  rabbitmq:
    host: ***.***.***.***
    port: 5672
    username: guest
    password: guest
(4)傳送者Sender

@Component
public class Sender {

    private static final Logger log = LoggerFactory.getLogger(Sender.class);
    @Autowired
    private AmqpTemplate amqpTemplate;

    public void send() {
        String context = "hello " + new Date();
        log.info("Sender : " + context);
        this.amqpTemplate.convertAndSend("hello", context);
    }
}
(5)接受者Receiver
@Component
@RabbitListener(queues = "hello")
public class Receiver {

    private static final Logger log = LoggerFactory.getLogger(Receiver.class);

    @RabbitHandler
    public void process(String hello) {
        log.info("Receiver : " + hello);
    }
}
(6)建立RabbitMQ的配置類 RabbitConfig
@Configuration
public class RabbitConfig {

    @Bean
    public Queue helloQueue(){
        return new Queue("hello");
    }
}
(7)建立單元測試類, 用來呼叫訊息生產

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = SpringcloudbusrabbitmqApplication.class)
public class HelloApplicationTests {

    @Autowired
    private Sender sender;

    @Test
    public void hello() throws Exception {
        sender.send();
    }
}
(8)測試,執行HelloApplicationTests


(9)訪問host:15672


四、改造Config-Client(整合springcloud bus)

(1)pom.xml

<dependencies>
	<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.cloud</groupId>
		<artifactId>spring-cloud-starter-eureka</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-bus-amqp</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-actuator</artifactId>
	</dependency>

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>
(2)bootstrap.properties
spring.application.name=configspace
spring.cloud.config.label=master
spring.cloud.config.profile=dev
spring.cloud.config.uri= http://localhost:5588/
eureka.client.serviceUrl.defaultZone=http://localhost:5555/eureka/

server.port=5589

spring.rabbitmq.host=118.89.237.88
spring.rabbitmq.port= 5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

management.security.enabled=false
(3)其他不用改變

五、測試

(1)測試準備

  1. 一個服務註冊中心,EUREKASERVER,埠為5555;
  2. 一個分散式配置中心,ConfigServer,埠為5588;
  3. 二個分散式配置,ConfigClient,埠為5589、5590;
(2)訪問http://localhost:5589/from


(3)訪問http://localhost:5590/from


RabbitMQ:


(4)去倉庫修改password的值

from=git-dev-v1.0 by springcloud config-server
username=springcloud
password=1234567890
(5)POST請求http://localhost:5589/bus/refresh或者http://localhost:5590/bus/refresh


  • 成功請求後config-client會重新讀取配置檔案

(6)再次訪問

  • 如果POST請求的是:http://localhost:5589/bus/refresh,請訪問http://localhost:5590/from
  • 如果訪問出現401,則配置需要加上management.security.enabled=false


  • 如果POST請求的是:http://localhost:5590/bus/refresh,請訪問http://localhost:5589/from

  • 另/bus/refresh介面可以指定服務,即使用“username”引數,比如 “/bus/refresh?destination=username:**”即重新整理服務名為username的所有服務,不管ip地址。

(7)架構


(8)架構調整

既然SpringCloud Bus的/bus/refresh介面提供了針對服務和例項進行配置更新的引數,那麼我們的架構也可以相應做出一些調整。在之前的架構中,服務的配置更新需要通過向具體服務中的某個例項傳送請求,再觸發對整個服務叢集的配置更新。雖然能實現功能,但是這樣的結果是,我們指定的應用例項會不同千叢集中的其他應用例項,這樣會增加叢集內部的複雜度,不利於將來的運維工作。比如, 需要對服務例項進行遷移,那麼我們不得不修改Web Hook中的配置等。所以要儘可能地讓服務叢集中的各個節點是對等的。

因此, 我們將之前的架構做了 一些調整, 如下圖所示:


主要做了以下這些改動:

  1. 在ConfigServer中也引入SpringCloud Bus,將配置服務端也加入到訊息匯流排中來。
  2. /bus/refresh請求不再發送到具體服務例項上,而是傳送給Config Server,並通過des巨nation引數來指定需要更新配置的服務或例項。

參考資料《Spring Cloud微服務實戰》

新手一枚,歡迎拍磚~ ~ ~


相關推薦

SpringCloud訊息匯流排Spring Cloud Bus例項

一、簡介 在微服務架構的系統中,我們通常會使用輕量級的訊息代理來構建一個共用的訊息主題讓系統中所有微服務例項都連線上來,由於該主題中產生的訊息會被所有例項監聽和消費,所以我們稱它為訊息匯流排。 二、訊息代理 訊息代理(Message Broker)是一種訊息驗證、傳輸、路由

關於SpringCloud微服務雲架構構建B2B2C電子商務平臺-(八)訊息匯流排(Spring Cloud Bus)

  Spring Cloud Bus 將分散式的節點用輕量的訊息代理連線起來。它可以用於廣播配置檔案的更改或者服務之間的通訊,也可以用於監控。本文要講述的是用Spring Cloud Bus實現通知微服務架構的配置檔案的更改。 一、準備工作本文還是基於上一篇文章來實現。按照官方文件,我們只需要在

SpringCloud微服務雲架構構建B2B2C電子商務平臺-(八)訊息匯流排(Spring Cloud Bus)

Spring Cloud Bus 將分散式的節點用輕量的訊息代理連線起來。它可以用於廣播配置檔案的更改或者服務之間的通訊,也可以用於監控。本文要講述的是用Spring Cloud Bus實現通知微服務架構的配置檔案的更改。 一、準備工作 本文還是基於上一篇文章來實現。按照官方文件,我們只需要在配

Spring Cloud 進階路 -- 訊息匯流排 Spring Cloud Bus 配置手動重新整理和動態自動重新整理

Spring Cloud Bus 配置步驟: 1、Spring Cloud Config 專案引入依賴,新增配置,配置暴露 endpoints 2、啟動Config 專案,註冊到Eureka,自動新增RabbitMQ佇列 3、客戶端的order應用引入依賴及配置,啟動Con

史上最簡單的SpringCloud教程 | 第八篇: 訊息匯流排(Spring Cloud Bus)

最新Finchley版本請訪問: https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f8-bus/ 或者 http://blog.csdn.net/forezp/article/details/81041062

原 史上最簡單的SpringCloud教程 | 第八篇: 訊息匯流排(Spring Cloud Bus)(Finchley版本)

轉載請標明出處: Spring Cloud Bus 將分散式的節點用輕量的訊息代理連線起來。它可以用於廣播配置檔案的更改或者服務之間的通訊,也可以用於監控。本文要講述的是用Spring Cloud Bus實現通知微服務架構的配置檔案的更改。 一、準備工作

SpringCloud入門教學|第七篇:訊息匯流排(Spring Cloud Bus

Spring Cloud Bus將分散式系統的節點與輕量級訊息代理連結。這可以用於廣播狀態更改(例如配置更改)或其他管理指令。一個關鍵的想法是,匯流排就像一個分散式執行器,用於擴充套件的Spring Boot應用程式,但也可以用作應用程式之間的通訊通道。目

SpringCloud教程 | 第八篇: 訊息匯流排(Spring Cloud Bus)(Finchley版本)

Spring Cloud Bus 將分散式的節點用輕量的訊息代理連線起來。它可以用於廣播配置檔案的更改或者服務之間的通訊,也可以用於監控。本文要講述的是用Spring Cloud Bus實現通知微服務架構的配置檔案的更改。 一、準備工作 本文還是基於上一篇文章來實現。

一起來學Spring Cloud | 第八章:訊息匯流排(Spring Cloud Bus)

上一章節,我們講解了分散式配置中心spring cloud config,我們把配置項存放在git或者本地,當我們修改配置時,需要重新啟動服務才能生效。但是在生產上,一個服務部署了多臺機器,重新啟動比較麻煩且會短暫影響使用者體驗。spring cloud生態在發展,肯定有對應的解決之法,接下來將要講解的Spr

Spring Cloud 入門教程(七): 訊息匯流排(Spring Cloud Bus)(Greenwich.RELEASE)

參考網址:https://blog.csdn.net/forezp/article/details/81041062,由於此文中作

(十七)Java springcloud B2B2C o2o多使用者商城 springcloud架構-訊息驅動 Spring Cloud Stream

在使用spring cloud雲架構的時候,我們不得不使用Spring cloud Stream,因為訊息中介軟體的使用在專案中無處不在,我們公司後面做了娛樂方面的APP,在使用spring cloud做架構的時候,其中訊息的非同步通知,業務的非同步處理都需要使用訊息中介軟體機制。spring cl

springcloud系列—Bus—第7章-1: Spring Cloud bus 訊息匯流排

參考:https://www.jianshu.com/p/730d86030a41 目錄 RabbitMQ實現訊息匯流排 spring boot 整合 RabbitMQ RabbitMQ實現訊息匯流排 原理分析 指定重新整理範圍 架構優化 kafka實現訊息匯流排

SpringCloud訊息驅動的微服務Spring Cloud Stream例項

一、簡介 Spring Cloud Stream是一個用來為微服務應用構建訊息驅動能力的框架。它可以基於Spring Boot 來建立獨立的、可用於生產的 Spring 應用程式。它通過使用 Spring Integration來連線訊息代理中介軟體以實現訊息事件驅動。Sp

SpringCloud教程 | 第13篇:高可用的分散式配置中心 Spring Cloud Bus 訊息匯流排整合(RabbitMQ)

上一篇文章,留了一個懸念,Config Client 實現配置的實時更新,我們可以使用 /refresh 介面觸發,如果所有客戶端的配置的更改,都需要手動觸發客戶端 /refresh ,當服務越來越多的時候,那豈不是維護成本很高,顯然不太合適,而使用Spring Cloud

跟我學SpringCloud | 第八篇:Spring Cloud Bus 訊息匯流排

SpringCloud系列教程 | 第八篇:Spring Cloud Bus 訊息匯流排 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 前面兩篇文章我們聊了Spring Cloud Config配置

Spring Cloud Bus(訊息匯流排)(1)

訊息代理 訊息代理是一種訊息驗證、傳輸、路由的架構模式。它在應用程式之間起到通訊排程並最小化應用之間的依賴作用,使得應用程式可以高效地解耦通訊過程。訊息代理是一箇中間件產品,它的核心是一個訊息的路由程式,用來實現接受和分發訊息,並根據設定好的訊息處理流來轉發給正確的應用。它包括獨立的通訊和訊

十二、SpringCloudSpring Cloud Bus配置中心

一、簡介 ConfigServer使用了Spring Cloud Bus之後(引入Spring Cloud Bus用來操作訊息佇列),會對外提供一個介面,叫做bus-refresh,遠端git訪問這個介面ConfigServer就會把配置更新的資訊傳送到訊息佇列(RabbitMQ)裡面,Co

SpringCloud系列第09節訊息匯流排Bus

其中提到,每次熱載入屬性時,都要逐次呼叫每個應用的 /refresh 介面(或者維護 Git 倉庫的 Webhooks)來觸發屬性更新 隨著系統的擴充,應用的增加,若所有的觸發動作都要手工去做(或者維護 Git 倉庫的 Webhooks),這是不人道的 所以我們希望配

十一:Spring Cloud 訊息匯流排-

1. 簡介 Spring Cloud Bus links the nodes of a distributed system with a lightweight message broker. This broker can then be used to

Spring Cloud學習筆記27——訊息匯流排Spring Cloud Bus

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