news 2026/8/9 23:03:55

RabbitMQ HAProxy 负载均衡

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RabbitMQ HAProxy 负载均衡

文章目录
  • 前言
  • 当Java中指定的端口号绑定的rabbitmq服务挂掉了之后,我们的程序是否还能够成功访问到rabbitmq服务呢
  • 什么是 HAProxy 负载均衡
  • HAProxy 安装
  • 修改HAProxy配置文件
  • 使用HAProxy
  • 结论

前言

前面我们学习了 rabbitmq 搭建集群,并且为了解决集群中队列的高可用问题,使用仲裁队列替代普通的队列,但是其实这里还有一个问题,就是我们在使用 Java 连接 rabbitmq 的时候,需要指定 rabbitmq 服务的 IP 和端口号,如果该端口号绑定的 rabbitmq 服务挂掉了,那么我们的 Java 程序是否还能够访问到呢?

当Java中指定的端口号绑定的rabbitmq服务挂掉了之后,我们的程序是否还能够成功访问到rabbitmq服务呢

我们 Java 程序绑定的端口号是 5672,也就是 rabbit 服务:


然后我们先将 rabbit 服务保持启动状态,并且向队列中发送消息,然后启动程序,看是否能启动成功并且成功发送消息:

@RequestMapping("/producer") @RestController public class ProducerController { @Autowired private RabbitTemplate rabbitTemplate; @RequestMapping("/test") public String test() { rabbitTemplate.convertAndSend("","quorum.queue","rabbitmq test"); return "消息发送成功"; } }



这里是顺利启动并且成功发送消息了的,然后我们将 rabbit 服务给挂掉,再来启动 Java 程序:


启动之后,访问 127.0.0.1:8080/producer/test 向队列中发送消息:

可以发现报错了。既然这样的话是否就意味着,每次我们 Java 连接的 rabbitmq 服务挂掉之后就需要重新修改我们的代码吗?这里就可以用到我们的 HAProxy 负载均衡了。

什么是 HAProxy 负载均衡

在RabbitMQ集群中,如果所有客户端都连接到同一个节点,该节点的网络负载会显著增加,而其他节点则可能处于空闲状态,造成资源浪费。使用HAProxy作为负载均衡器,可以将客户端的连接请求分散到集群中的不同节点,实现负载均衡,从而避免单个节点过载,提高整个集群的处理能力和稳定性。HAProxy支持对后端服务器的健康检查,可以定期检测RabbitMQ集群中各个节点的可用性。一旦发现某个节点不可用,HAProxy会自动将该节点从负载均衡列表中移除,并将新的连接请求转发到其他健康的节点,确保服务的连续性和可用性。

HAProxy 安装

首先更新 apt 库:apt-get update


查找 HAProxy:apt list | grep haproxy


安装 haproxy:apt-get install haproxy


验证是否安装成功:systemctl status haproxy

查看 haproxy 版本:haproxy -v


如果要设置 haproxy 服务开机自启,可以使用:systemctl enable haproxy,关闭开启自启就是:systemctl disable haproxy

修改HAProxy配置文件

HAProxy 的配置文件默认在/etc/haproxy/haproxy.cfg路径下:


我们通过 vim 命令修改配置文件:

在这个配置文件中追加下面配置:

# haproxy web 管理界? listen stats bind *:8100 mode http stats enable stats realm Haproxy Statistics stats uri / stats auth admin:admin # 配置负载均衡 listen rabbitmq bind *:5670 mode tcp balance roundrobin 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 # haproxy web 管理界? listen stats #设置?个监听器, 统计HAProxy的统计信息 bind *:8100 #指定了监听器绑定到的IP地址和端? mode http #监听器的?作模式为HTTP stats enable #启?统计?? stats realm Haproxy Statistics stats uri / stats auth admin:admin #haproxy登录账号和密码 # 配置负载均衡 listen rabbitmq #设置监听器 bind *:5670 #监听器绑定到的IP地址和端?, 也就是集群前端IP, 供producer和consumer来进?选择,由于5672端?已经默认使?, 这?选择5670端? mode tcp #由于RabbitMQ使?AMQP协议,它是?个基于TCP的协议,所以这?使?TCP模式 balance roundrobin #指定负载均衡策略为轮询 #负载均衡中的集群节点配置,这?选择的rabbit节点 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
  • server rabbitmq1 127.0.0.1:5672 check inter 5000 rise 2 fall 3
  • server rabbitmq1:定义 RabbitMQ 服务的内部标识,这里的 rabbitmq1 是指 haproxy 内部使用的,不是指 rabbtimq 服务的节点的名称
  • 127.0.0.1:5672:RabbitMQ 真实的IP和端口
  • check inter 5000:定义每隔多少毫秒检查 RabbitMQ 服务是否可用
  • rise 2:定义 RabbitMQ 服务在发生故障之后,需要多少次健康检查才能被再次确认可用
  • fall 3:定义需要经历多少次失败的健康检查之后,HAProxy 才会停止使用此 RabbitMQ 服务

HAProxy支持多种负载均衡算法,以满足不同的应用场景和需求。在RabbitMQ集群中常用的负载均衡算法包括:

  • 轮询(Round Robin):按照顺序依次将请求分发到后端服务器。
    加权轮询(Weighted Round Robin):根据后端服务器的配置和负载情况分配不同的权重,权重高的服务器将处理更多的请求。
  • 最少连接(Least Connections):动态地选择当前连接数最少的服务器来处理新的请求,以提高后端服务的利用效率。
  • 源地址哈希(Source Hash):根据客户端的IP地址进行哈希计算,将同一IP地址的客户端请求始终转发到同一台后端服务器,以保持会话的连续性。

配置完成之后,我们重启 HAProxy 服务:systemctl restart haproxy

然后通过配置中的管理页面端口来查看管理页面:

访问到时候会提示我们输入用户名和密码,这些就是配置文件中配置的用户名和密码:

使用HAProxy

使用 HAProxy 之后的 RabbitMQ 的使用和普通的是一样的,就是需要更改我们的 Java 代码连接 rabbitmq 的 IP 和端口号为 HAProxy 的 IP 和端口号:


然后我们的 rabbit 节点还是处于挂掉的状态,我们启动程序,并且生产消息:




使用 HAProxy 就解决了 Java 代码绑定的 rabbitmq 挂掉之后,我们的 Java 程序无法连接到集群的问题了。

结论

感谢各位朋友们能够看到结尾,找不到工作?某直聘已读不回?不妨看看这里超快回复,助力每一位程序员早日找到理想的工作

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/9 11:33:41

操作指定目录下的文件,对特定参数赋值,接口函数

操作指定目录下的文件,对特定参数赋值,接口函数 操作 /usrdata/root/params.ini文件 并对某些参数赋值 这里为 record_stream参数赋值 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h>#define PARAM_FILE "…

作者头像 李华
网站建设 2026/7/28 16:12:34

L298N模块在STM32最小系统中的集成方法:小白指南

从零构建直流电机控制系统&#xff1a;L298N与STM32的实战集成指南你有没有遇到过这样的场景&#xff1f;手头有一个12V的小型直流减速电机&#xff0c;想用STM32控制它正反转、调速运行——看似简单的需求&#xff0c;却在接线时犹豫不决&#xff1a;PWM信号怎么给&#xff1f…

作者头像 李华
网站建设 2026/8/8 9:14:31

[内网流媒体] 零信任理念在内网工具中的落地

零信任的核心 零信任强调“永不信任,始终验证”。即便在内网,也假设网络不可信、设备不可信、用户可能被劫持。对实时画面工具,零信任的落地关乎访问控制、最小权限和持续验证。 落地原则 身份优先 所有访问都需身份验证(口令/Token/单点登录),不提供匿名入口。 最小权…

作者头像 李华
网站建设 2026/8/9 3:00:10

STM32推挽输出是否需要外加上拉电阻?通俗解释

STM32推挽输出到底要不要上拉电阻&#xff1f;一文讲透底层原理与实战陷阱你有没有在画PCB时纠结过这个问题&#xff1a;“这个STM32的GPIO配置成推挽输出了&#xff0c;还用加个4.7k上拉吗&#xff1f;”也许你曾经看到别人电路里随便加了个上拉&#xff0c;心里嘀咕&#xff…

作者头像 李华
网站建设 2026/8/8 21:41:14

2026-01-11:三段式数组Ⅱ。用go语言,给定长度为 n 的整数序列 nums,要求选出一个包含至少四个元素的连续区间 [a, b](0 ≤ a < b < n),并在区间内选两个切分点 a <

2026-01-11&#xff1a;三段式数组Ⅱ。用go语言&#xff0c;给定长度为 n 的整数序列 nums&#xff0c;要求选出一个包含至少四个元素的连续区间 [a, b]&#xff08;0 ≤ a < b < n&#xff09;&#xff0c;并在区间内选两个切分点 a < i < j < b&#xff0c;使…

作者头像 李华
网站建设 2026/7/30 23:46:29

【C++藏宝阁】C++入门:命名空间(namespace)详解

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;C藏宝阁 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录&#x1f4da;专栏订阅推荐&#x1f4cb;前言&#xff1a;为什么需要命名空间&#xff1f;一、命名空间的定义二、命…

作者头像 李华