当前位置: 首页> 游戏> 单机 > RabbitMQ | HAProxy - 给 RabbitMQ集群 集成负载均衡

RabbitMQ | HAProxy - 给 RabbitMQ集群 集成负载均衡

时间:2025/7/10 11:05:03来源:https://blog.csdn.net/CYK_byte/article/details/141300811 浏览次数:0次

文章目录

  • HAProxy
    • 概述
    • Docker 部署 HAProxy
    • Spring AMQP 集成

HAProxy


概述

1)试想一个问题:当 RabbitMQ 一个集群中有 3 个节点时,我们写代码时,因该访问哪个节点呢?
当然时任意一个节点都可以~

但是存在几个问题:

  • 如果配置文件中写死访问的是 node1,但是 node1 挂了,不就是变相的等于 mq集群 整体不可用了吗,所以最好是有一个统一的入口,一个节点故障时,流量可以及时转移到其他节点.
  • 如果所有客户端都和 node1 建立连接,那么 node1 的负担会大大增加,而其他节点的负担不大导致资源浪费.

2)使用 HAProxy 就可以实现流量的负载均衡.
HAProxy(High Availability Proxy)是一个开源的负载均衡和 TCP/HTTP 应用程序的代理服务器,它可以提供高可用,负载均衡和代理功能. HAProxy 主要用于分发网络流量到多个后台服务器,以提高网络的可靠性和性能.

例如 RabbitMQ,将来我们只需要在 SpringBoot 项目中配置 RabbitMQ 的连接地址为 HAProxy 配置的地址,那么所有 SpringBoot 访问请求都会先经过 HAProxy ,然后再由 HAProxy 分发给 MQ 集群中的不同实例.

Docker 部署 HAProxy

1)镜像

docker pull haproxy:3.0.3

2)vim 编辑 ~/env/haproxy/conf/haproxy.cfg 配置文件(将来挂载的配置文件)

# haproxy web 管理界面
listen stats # 设置一个监听器,统计 HAProxy 的统计信息bind *:8100 # 指定监听器的 ip 和 portmode http # 监听器的工作模式为 HTTPstats enable # 启用统计页面stats realm HAProxy\ Statisticsstats uri /stats auth root:1111 # haproxy 登录账号和密码# 配置 mq 负载均衡
listen rabbitmq # 设置监听器bind *:5670 # 监听器绑定 ip 和 port,将来 SpringBoot 访问 mq 就是这个 ip 和 端口mode tcp # 因为 rabbitmq 使用 amqp 协议时基于 tcp 的balance roundrobin # 负载均衡策略: 轮询# 集群节点配置,这里使用 rabbit 节点server rabbitmq1 100.112.226.113:5672 check inter 5000 rise 2 fall 3server rabbitmq2 100.112.226.113:5673 check inter 5000 rise 2 fall 3server rabbitmq3 100.112.226.113:5674 check inter 5000 rise 2 fall 3# rabbitmq1、2、3 时自定义的# check... 是健康检测相关

3)启动

docker run -d \
--name haproxy \
-p 28100:8100 \
-p 25670:5670 \
-v ~/env/haproxy/conf/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg \
haproxy:3.0.3

这些端口是与上面编写的配置文件一一对应的:

  • -p 28100:8100: 配置文件中配置的 web 端口,将来通过这个端口就可以访问到 HAProxy Web控制台.
  • -p 25670:5670:SpringBoot 配置文件中的 RabbitMQ 端口将来就写这个,HAProxy 就会将这些流量进行分发到集群的各个节点.
  • /usr/local/etc/haproxy/haproxy.cfg:容器内的配置文件地址不一定是这个,会随着镜像的版本变化而变化,如果容器启动失败,看一下日志就知道了.

4)访问 http://env-base:18100/ 就可以看到管理界面
在这里插入图片描述
人家直接连健康检测都配置好了~

Spring AMQP 集成

1)把 rabbitmq 端口改成 haproxy 的即可,haproxy 就会自动将收到的流量做分流.

spring:application:name: rabbitmqrabbitmq:host: env-baseport: 15670 # HAProxy 监听器端口username: rootpassword: 1111

2)队列配置

@Configuration
class QuorumConfig {@Beanfun quorumQueue(): Queue = QueueBuilder.durable(MQConst.QUORUM_QUEUE).quorum().build()}

3)生产者接口

@RestController
@RequestMapping("/mq")
class MQApi(private val rabbitTemplate: RabbitTemplate
) {@GetMappingfun quorum(): String {rabbitTemplate.convertAndSend("", MQConst.QUORUM_QUEUE, "quorum msg 1")return "ok"}}

4)将来无论哪个 mq 宕机,只有有一个实例还在运行,就可以提供服务.

例如如下 mq3 为 Leader
在这里插入图片描述
现在手动让 mq3 宕机,然后触发生产者接口,最后查看 HAProxy 管理平台,可以看到流量分发的 mq2 上了
在这里插入图片描述
现在手动让 mq2 宕机,然后触发生产者接口(由于是轮询策略,因此可能会服务器报错,不过没关系,多触发几次,就会将流量分到可用的机器上),最后查看 HAProxy 管理平台,可以看到流量分发的 mq1 上了
在这里插入图片描述

Ps:但是一定要确保 HAProxy 为可用,因此建议 HAProxy 也配置为集群.

关键字:RabbitMQ | HAProxy - 给 RabbitMQ集群 集成负载均衡

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: