RabbitMQ(五)集群配置、Management UI

文章目录

  • 一、安装RabbitMQ
    • 1、前置要求
    • 2、安装docker版
      • 复制第一个节点的.erlang.cookie
      • 进入各节点命令行
      • 配置集群
      • 检查集群状态
    • 3、三台组合集群安装版
      • rabbitmq节点
      • rabbitmq-node2节点
      • rabbitmq-node3节点
  • 二、负载均衡:Management UI
    • 1、说明
    • 2、安装HAProxy
    • 3、修改配置文件
  • 三、负载均衡:核心功能
  • 四、测试
    • pom
    • 生产者
    • 消费者

一、安装RabbitMQ

1、前置要求

CentOS发行版的版本CentOS 8 Stream
下载:
官网:https://centos.org/download/
官网下载:https://wiki.centos.org/Download.html
阿里云镜像:http://mirrors.aliyun.com/centos/8-stream/isos/x86_64/
镜像下载:http://mirrors.aliyun.com/centos/8-stream/isos/x86_64/CentOS-Stream-8-x86_64-latest-boot.iso

2、安装docker版

拉取镜像

docker pull rabbitmq:3.13-management

启动容器

# 开三台修改端口地址 麻了,在这弄了好久,node3节点会去找node1和node2,所以需要两个别名都加上,注意hostname和node名称要一致(即下面name和hostname要一致)
docker run -d \
--name rabbitmq-node1 \
--hostname rabbitmq-node1 \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' \
-p 5672:5672 \
-p 15672:15672 \
-v rabbitmq-plugin:/plugins \
-e RABBITMQ_DEFAULT_USER=guest \
-e RABBITMQ_DEFAULT_PASS=123456 \
rabbitmq:3.13-management

docker run -d \
--name rabbitmq-node2 \
--hostname rabbitmq-node2 \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' \
-p 5673:5672 \
-p 15673:15672 \
--link rabbitmq-node1:rabbitmq-node1 \
-v rabbitmq-plugin:/plugins \
-e RABBITMQ_DEFAULT_USER=guest \
-e RABBITMQ_DEFAULT_PASS=123456 \
rabbitmq:3.13-management

docker run -d \
--name rabbitmq-node3 \
--hostname rabbitmq-node3 \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' \
-p 5674:5672 \
-p 15674:15672 \
--link rabbitmq-node1:rabbitmq-node1 \
--link rabbitmq-node2:rabbitmq-node2 \
-v rabbitmq-plugin:/plugins \
-e RABBITMQ_DEFAULT_USER=guest \
-e RABBITMQ_DEFAULT_PASS=123456 \
rabbitmq:3.13-management

使用docker ps
在这里插入图片描述
检查是否成功启动
在这里插入图片描述

查看所有容器网络配置:默认网络配置为桥接模式

docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

在这里插入图片描述

复制第一个节点的.erlang.cookie

# 先复制到本地/opt/test,不可直接在两个容器中复制会报错
docker cp rabbitmq-node1:/var/lib/rabbitmq/.erlang.cookie /opt/test

docker cp /opt/test/.erlang.cookie  rabbitmq-node2:/var/lib/rabbitmq/.erlang.cookie
docker cp /opt/test/.erlang.cookie  rabbitmq-node3:/var/lib/rabbitmq/.erlang.cookie

在rabbitmq-node1、rabbitmq-node2、rabbitmq-node3查看内容是否一致

more /var/lib/rabbitmq/.erlang.cookie

进入各节点命令行

docker exec -it rabbitmq-node1 /bin/bash
docker exec -it rabbitmq-node2 /bin/bash
docker exec -it rabbitmq-node3 /bin/bash
# 进入rabbitmq-node2容器命令行
apt update
apt install curl -y
curl rabbitmq-node1:15672

检查别名是否生效(因为在容器中命令行无法修改hosts文件,所以在启动时通过配置别名来访问另一个容器),使用curl查看是否有返回
在这里插入图片描述

配置集群

进入rabbitmq-node2、rabbitmq-node3容器命令行

# 执行代码
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbitmq-node1
rabbitmqctl start_app

检查集群状态

rabbitmqctl cluster_status

其他博客参考案例:https://blog.csdn.net/want_you_gogo/article/details/120850605

3、三台组合集群安装版

rabbitmq节点

查看rabbitmq节点cookie值并记录

more /var/lib/rabbitmq/.erlang.cookie 

在这里插入图片描述

AJRZLSANMKBYKOAXMSIA

重置节点应用

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

配置hostname

# 修改文件vim /etc/hosts,追加如下内容:
172.17.0.2 node1
172.17.0.3 node2
172.17.0.4 node3
# 退出rabbitmq节点容器
exit

rabbitmq-node2节点

修改rabbitmq节点cookie值和第一个节点一样

vim /var/lib/rabbitmq/.erlang.cookie
# 如果无法修改
# 先退出vim
:!e
:q
# 赋权
chmod 700 /var/lib/rabbitmq/.erlang.cookie

在这里插入图片描述

AJRZLSANMKBYKOAXMSIA

配置hostname

# 修改文件vim /etc/hosts,追加如下内容:
172.17.0.2 node1
172.17.0.3 node2
172.17.0.4 node3

重置节点应用(这里注意和第一个节点不同)

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app

在这里插入图片描述

# 退出rabbitmq节点容器
exit

rabbitmq-node3节点

修改rabbitmq节点cookie值和第一个节点一样

vim /var/lib/rabbitmq/.erlang.cookie
# 如果无法修改
# 先退出vim
:!e
:q
# 赋权
chmod 700 /var/lib/rabbitmq/.erlang.cookie

在这里插入图片描述

AJRZLSANMKBYKOAXMSIA

配置hostname

# 修改文件vim /etc/hosts,追加如下内容:
172.17.0.2 node1
172.17.0.3 node2
172.17.0.4 node3

重置节点应用

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app
# 退出rabbitmq节点容器
exit

二、负载均衡:Management UI

1、说明

  • 其实访问任何一个RabbitMQ实例的管理界面都是对集群操作,所以配置负载均衡通过统一入口访问在我们学习期间就是锦上添花
  • 先给管理界面做负载均衡,然后方便我们在管理界面上创建交换机、队列等操作

2、安装HAProxy

yum install -y haproxy
haproxy -v
systemctl start haproxy
systemctl enable haproxy

3、修改配置文件

配置文件位置:

/etc/haproxy/haproxy.cfg

在配置文件末尾增加如下内容:

frontend rabbitmq_ui_frontend
bind 192.168.200.100:22222
mode http
default_backend rabbitmq_ui_backend

backend rabbitmq_ui_backend
mode http
balance roundrobin
option httpchk GET /
server rabbitmq_ui1 192.168.200.100:15672 check
server rabbitmq_ui2 192.168.200.150:15672 check
server rabbitmq_ui3 192.168.200.200:15672 check

设置SELinux策略,允许HAProxy拥有权限连接任意端口:

setsebool -P haproxy_connect_any=1

SELinux是Linux系统中的安全模块,它可以限制进程的权限以提高系统的安全性。在某些情况下,SELinux可能会阻止HAProxy绑定指定的端口,这就需要通过设置域(domain)的安全策略来解决此问题。

通过执行setsebool -P haproxy_connect_any=1命令,您已经为HAProxy设置了一个布尔值,允许HAProxy连接到任意端口。这样,HAProxy就可以成功绑定指定的socket,并正常工作。

重启HAProxy:

systemctl restart haproxy

检查是否成功组建集群
在这里插入图片描述

三、负载均衡:核心功能

新增

vim /etc/haproxy/haproxy.cfg

在配置文件末尾增加如下内容:

frontend rabbitmq_frontend
bind 192.168.217.134:11111
mode tcp
default_backend rabbitmq_backend

backend rabbitmq_backend
mode tcp
balance roundrobin
server rabbitmq1 127.0.0.1:5672 check
server rabbitmq2 127.0.0.1:5673 check
server rabbitmq3 127.0.0.1:5674 check

四、测试

创建组件

  • 交换机:exchange.cluster.test
  • 队列:queue.cluster.test
  • 路由键:routing.key.cluster.test

pom

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.5</version>
</parent>

<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>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

生产者

主启动类

package com.atguigu.mq;  
  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
  
@SpringBootApplication
public class RabbitMQProducerMainType {

    public static void main(String[] args) {
        SpringApplication.run(RabbitMQProducerMainType.class, args);
    }

}

配置YAML

spring:
  rabbitmq:
    host: 192.168.217.134
    port: 11111
    username: guest
    password: 123456
    virtual-host: /
    publisher-confirm-type: CORRELATED # 交换机的确认
    publisher-returns: true # 队列的确认
logging:
  level:
    com.atguigu.mq.config.MQProducerAckConfig: info

配置类

package com.atguigu.mq.config;

import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

@Configuration
@Slf4j
public class MQProducerAckConfig implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnsCallback{

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void init() {
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnsCallback(this);
    }

    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if (ack) {
            log.info("消息发送到交换机成功!数据:" + correlationData);
        } else {
            log.info("消息发送到交换机失败!数据:" + correlationData + " 原因:" + cause);
        }
    }

    @Override
    public void returnedMessage(ReturnedMessage returned) {
        log.info("消息主体: " + new String(returned.getMessage().getBody()));
        log.info("应答码: " + returned.getReplyCode());
        log.info("描述:" + returned.getReplyText());
        log.info("消息使用的交换器 exchange : " + returned.getExchange());
        log.info("消息使用的路由键 routing : " + returned.getRoutingKey());
    }
}

测试类

package com.atguigu.mq.test;

import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class RabbitMQTest {

    @Resource
    private RabbitTemplate rabbitTemplate;

    public static final String EXCHANGE_CLUSTER_TEST = "exchange.cluster.test";
    public static final String ROUTING_KEY_CLUSTER_TEST = "routing.key.cluster.test";

    @Test
    public void testSendMessage() {
        rabbitTemplate.convertAndSend(EXCHANGE_CLUSTER_TEST, ROUTING_KEY_CLUSTER_TEST, "message test cluster~~~");
    }

}

消费者

主启动类

package com.atguigu.mq;  
  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
  
@SpringBootApplication
public class RabbitMQProducerMainType {

    public static void main(String[] args) {
        SpringApplication.run(RabbitMQProducerMainType.class, args);
    }

}

配置YAML

spring:
  rabbitmq:
    host: 192.168.217.134
    port: 11111
    username: guest
    password: 123456
    virtual-host: /
    listener:
      simple:
        acknowledge-mode: manual
logging:
  level:
    com.atguigu.mq.listener.MyProcessor: info

监听器

package com.atguigu.mq.listener;

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
@Slf4j
public class MyProcessor {

    @RabbitListener(queues = {"queue.cluster.test"})
    public void processNormalQueueMessage(String data, Message message, Channel channel) 
        throws IOException {
        
        log.info("消费端:" + data);

        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
    }

}

在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/694665.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

找出链表倒数第k个元素-链表题

LCR 140. 训练计划 II - 力扣&#xff08;LeetCode&#xff09; 快慢指针。快指针臂慢指针快cnt个元素到最后&#xff1b; class Solution { public:ListNode* trainingPlan(ListNode* head, int cnt) {struct ListNode* quick head;struct ListNode* slow head;for(int i …

Spring配置多数据库(采用数据连接池管理)

一&#xff0c;前言 大家在开发过程中&#xff0c;如果项目大一点就会遇到一种情况&#xff0c;同一个项目中可能会用到很多个数据源&#xff0c;那么这篇文章&#xff0c;博主为大家分享在spring应用中如何采用数据库连接池的方式配置配置多数据源。 本篇文章采用大家用的最…

音视频转为文字SuperVoiceToText

音视频转为文字SuperVoiceToText&#xff0c;它能够把视频或语音文件高效地转换为文字&#xff0c;它是基于最为先进的 AI 大模型&#xff0c;通过在海量语音资料上进行训练学习而造就&#xff0c;具备极为卓越的识别准确率。 不仅如此&#xff0c;它支持包括汉语、英语、日语…

Java Set系列集合的使用规则和场景(HashSet,LinkedHashSet,TreeSet)

Set集合 package SetDemo;import java.util.HashSet; import java.util.Iterator; import java.util.Set;public class SetDemo {public static void main(String[] args) {/*Set集合的特点&#xff1a;1.Set系列集合的特点&#xff1a;Set集合是一个存储元素不能重复的集合方…

如何下载BarTender软件及详细安装步骤

BarTender是美国海鸥科技推出的一款优秀的条码打印软件&#xff0c;应用于 WINDOWS95 、 98 、 NT 、 XP 、 2000 、 2003 和 3.1 版本&#xff0c; 产品支持广泛的条形码码制和条形码打印机&#xff0c; 不但支持条形码打印机而且支持激光打印机&#xff0c;还为世界知名品牌条…

Modbus主站和从站的区别

Modbus主站,从站 在工业自动化领域&#xff0c;Modbus是一种常用的通信协议&#xff0c;用于设备之间的数据交换。在Modbus通信中&#xff0c;主站和从站是两个关键的角色。了解主站和从站之间的区别对正确配置和管理Modbus网络至关重要。 Modbus主站的特点和功能 1.通信请求发…

嵌入式仪器模块:音频综测仪和自动化测试软件

• 24 位分辨率 • 192 KHz 采样率 • 支持多种模拟/数字音频信号的输入/输出 应用场景 • 音频信号分析&#xff1a;幅值、频率、占空比、THD、THDN 等指标 • 模拟音频测试&#xff1a;耳机、麦克风、扬声器测试&#xff0c;串扰测试 • 数字音频测试&#xff1a;平板电…

【DrissionPage】Linux上如何将https改为http

最近有个老板找我做一个自动化的程序&#xff0c;要求部署到Linux上 这是一个http协议的网站&#xff0c;chrome在默认设置下&#xff0c;会将http的网站识别成不安全的内容&#xff0c;然后自动将http转化成https访问 但是&#xff0c;这个http的网站它的加载项里既有http的…

Python基础——字符串

一、Python的字符串简介 Python中的字符串是一种计算机程序中常用的数据类型【可将字符串看作是一个由字母、数字、符号组成的序列容器】&#xff0c;字符串可以用来表示文本数据。 通常使用一对英文的单引号&#xff08;&#xff09;或者双引号&#xff08;"&#xff09;…

三维重建 虚拟内窥镜(VE)是什么?怎么实现 使用场景

1.虚拟内窥镜&#xff1a; 就是利用计算机图形学、虚拟现实、图像处理和科学可视化等信息处理技术仿真光学内窥镜对病人进行诊断的一种技术。 VE(Virtual Endoscopy)&#xff0c;虚拟内镜技术。这种CT重建图像可以模拟各种内镜检查的效果&#xff0c;它是假设视线位于所要观察…

【数据结构】队列——循环队列(详解)

目录 0 循环队列 1 特定条件下循环队列队/空队满判断条件 1.1 队列为空的条件 1.2 队列为满的条件 2 循环队列的实现 3 示例 4 注意事项 0 循环队列 循环队列&#xff08;Circular Queue&#xff09;是队列的一种实现方式&#xff0c;它通过将队列存储空间的最后一…

【Java】Hutool发送邮件功能

目录 开通qq邮箱的stmp实战pom.xmlapplication.ymlcontrollerservice实体类辅助类 需要实现一个通过邮箱找回密码的功能 正常来说&#xff0c;找回密码的验证码&#xff0c;一般来说&#xff0c;都是通过手机号来找回的居多&#xff0c;那为什么会有通过邮箱找回的方式该说不说…

Luminar Neo - AI智能修图软件超越PS和LR,简单易用又高效!

很多人都想美化自己的风景和人物的图片&#xff0c;得到更加美丽耀眼的效果。然而&#xff0c;专业摄影师和设计师在电脑上使用的后期工具如 Photoshop 和 LightRoom 过于复杂。 通常为了一些简单的效果&#xff0c;你必须学习许多教程。而一些针对小白用户的“一键式美颜/美化…

Python第二语言(八、Python包)

目录 1. 什么是Python包 2. 创包步骤 2.1 new包 2.2 查看创建的包 2.3 拖动文件到包下 3. 导入包 4. 安装第三方包 4.1 什么是第三方包 4.2 安装第三方包-pip 4.3 pip网络优化 1. 什么是Python包 包下有__init__.py就是包&#xff0c;无__init__.py就是文件夹。于Ja…

开发没有尽头,尽力既是完美

最近遇到了一些难题&#xff0c;开发系统总有一些地方没有考虑周全&#xff0c;偏偏用户使用的时候“完美复现”了这个隐藏的Bug...... 讲道理创业一年之久为了生存&#xff0c;我一直都有在做复盘&#xff0c;复盘的核心就是&#xff1a;如何提升营收、把控开发质量&#xff0…

gdb调试器

目录 一、前言 debug和release 二、调试操作 2.1、退出 quit 2.2、调试 run 2.3、打断点 b 2.4、查看断点 info b 2.5、查看代码 l 2.6、删除断点 d 2.7、逐过程 n 2.8、打印变量内容 p 2.9、逐语句&#xff08;进入函数&#xff09; s 2.10、查看函数调用堆栈 …

先进封装技术的一些优缺点探讨

半导体封装技术是半导体制造过程中的关键环节&#xff0c;它不仅保护了芯片免受物理损伤&#xff0c;还提供了电气连接和散热功能。随着技术的发展&#xff0c;出现了多种先进的封装技术&#xff0c;每种技术都有其特定的应用场景和优缺点。 --> 1. 传统封装技术 【优点】&…

微服务之基本介绍

一、微服务架构介绍 1、微服务架构演变过程 单体应用架构->垂直应用架构一>分布式架构一>SOA架构-->微服务架构 ① 单体应用架构 互联网早期&#xff0c; 一般的网站应用流量较小&#xff0c;只需一个应用&#xff0c;将所有功能代码都部署在一起就可以&#x…

嵌入式仪器模块:波形发生器模块(嵌入式)

• 16 位分辨率 • 125 MHz 刷新率 • 支持生成 FSK/ASK 信号 应用场景 • 生成任意标准波形或用户自定义波形 • 在特殊协议通信中模拟某个波形 • 无线充电&#xff08;信号调制&#xff09; 道114输出阻抗Low-ZLow-ZLow-Z输出范围 5 V 5 V 6 V耦合DCDCDC带宽4 MHz10 M…