前面我们学习了 rabbitmq 搭建集群,并且为了解决集群中队列的高可用问题,使用仲裁队列替代普通的队列,但是其实这里还有一个问题,就是我们在使用 Java 连接 rabbitmq 的时候,需要指定 rabbitmq 服务的 IP 和端口号,如果该端口号绑定的 rabbitmq 服务挂掉了,那么我们的 Java 程序是否还能够访问到呢?
我们 Java 程序绑定的端口号是 5672,也就是 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 程序:
可以发现报错了。既然这样的话是否就意味着,每次我们 Java 连接的 rabbitmq 服务挂掉之后就需要重新修改我们的代码吗?这里就可以用到我们的 HAProxy 负载均衡了。
在RabbitMQ集群中,如果所有客户端都连接到同一个节点,该节点的网络负载会显著增加,而其他节点则可能处于空闲状态,造成资源浪费。使用HAProxy作为负载均衡器,可以将客户端的连接请求分散到集群中的不同节点,实现负载均衡,从而避免单个节点过载,提高整个集群的处理能力和稳定性。HAProxy支持对后端服务器的健康检查,可以定期检测RabbitMQ集群中各个节点的可用性。一旦发现某个节点不可用,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 的配置文件默认在 /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
HAProxy支持多种负载均衡算法,以满足不同的应用场景和需求。在RabbitMQ集群中常用的负载均衡算法包括:
配置完成之后,我们重启 HAProxy 服务:systemctl restart haproxy
然后通过配置中的管理页面端口来查看管理页面:
访问到时候会提示我们输入用户名和密码,这些就是配置文件中配置的用户名和密码:
使用 HAProxy 之后的 RabbitMQ 的使用和普通的是一样的,就是需要更改我们的 Java 代码连接 rabbitmq 的 IP 和端口号为 HAProxy 的 IP 和端口号:
然后我们的 rabbit 节点还是处于挂掉的状态,我们启动程序,并且生产消息:
使用 HAProxy 就解决了 Java 代码绑定的 rabbitmq 挂掉之后,我们的 Java 程序无法连接到集群的问题了。
感谢各位朋友们能够看到结尾,找不到工作?某直聘已读不回?不妨看看这里
因篇幅问题不能全部显示,请点此查看更多更全内容