天天看點

CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結

文章目錄

  • 前言
  • 一、環境準備
  • 二、部署RabbitMQ
    • 1.在機器1上安裝RabbitMQ
      • 執行指令
      • 部分參數解釋
      • docker ps -a ,檢視容器狀态
      • 浏覽器輸入RabbitMQ管理位址
    • 2.在機器2上安裝RabbitMQ
      • 執行指令
      • docker ps -a ,檢視容器狀态
      • 浏覽器輸入RabbitMQ管理位址
  • 三、搭建普通叢集模式
    • 1.rabbitmq1容器配置
      • 進入容器
      • 進入容器後通過rabbitmqctl指令對MQ進行操作
    • 2.rabbitmq2容器配置
      • 進入容器
      • 進入容器後通過rabbitmqctl指令對MQ進行操作
  • 四、代碼測試
    • 1.rabbitmq-provider相關代碼
      • pom依賴
      • 配置檔案
      • 配置類
      • 測試類
    • 2.rabbitmq-receiver相關代碼
      • 消息接收類
    • 3.反向測試
  • 五、嘗試鏡像模式
    • 1.建立Policies
    • 2.反向測試
      • 發送了一條消息
      • 關閉其中一個執行個體
      • 啟動receiver服務
  • 總結

前言

因項目需要使用RabbitMQ來進行子產品之前的消息傳遞,且之前未有相關的經驗,是以特此記錄下RabbitMQ叢集的搭建及調試過程。另外簡單的介紹下RabbitMQ的兩種叢集模式,即普通模式與鏡像模式,這兩種模式的差別就是在于普通模式僅會同步中繼資料,當消費消息時,如果連接配接到了另外一個執行個體,那麼那個執行個體會通過中繼資料定位到隊列所在位置,然後通路隊列所在的執行個體,拉取資料過來發送給消費者;而叢集模式會同步所有的副本資料,每次寫入消息時都會自動把資料同步到多台執行個體上去。

一、環境準備

  1. 兩台雲伺服器(centos7.5-丐版-1核2G),若沒有,可用虛拟機。

    兩台伺服器ip如下:

    機器1:1.117.251.181

    機器2:121.36.159.27

  2. 已有docker鏡像,本人用的鏡像為:rabbitmq:3.7.16-management
    CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結

二、部署RabbitMQ

1.在機器1上安裝RabbitMQ

執行指令

docker run  -d --hostname rabbitmq1 --add-host=rabbitmq2:121.36.159.27 --restart=unless-stopped --name rabbitmq1 --net host -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_COOKIE='rabbit_mq_2022' rabbitmq:3.7.16-management
           

部分參數解釋

--hostname rabbitmq1 容器的主機名為 rabbitmq1

--add-host=rabbitmq2:121.36.159.27  修改容器内部的hosts

--restart=unless-stopped docker 容器重新開機後重新開機MQ

--name rabbitmq1 容器名為rabbitma1

-e RABBITMQ_DEFAULT_USER=admin 設定rabbitmq預設使用者為admin

-e RABBITMQ_DEFAULT_PASS=admin 設定rabbitmq預設密碼為admin

-e RABBITMQ_ERLANG_COOKIE='rabbit_mq_2022' 設定rabbitmq的cookie為“rabbit_mq_2022”,可以自定義為其他文本,容器保持一緻即可
           

docker ps -a ,檢視容器狀态

CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結

浏覽器輸入RabbitMQ管理位址

CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結

2.在機器2上安裝RabbitMQ

執行指令

docker run  -d --hostname rabbitmq2 --add-host=rabbitmq1:1.117.251.181 --restart=unless-stopped --name rabbitmq2 --net host -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_COOKIE='rabbit_mq_2022' rabbitmq:3.7.16-management
           

docker ps -a ,檢視容器狀态

CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結

浏覽器輸入RabbitMQ管理位址

CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結

tips: 對于有雲伺服器的朋友,這邊的話需要在雲伺服器的控制台配置對應的防火牆(安全組)政策,需要将5672、15672、25672、4369配置進去。

三、搭建普通叢集模式

1.rabbitmq1容器配置

進入容器

docker exec -it rabbitmq1 /bin/bash
           

進入容器後通過rabbitmqctl指令對MQ進行操作

#首先停止目前MQ
rabbitmqctl stop_app
#resetMQ
rabbitmqctl reset
#重新啟動MQ
rabbitmqctl start_app
退出容器
exit
           

2.rabbitmq2容器配置

進入容器

docker exec -it rabbitmq2 /bin/bash
           

進入容器後通過rabbitmqctl指令對MQ進行操作

#首先停止目前MQ
rabbitmqctl stop_app
#resetMQ
rabbitmqctl reset
#跟機器1的消息隊列建立關系
rabbitmqctl join_cluster --ram [email protected]
#重新啟動MQ
rabbitmqctl start_app
退出容器
exit
           

這時rabbitmq1與rabbitmq2的叢集關系搭建完成,可以去管理頁面看下。

CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結

四、代碼測試

建立兩個子產品,rabbitmq-provider(消息生産者),rabbitmq-receiver(消息接收者)。

1.rabbitmq-provider相關代碼

pom依賴

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

配置檔案

spring.rabbitmq.addresses=1.117.251.181:5672,121.36.159.27:5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
           

配置類

package com.qcc.rabbitmqprovider.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


/**
 * @建立人 qianchengcheng
 * @建立時間 2022/4/28
 * @描述 rabbitmq配置類
 */
@Configuration
public class RabbitmqConfig {

    public static final String QCC_QUEUE_NAME = "qcc_queue_name";
    public static final String QCC_EXCHANGE_NAME = "qcc_exchange_name";

    @Bean
    Queue queue() {
        return new Queue(QCC_QUEUE_NAME, true, false, false);
    }

    @Bean
    FanoutExchange directExchange() {
        return new FanoutExchange(QCC_EXCHANGE_NAME, true, false);
    }

    @Bean
    Binding binding() {
        return BindingBuilder.bind(queue())
                .to(directExchange());
    }
}
           

測試類

package com.qcc.rabbitmqprovider;

import com.qcc.rabbitmqprovider.config.RabbitmqConfig;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class RabbitmqProviderApplicationTests {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    void contextLoads() {
        rabbitTemplate.convertAndSend(RabbitmqConfig.QCC_EXCHANGE_NAME,null,"hello~qcc");
    }

}
           

運作下測試類,消息發送成功後,可以在管理頁面看到隊列中的消息

CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結
CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結

2.rabbitmq-receiver相關代碼

其他配置、代碼均一樣,新增一個消息接收類

消息接收類

package com.qcc.rabbitmq.receiver;

import com.qcc.rabbitmq.config.RabbitmqConfig;
import com.rabbitmq.client.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @建立人 qianchengcheng
 * @建立時間 2022/4/28
 * @描述 rabbitmq消費者
 */
@Component
public class RabbitReceiveMessage {

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

    @RabbitListener(queues = RabbitmqConfig.QCC_QUEUE_NAME)
    @RabbitHandler
    public void msg(Message message, Channel channel) throws IOException{
        try {
            byte[] body = message.getBody();
            log.info("接收的消息為:{}",new String(body,"utf-8"));
        }catch (Exception e){
            e.printStackTrace();
            log.info("處理mq消息異常");
            channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
        }
    }
}
           

運作消息接收服務,此時控制台會列印出一條接收到的資料

CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結

結合mq管理系統可以看出,隊列中消息的數量都變成了0。

tips: 我們可以看到,當提供者生産了一條消息時,此時從mq的系統中發現兩個執行個體的隊列中數量均為1,但是實際上消息本身隻存在于一個 RabbitMQ 執行個體,為此,我們可以簡單的做個測試。

3.反向測試

這裡我們先停掉receiver服務,然後通過 provider 發送一條消息,發送成功之後,關閉rabbitmq1執行個體,此時再啟動我們的receiver服務,會發現沒有消息接收,這就說明了,消息并沒有進行同步。

五、嘗試鏡像模式

1.建立Policies

點選admin菜單–>右側的Policies選項–>左側最下下邊的Add/update a policy。

CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結

可以參照我的建立一個,建完之後點選左下角的 apply policy。此時隊列中已經添加了該政策,如下圖所示:

CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結

此時,我們可以按照之前的反向測試方式,對該模式進行測試。

2.反向測試

這裡我們先停掉receiver服務,然後通過 provider 發送一條消息,發送成功之後,關閉rabbitmq1執行個體,此時再啟動我們的receiver服務,會發現有一條消息接收,這就說明了,消息已經進行了同步。

發送了一條消息

CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結

關閉其中一個執行個體

CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結

啟動receiver服務

CentOS系統用docker搭建rabbitMQ叢集前言一、環境準備二、部署RabbitMQ三、搭建普通叢集模式四、代碼測試五、嘗試鏡像模式總結

總結

通過簡單的部署及測試,了解了rabbitmq普通叢集和鏡像叢集的差別,普通模式在消息未持久化的場景下,可靠性不高,而鏡像模式由于進行了消息的同步,是以可靠性高,但是由于消息的同步會有額外的性能消耗。具體使用哪個,需結合自身業務場景來定,最後,謝謝各位的觀看~