RabbitMQ 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 程序无法连接到集群的问题了。

结论

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

相关推荐
Java 码农7 小时前
RabbitMQ集群部署方案及配置指南05
分布式·rabbitmq
坐不住的爱码12 小时前
Nacos负载均衡
负载均衡·cloud
Java 码农12 小时前
RabbitMQ集群部署方案及配置指南01
linux·服务器·rabbitmq
Overt0p12 小时前
抽奖系统(6)
java·spring boot·redis·设计模式·rabbitmq·状态模式
Java 码农12 小时前
RabbitMQ集群部署方案及配置指南04
分布式·rabbitmq
独自破碎E12 小时前
在RabbitMQ中,怎么确保消息不会丢失?
分布式·rabbitmq
Java 码农12 小时前
RabbitMQ集群部署方案及配置指南02
分布式·rabbitmq
是大芒果12 小时前
线程池和高并发
负载均衡·高可用
bentengjiayou13 小时前
Kafka和RabbitMQ相比有什么优势?
分布式·kafka·rabbitmq
零度@13 小时前
Java 消息中间件 - RabbitMQ 全解(保姆级 2026)
java·rabbitmq·java-rabbitmq