RabbitMQ集群搭建和Springboot集成實(shí)踐

RabbitMQ

環(huán)境要求

jdk 1.8+

節(jié)點(diǎn) 角色
172.30.20.250 主節(jié)點(diǎn)
172.30.20.251 從節(jié)點(diǎn)
172.30.20.252 從節(jié)點(diǎn)

1. 下載

RabbitMQ-server
    https://www.rabbitmq.com/releases/rabbitmq-server
    下載
    rabbitmq-server-3.6.15-1.el7.noarch.rpm

Erlang
    http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm

2. 安裝

rpm -ivh rabbitmq-server-3.6.15-1.el7.noarch.rpm

3. 配置

cp /usr/share/doc/rabbitmq-server-3.6.15/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
vi /etc/rabbitmq/rabbitmq.config

%% 端口
{tcp_listeners, [5672]}

%% guest賬號(hào)可通過(guò)ip訪問(wèn)rabbitmq頁(yè)面,要把最后面的逗號(hào)去掉
{loopback_users, []}

4. 啟動(dòng)

修改/etc/hosts
172.30.20.250 node1
172.30.20.251 node2
172.30.20.252 node3

同步.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie 172.30.20.251:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie 172.30.20.252:/var/lib/rabbitmq/

啟動(dòng)
systemctl start rabbitmq-server.service
systemctl enable rabbitmq-server.service

5. 搭建集群

5.1 關(guān)閉從節(jié)點(diǎn)app

rabbitmqctl stop_app

5.2 將從節(jié)點(diǎn)加入到主節(jié)點(diǎn)

一個(gè)從節(jié)點(diǎn)運(yùn)行
rabbitmqctl join_cluster --ram rabbit@node1

另一個(gè)從節(jié)點(diǎn)運(yùn)行
rabbitmqctl join_cluster --disc rabbit@node1

在RabbitMQ集群中的節(jié)點(diǎn)只有兩種類(lèi)型:內(nèi)存節(jié)點(diǎn)/磁盤(pán)節(jié)點(diǎn),單節(jié)點(diǎn)系統(tǒng)只運(yùn)行磁盤(pán)類(lèi)型的節(jié)點(diǎn)。而在集群中,可以選擇配置部分節(jié)點(diǎn)為內(nèi)存節(jié)點(diǎn)。
為了保證集群的高可用性,必須保證集群中有兩個(gè)以上的磁盤(pán)節(jié)點(diǎn),來(lái)保證當(dāng)有一個(gè)磁盤(pán)節(jié)點(diǎn)崩潰了,集群還能對(duì)外提供訪問(wèn)服務(wù)。

5.3 啟動(dòng)從節(jié)點(diǎn)app

rabbitmqctl start_app

5.4 查看集群狀態(tài)

rabbitmqctl cluster_status

6. 啟動(dòng)web管理插件

所有節(jié)點(diǎn)執(zhí)行
rabbitmq-plugins enable rabbitmq_management

訪問(wèn)
http://172.30.20.250:15672
默認(rèn)用戶(hù)名和密碼為:
guest/guest

7. 用戶(hù)管理

默認(rèn)用戶(hù)名和密碼為:
guest/guest

查看用戶(hù):
rabbitmqctl list_users

修改密碼:
rabbitmqctl change_password <username> <newPassword>

新增用戶(hù):
rabbitmqctl add_user <username> <password>

修改用戶(hù)角色:
超級(jí)管理員(administrator)、監(jiān)控(monitoring)、策略制定(policymaker)、普通管理者(management)、其他自定義名稱(chēng)
rabbitmqctl set_user_tags <username> <tag1> <tag2> ...

刪除用戶(hù):
rabbitmqctl delete_user <username>

8. 權(quán)限管理

查看所有用戶(hù)的權(quán)限
rabbitmqctl list_permissions [-p VHostPath]

查看單個(gè)用戶(hù)的權(quán)限
rabbitmqctl list_user_permissions <username>

設(shè)置權(quán)限
rabbitmqctl set_permissions -p <VHostPath> <username> <conf-pattern> <write-pattern> <read-pattern>

清除用戶(hù)權(quán)限
rabbitmqctl clear_permissions [-p VHostPath] <username>

9. 鏡像策略

普通模式:默認(rèn)的集群模式。

鏡像模式:把需要的隊(duì)列做成鏡像隊(duì)列,存在于多個(gè)節(jié)點(diǎn),屬于RabbitMQ的HA方案。只有配置了此模式,才能在主節(jié)點(diǎn)宕機(jī)后,正常使用。

9.1 設(shè)置

策略 結(jié)果
all 隊(duì)列鏡像到所有節(jié)點(diǎn)
exactly
rabbitmqctl set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>
參數(shù)名稱(chēng) 描述
-p 可選參數(shù),針對(duì)指定 vhost 下的exchange或 queue
–priority 可選參數(shù),policy 的優(yōu)先級(jí)
–apply-to 可選參數(shù),策略適用的對(duì)象類(lèi)型,其值可為 “queues”, “exchanges” 或 “all”.默認(rèn)是”all”
name policy 的名稱(chēng)
pattern 匹配模式(正則表達(dá)式)
definition 鏡像定義,json 格式,包括三部分(ha-mode,ha-params,ha-sync-mode)具體配置見(jiàn)下表

definition參數(shù)詳情

參數(shù)名稱(chēng) 描述
ha-mode 指名鏡像隊(duì)列模式,其值可為”all”,”exactly”或”nodes”,all:表示在集群所有節(jié)點(diǎn)上進(jìn)行鏡像;exactly:表示在指定個(gè)數(shù)的節(jié)點(diǎn)上鏡像,節(jié)點(diǎn)個(gè)數(shù)由 ha-params 指定;nodes:表示在指定節(jié)點(diǎn)上進(jìn)行鏡像,節(jié)點(diǎn)名稱(chēng)通過(guò)ha-params 指定。
ha-params ha-mode模式需要用到的參數(shù):exactly 模式下為數(shù)字表述鏡像節(jié)點(diǎn)數(shù),nodes 模式下為節(jié)點(diǎn)列表表示需要鏡像的節(jié)點(diǎn)。
ha-sync-mode 鏡像隊(duì)列中消息的同步方式,其值可為”automatic”或”manually”.

例子:

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

9.2 清除

rabbitmqctl clear_policy [-p <vhost>] <name>

9.3 查看

rabbitmqctl list_policies [-p <vhost>]

10. 使用

10.1 maven依賴(lài)

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

10.2 application.yml配置

spring:
  rabbitmq:
    # 集群節(jié)點(diǎn)
    addresses: 172.30.20.250:5672,172.30.20.251:5672,172.30.20.252:5672
    username: guest
    password: 123456

10.3 生產(chǎn)者

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

@Component
public class Producer {
    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void send() {
        String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());// 24小時(shí)制
        String context = "hello " + date;
        System.out.println("Producer : " + context);
        // demo 為隊(duì)列名稱(chēng)
        this.rabbitTemplate.convertAndSend("demo", context);
    }
}

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class RabbitmqDemoApplicationTests {
    @Autowired
    private Producer producer;

    @Test
    public void sendMessage() throws Exception {
        producer.send();
    }
}

10.4 消費(fèi)者

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = "demo")
public class Consumer {

    @RabbitHandler
    public void process(String hello) {
        System.out.println("Consumer  : " + hello);
    }
}

11. 問(wèn)題

11.1 問(wèn)題1

11月 26 16:06:16 node1 systemd[1]: rabbitmq-server.service: main process exited, code=exited, status=1/FAILURE
11月 26 16:06:17 node1 rabbitmqctl[40386]: Stopping and halting node rabbit@node1
11月 26 16:06:17 node1 rabbitmqctl[40386]: Error: unable to connect to node rabbit@node1: nodedown
11月 26 16:06:17 node1 rabbitmqctl[40386]: DIAGNOSTICS
11月 26 16:06:17 node1 rabbitmqctl[40386]: ===========
11月 26 16:06:17 node1 rabbitmqctl[40386]: attempted to contact: [rabbit@node1]
11月 26 16:06:17 node1 rabbitmqctl[40386]: rabbit@node1:
11月 26 16:06:17 node1 rabbitmqctl[40386]: * connected to epmd (port 4369) on node1
11月 26 16:06:17 node1 rabbitmqctl[40386]: * epmd reports: node 'rabbit' not running at all
11月 26 16:06:17 node1 rabbitmqctl[40386]: no other nodes on node1
11月 26 16:06:17 node1 rabbitmqctl[40386]: * suggestion: start the node
11月 26 16:06:17 node1 rabbitmqctl[40386]: current node details:
11月 26 16:06:17 node1 rabbitmqctl[40386]: - node name: 'rabbitmq-cli-15@node1'
11月 26 16:06:17 node1 rabbitmqctl[40386]: - home dir: .
11月 26 16:06:17 node1 rabbitmqctl[40386]: - cookie hash: Ij1egNr0lVU5H9TJmVAxfA==
11月 26 16:06:17 node1 systemd[1]: Failed to start RabbitMQ broker.
-- Subject: Unit rabbitmq-server.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit rabbitmq-server.service has failed.

原因:

rabbitmq-server和erlang版本不匹配

解決方法:

卸載重裝

12. 擴(kuò)展

12.1 移除節(jié)點(diǎn)

rabbitmqctl stop_app

rabbitmqctl reset

rabbitmqctl start_app

參考文章

RabbitMQ安裝及集群搭建
http://www.lxweimin.com/p/b6bc3cba69c2

rabbitMq集群之鏡像模式
https://blog.csdn.net/wexiaoword/article/details/81352045

SpringBoot 集成RabbitMQ集群及簡(jiǎn)單操作
https://blog.csdn.net/weixin_42465125/article/details/88429277

有志者,事竟成。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。