1. 程式人生 > >Spring Cloud Bus之RabbitMQ初窺 ( 16 )

Spring Cloud Bus之RabbitMQ初窺 ( 16 )

轉自 https://blog.csdn.net/u012702547/article/details/77823434

這個系列我感覺真的太好了,可以一步一步的瞭解spring cloud 的搭建以及更深層次的東西,對想學這門技術的朋友真的入門特別的快,感謝這位大哥的分享,我也會持續的更新過來。

和Spring Cloud Config一樣,我們接下來要聊的Spring Cloud Bus也是微服務架構系統中的必備元件。Spring Cloud Bus可以將分散式系統的節點與輕量級訊息代理連結,然後可以實現廣播狀態更改(例如配置更改)或廣播其他管理指令。Spring Cloud Bus就像一個分散式執行器,用於擴充套件的Spring Boot應用程式,但也可以用作應用程式之間的通訊通道。那麼這裡就涉及到了訊息代理,目前流行的訊息代理中介軟體有不少,Spring Cloud Bus支援RabbitMQ和Kafka,本文我們主要來看看RabbitMQ的基本使用。


本文是Spring Cloud系列的第二十六篇文章,瞭解前二十五篇文章內容有助於更好的理解本文:

1.使用Spring Cloud搭建服務註冊中心 
2.使用Spring Cloud搭建高可用服務註冊中心 
3.Spring Cloud中服務的發現與消費 
4.Eureka中的核心概念 
5.什麼是客戶端負載均衡 
6.Spring RestTemplate中幾種常見的請求方式 
7.RestTemplate的逆襲之路,從傳送請求到負載均衡 
8.Spring Cloud中負載均衡器概覽 
9.Spring Cloud中的負載均衡策略

 
10.Spring Cloud中的斷路器Hystrix 
11.Spring Cloud自定義Hystrix請求命令 
12.Spring Cloud中Hystrix的服務降級與異常處理 
13.Spring Cloud中Hystrix的請求快取 
14.Spring Cloud中Hystrix的請求合併 
15.Spring Cloud中Hystrix儀表盤與Turbine叢集監控 
16.Spring Cloud中宣告式服務呼叫Feign 
17.Spring Cloud中Feign的繼承特性 
18.
Spring Cloud中Feign配置詳解
 
19.Spring Cloud中的API閘道器服務Zuul 
20.Spring Cloud Zuul中路由配置細節 
21.Spring Cloud Zuul中異常處理細節 
22.分散式配置中心Spring Cloud Config初窺 
23.Spring Cloud Config服務端配置細節(一) 
24.Spring Cloud Config服務端配置細節(二)之加密解密 
25.Spring Cloud Config客戶端配置細節


RabbitMQ安裝配置

RabbitMQ是用Erlang語言編寫的,因此安裝RabbitMQ之前我們要先安裝Erlang環境,首先去http://www.erlang.org/downloads地址下載erlang,下載到的是一個exe檔案,直接雙擊安裝即可,然後去http://www.rabbitmq.com/download.html地址下載RabbitMQ,下載成功之後,也是一個exe,雙擊安裝即可(我在網上看到有人說安裝目錄不能有空格,我自己的軟體安裝目錄都是沒有空格的,所以沒去驗證這句話真假,小夥伴們注意下別掉坑裡了)。RabbitMQ安裝成功之後,預設會建立系統服務,將和Windows系統一起啟動。所以安裝成功之後,開啟系統服務,我們如果看到如下結果表示安裝成功了:

這裡寫圖片描述

安裝成功之後,我們可以使用web來管理我們的RabbitMQ,管理之前需要我們先開啟web管理功能,開啟方式:進入到安裝目錄的sbin目錄下,然後執行 .\rabbitmq-plugins enable rabbitmq_management命令,如下:

這裡寫圖片描述

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

這裡寫圖片描述

這個管理頁面涉及到的資訊面板比較多,我們後面在用到的時候都會給小夥伴們一一介紹,好了,登入成功之後,我們可以先嚐試建立一個使用者,建立使用者頁面如下:

這裡寫圖片描述

輸入使用者名稱密碼就可以建立了,tags表示使用者標籤,相當於角色,可選值有management、none、policymaker、monitoring和administrator,不同取值所對應的許可權區別如下:

none

1.不能訪問 management plugin

management

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

1.列出自己可以通過AMQP登入的virtual hosts 
2.檢視自己的virtual hosts中的queues, exchanges 和 bindings 
3.檢視和關閉自己的channels 和 connections 
4.檢視有關自己的virtual hosts的“全域性”的統計資訊,包含其他使用者在這些virtual hosts中的活動

policymaker

management可以做的任何事外加:

1.檢視、建立和刪除自己的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

OK,我這裡就自己建立一個sang使用者一會使用(當然不建立也可以,不建立就直接使用預設的guest使用者),sang使用者建立好之後,點選使用者名稱,給使用者設定virtual hosts,否則一會使用這個使用者的時候會報錯。設定方式如下:

這裡寫圖片描述

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

簡單案例

整合案例是非常簡單的。

工程建立

首先我們來建立一個普通的Spring Boot工程,然後新增如下依賴:

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

屬性配置

接下來在application.properties中配置RabbitMQ的連線資訊,如下:

spring.application.name=rabbitmq-hello
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=sang
spring.rabbitmq.password=123456
server.port=2009

這裡我們分別配置了RabbitMQ的地址為localhost,埠為5672(注意這裡沒寫錯,web管理端埠是15672),使用者名稱和密碼則是我們剛剛創建出來的(也可以使用預設的guest)。

建立訊息生產者

傳送訊息我們有一個現成的封裝好的物件AmqpTemplate,通過AmqpTemplate我們可以直接向某一個訊息佇列傳送訊息,訊息生產者的定義方式如下:

@Component
public class Sender {
    @Autowired
    private AmqpTemplate rabbitTemplate;
    public void send() {
        String msg = "hello rabbitmq:"+new Date();
        System.out.println("Sender:"+msg);
        this.rabbitTemplate.convertAndSend("hello", msg);
    }
}

注入AmqpTemplate,然後利用AmqpTemplate向一個名為hello的訊息佇列中傳送訊息。

建立訊息消費者

@Component
@RabbitListener(queues = "hello")
public class Receiver {
    @RabbitHandler
    public void process(String msg) {
        System.out.println("Receiver:"+msg);
    }
}

@RabbitListener(queues = “hello”)註解表示該訊息消費者監聽hello這個訊息佇列,@RabbitHandler註解則表示process方法是用來處理接收到的訊息的,我們這裡收到訊息後直接列印即可。

配置訊息佇列Bean

@Configuration
public class RabbitConfig {
    @Bean
    public Queue helloQueue() {
        return new Queue("hello");
    }
}

建立一個名為hello的訊息佇列。

測試

建立單元測試類,用來發送訊息,如下:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = RabbitmqHelloApplication.class)
public class RabbitmqHelloApplicationTests {

    @Autowired
    private Sender sender;

    @Test
    public void contextLoads() {
        sender.send();
    }
}

上面所有的工作做完後,我們就可以啟動我們的Spring Boot工程了,啟動成功後,我們可以在啟動日誌中看到如下內容:

這裡寫圖片描述

這個表示程式已經建立了一個訪問RabbitMQ的連線,此時在RabbitMQ的web管理面板中,我們也可以看到連線資訊,如下:

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

此時執行執行單元測試傳送傳送一條訊息,我們可以在單元測試執行的控制檯看到如下日誌,表示訊息已經發送出去了:

這裡寫圖片描述

然後在程式執行的控制檯也可以看到如下日誌,表示訊息已經接收到了:

這裡寫圖片描述

好了,RabbitMQ我們就先介紹到這裡,有問題歡迎小夥伴們留言討論。