Apache可通过mod_proxy_balancer实现Java微服务HTTP层流量分发,需启用proxy、proxy_http、proxy_balancer模块,配置balancer://组、健康检查、stickysession及/balancer-manager监控。

Apache 本身不内置服务发现或微服务治理能力,但通过 mod_proxy 和 mod_proxy_balancer 的组合,可以作为轻量级边缘代理,对后端 Java 微服务群实现统一的 HTTP 层流量调度与分发。关键在于配置结构清晰、状态可控、故障可感知,而非替代专业网关。
启用必要模块并定义可管理的均衡组
确保以下模块已加载:mod_proxy、mod_proxy_http(用于 HTTP 协议)、mod_proxy_balancer(提供负载策略与管理界面)。用命令验证:
-
httpd -M | grep proxy应显示三者均为shared - Debian/Ubuntu 执行
a2enmod proxy proxy_http proxy_balancer;RHEL/CentOS 检查/etc/httpd/conf.modules.d/00-proxy.conf中对应LoadModule行未被注释
在虚拟主机或主配置中声明一个命名均衡组,例如:
<proxy balancer:>
BalancerMember http://192.168.1.10:8080 route=s1 loadfactor=2
BalancerMember http://192.168.1.11:8080 route=s2 loadfactor=1
ProxySet lbmethod=bybusyness
</proxy>
注意:必须使用 balancer:// 协议前缀,否则 Apache 会退化为单点代理,不触发负载逻辑。
配置健康检查与自动故障隔离
默认情况下,Apache 不主动探测后端存活,需显式启用健康机制,避免请求持续打到宕机节点:
- Apache ≥ 2.4.43 推荐用
mod_proxy_hcheck:在BalancerMember后添加hcmethod=GET hcuri="/actuator/health" hcinterval=15 hcexpr="%{REQUEST_STATUS} == 200" - 旧版本可用被动检测:设置
timeout=5 retry=60 failonstatus=500,503,即连续失败后标记为 down,60 秒后重试 - 所有节点建议统一加
status=+H标记为“参与健康检查”,否则即使配置了 hcheck 也不会生效
支持会话保持与路径级流量控制
当微服务无共享 Session 存储时,需由 Apache 保证粘性路由:
- 后端应用(如 Spring Boot)应在响应中返回含
JSESSIONID或自定义 cookie(如ROUTEID=server1) - 在
块中添加ProxySet stickysession=JSESSIONID|ROUTEID - 每个
BalancerMember必须带route=xxx,且与 cookie 中的值严格匹配
若需按路径分流(如 /auth → 认证服务,/order → 订单服务),可定义多个 balancer:// 组,并用不同 ProxyPass 规则绑定:
ProxyPass "/auth/" "balancer://authcluster/" ProxyPass "/order/" "balancer://ordercluster/"
启用管理界面并验证分发效果
/balancer-manager 是内置监控入口,但默认禁止访问:
- 必须同时启用
mod_status(否则页面 404) - 在配置中加入:
<location> SetHandler balancer-manager Require ip 192.168.1.0/24 </location> - 访问该地址可实时查看各节点状态、当前请求数、已处理请求数及是否 in/out of rotation
- 配合日志字段
%{BALANCER_WORKER_ROUTE}e可记录每次请求实际转发到哪个节点,用于交叉验证轮询或粘性是否生效











