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
有志者,事竟成。