Java17 — RabbitMQ搭建集群

作者 : admin 本文共3389个字,预计阅读时间需要9分钟 发布时间: 2024-06-15 共1人阅读

目录

一、使用docker搭建集群

二、使用docker安装Haproxy 

三、使用springboot进行测试 

 3.1、创建交换机与队列关系

四、仲裁队列替代镜像队列 

4.1、创建交换机与队列关系


一、使用docker搭建集群

由于contos7环境不能装rabbitmq3.13版本的,采用docker安装避免报错

cd /tmp
# 创建文件
touch rabbitmq.conf

文件内容 

loopback_users.guest = false
listeners.tcp.default = 5672
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@mq1
cluster_formation.classic_config.nodes.2 = rabbit@mq2
cluster_formation.classic_config.nodes.3 = rabbit@mq3
default_user = guest
default_pass = 123456
 

# 创建cookie文件
touch .erlang.cookie
# 写入cookie
echo “Jh98lPqRstUvA43x” > .erlang.cookie
# 修改cookie文件的权限
chmod 600 .erlang.cookie


# 创建目录

mkdir mq1 mq2 mq3

# 拷贝
cp rabbitmq.conf mq1
cp rabbitmq.conf mq2
cp rabbitmq.conf mq3
cp .erlang.cookie mq1
cp .erlang.cookie mq2
cp .erlang.cookie mq3 

创建一个网络

docker network create mq-net

docker run -d –net mq-net \
-v ${PWD}/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
–name mq1 \
–hostname mq1 \
-p 8071:5672 \
-p 8081:15672 \
rabbitmq:3-management
 
 
docker run -d –net mq-net \
-v ${PWD}/mq2/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
–name mq2 \
–hostname mq2 \
-p 8072:5672 \
-p 8082:15672 \
rabbitmq:3-management
 
 
docker run -d –net mq-net \
-v ${PWD}/mq3/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
–name mq3 \
–hostname mq3 \
-p 8073:5672 \
-p 8083:15672 \
rabbitmq:3-management 

 Java17 — RabbitMQ搭建集群插图

二、使用docker安装Haproxy 

Java17 — RabbitMQ搭建集群插图(1) 

文件内容:

#文件内容
global
  #日志
  log 127.0.0.1 local0 info
  maxconn 10240
  daemon

defaults
  log global
  mode http
  timeout connect 3000  #连接超时
  timeout client 3000   #客户端超时
  timeout server 3000   #服务器超时
  timeout check 2000    #心跳检测超时

listen  admin_stats
    #监控界面的访问的IP和端口
    bind  0.0.0.0:8084
    #访问协议
    mode        http
    #URI相对地址
    stats uri   /stats
    #统计报告格式
    stats realm     Global\ statistics
    #登陆帐户信息
    stats auth  admin:admin

listen rabbitmq_admin#rabbit的监控页面
    bind    0.0.0.0:8085
    server  rabbit_admin1 172.31.0.110:15673 #自己的rabbitmq前端访问界面
    server  rabbit_admin2 172.31.0.110:15674
    server  rabbit_admin3 172.31.0.110:15675

listen haproxy #这里配置集群负载均衡
  bind 0.0.0.0:5666 #对外提供的端口,访问这个端口就会根据配置的规则对集群下的节点进行相应的负载均衡
  option tcplog
  mode tcp
  balance roundrobin #这是轮询算法,如有需要可以换成其他
  #每次换一个节点进行使用
  server rabbit1 172.31.0.110:5673 check inter 5000 rise 2 fall 2 #rabbitmq后端访问界面
  server rabbit2 172.31.0.110:5674 check inter 5000 rise 2 fall 2
  server rabbit3 172.31.0.110:5675 check inter 5000 rise 2 fall 2

 

运行容器

run -d –name haproxy-rabbitmq -p 8084:8084 -p 5666:5666 -p 8085:8085 -v /opt/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:latest 

Java17 — RabbitMQ搭建集群插图(2) 

负载均衡访问rabbitmq

Java17 — RabbitMQ搭建集群插图(3) 

三、使用springboot进行测试 

 3.1、创建交换机与队列关系

 交换机:exchange.cluster

队列:queue.cluster

路由键:cluster

Java17 — RabbitMQ搭建集群插图(4)

@Test
    public void test9(){

        rabbitTemplate.convertAndSend("exchange.cluster","cluster","测试集群");
    }
@RabbitListener(queues = {"queue.cluster"})
    public void getMessagePriority(String date, Message message, Channel channel) throws Exception {
        //获取当前deliveryTagID
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        //成功返回ACK信息
        channel.basicAck(deliveryTag,false);
        log.info("接收消息为:" + date);
    }

四、仲裁队列替代镜像队列 

4.1、创建交换机与队列关系

 交换机正常创建:exchange.quorum

队列创建:

Java17 — RabbitMQ搭建集群插图(5)

 路由键正常绑定

测试代码:

@Test
    public void test10(){

        rabbitTemplate.convertAndSend("exchange.quorum","quorum","测试仲裁队列");
    }
 @RabbitListener(queues = {"queue.quorum"})
    public void getMessageQuorum(String date, Message message, Channel channel) throws Exception {
        //获取当前deliveryTagID
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        //成功返回ACK信息
        channel.basicAck(deliveryTag,false);
        log.info("接收消息为:" + date);
    }

即使某个节点挂掉,其他依然可以正常工作

 

 

 

 

 

本站无任何商业行为
个人在线分享 » Java17 — RabbitMQ搭建集群
E-->