在分布式系统中,RabbitMQ作为常用消息中间件,集群部署是保障高可用的关键。但很多开发者会遇到一个棘手问题:Java程序直接绑定RabbitMQ节点的IP和端口后,一旦该节点宕机,程序就会连接失败,只能手动修改配置恢复。
而HAProxy负载均衡技术,能完美解决这个痛点------既实现请求分流,又能自动故障转移,为RabbitMQ集群搭建可靠的统一访问入口。今天就带大家一步步完成从安装到实战验证的全流程。
一、为什么一定要用HAProxy?
RabbitMQ集群即便配置了仲裁队列保证队列高可用,仍有两个核心问题:
-
单点依赖风险 :程序绑定固定节点端口(默认5672),节点宕机直接抛出
java.net.ConnectException,无法自动切换 -
资源浪费严重:所有请求集中在一个节点,导致该节点过载,其他节点却闲置
HAProxy的核心价值就是:作为集群"大门",分散请求到各个节点,同时实时监控节点状态,故障时自动切换,无需手动改代码。
二、HAProxy快速安装(Ubuntu环境)
1. 更新软件源
apt-get update
2. 安装HAProxy
先查看可用版本:
apt list | grep haproxy
执行安装命令:
apt-get install haproxy
3. 验证安装
查看服务状态(显示active则成功):
systemctl status haproxy
设置开机自启:
systemctl enable haproxy
查看版本信息:
haproxy -v
三、关键配置:HAProxy核心参数设置
HAProxy配置文件路径:/etc/haproxy/haproxy.cfg,用vim编辑即可。
1. 完整配置代码(直接复制)
# 编辑配置文件
vim /etc/haproxy/haproxy.cfg
在文件末尾追加以下内容:
# HAProxy Web管理界面(方便监控)
listen stats
bind *:8100 # 管理界面端口
mode http # 工作模式
stats enable # 启用统计功能
stats realm Haproxy Statistics
stats uri / # 访问路径
stats auth admin:admin # 登录账号密码(可自定义)
# RabbitMQ负载均衡核心配置
listen rabbitmq
bind *:5670 # 集群统一访问端口(避开5672默认端口)
mode tcp # AMQP基于TCP协议,必须设为TCP模式
balance roundrobin # 负载均衡算法:轮询(最常用)
# 集群节点配置(替换为你的实际节点IP和端口)
server rabbitmq1 127.0.0.1:5672 check inter 5000 rise 2 fall 3
server rabbitmq2 127.0.0.1:5673 check inter 5000 rise 2 fall 3
server rabbitmq3 127.0.0.1:5674 check inter 5000 rise 2 fall 3
2. 关键参数说明(新手必看)
-
负载均衡算法:
-
轮询(roundrobin):按顺序分发请求,适合节点性能一致的场景
-
加权轮询:给高性能节点分配更高权重,处理更多请求
-
最少连接:优先转发到连接数少的节点,提升利用率
-
-
• 健康检查参数:
-
check inter 5000:每5秒检查一次节点是否可用 -
rise 2:节点故障后,连续2次检查通过恢复可用 -
fall 3:连续3次检查失败,自动移除该节点
-
3. 配置生效
修改后重启HAProxy:
systemctl restart haproxy
四、实战验证:负载均衡+故障转移
1. 程序连接配置修改(Java示例)
无需关注集群具体节点,只需连接HAProxy的IP和端口(5670):
spring:
rabbitmq:
addresses: amqp://admin:password@haproxy-ip:5670/test # 替换实际IP和密码
publisher-confirm-type: correlated
listener:
simple:
acknowledge-mode: auto
2. 测试步骤
(1)正常场景测试
启动RabbitMQ集群和Java程序,调用接口发送消息:
@RestController
@RequestMapping("/producer")
public class ProducerController {
@Autowired
private RabbitTemplate rabbitTemplate;
@RequestMapping("/test")
public String test() {
rabbitTemplate.convertAndSend("", "quorum.queue", "RabbitMQ+HAPorxy测试");
return "消息发送成功";
}
}
访问http://127.0.0.1:8080/producer/test,消息能正常投递即成功。
(2)故障转移测试
手动停止一个RabbitMQ节点:
rabbitmqctl -n rabbit stop_app
再次调用接口,程序仍能正常发送消息,HAProxy会自动将请求转发到健康节点。
五、总结
HAProxy给RabbitMQ集群带来三大核心优势:
-
高可用:故障自动转移,无需人工干预
-
高并发:请求分流,避免单点过载
-
易维护:集群扩容/替换节点,无需修改程序配置
这套方案适用于微服务、分布式系统等各类需要高可用消息通信的场景,新手也能快速上手。