Docker搭建Spring Boot负载均衡Demo时HAProxy返回503错误如何解决?
错误根因定位
你遇到的503错误是HAProxy配置错误导致无法正常转发请求到Spring Boot实例,核心问题有3个:
- 后端服务配置未指定端口:Spring Boot容器内服务运行在8080端口,你当前配置只写了服务名,HAProxy默认访问80端口,无法命中服务
- 后端节点ID重复:两个server配置都用了
node1作为节点ID,配置冲突导致节点全部失效 - 缺少健康检查配置:无法自动识别实例可用状态,不符合你后续模拟故障验证负载均衡的需求
修复方案
1. 替换haproxy.cfg为以下配置
global daemon log /srv/logs/haproxy local0 log /srv/logs/haproxy local1 notice defaults mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms option http-keep-alive frontend http-in bind :80 acl host_web1 hdr(host) -i 127.0.0.1 use_backend web1_be if host_web1 backend web1_be http-request set-header X-Forwarded-Port %[dst_port] http-request add-header X-Forwarded-Proto https if { ssl_fc } balance roundrobin server node1 web1_app:8080 check inter 2000 fall 2 rise 2 weight 1 server node2 web2_app:8080 check inter 2000 fall 2 rise 2 weight 1
改动说明:
- 给两个服务补充了8080端口
- 节点ID分别修改为node1、node2避免冲突
- 新增
balance roundrobin指定轮询负载策略 - 新增
check相关配置开启健康检查,2秒检测一次,连续2次失败标记节点不可用,连续2次成功恢复可用
2. 重启服务验证
先清理原有容器,再按顺序启动避免服务未就绪问题:
# 停止并删除所有旧容器 docker-compose down # 先启动数据库和web应用,等待10秒保证Spring Boot初始化完成 docker-compose up -d database web1_app web2_app sleep 10 # 最后启动HAProxy docker-compose up -d haproxy
3. 负载均衡验证方法
你可以先给Spring Boot新增一个简单的测试接口,返回当前实例标识:
@GetMapping("/api/instance") public String getInstance() { // 也可以返回容器hostname,自动区分不同实例 return System.getenv().getOrDefault("HOSTNAME", "unknown"); }
多次访问http://localhost/api/instance,会交替返回web1_app和web2_app的容器ID,证明轮询负载均衡生效。
4. 模拟延迟故障验证
要模拟部分容器延迟,直接对目标容器执行流量控制命令即可:
# 给web1_app添加2秒延迟 docker exec -it web1_app tc qdisc add dev eth0 root netem delay 2000ms
此时再访问接口,会发现大部分请求都被转发到无延迟的web2_app,连续多次失败后HAProxy会自动剔除web1_app节点,所有请求都走web2_app。要恢复web1_app的延迟执行:
docker exec -it web1_app tc qdisc del dev eth0 root netem
兜底排查方法
如果修改后仍然报错,按以下步骤排查:
- 进入HAProxy容器验证网络连通性:
docker exec -it haproxy ping web1_app,如果ping不通检查docker-compose的网络配置,确认haproxy和web服务在同一个网络下 - 直接在HAProxy容器内调用Spring Boot接口:
docker exec -it haproxy curl http://web1_app:8080/api/instance,如果返回失败检查Spring Boot应用本身的启动日志和接口配置
内容的提问来源于stack exchange,提问作者Rahego
相关产品推荐
相关产品推荐

