在 Linux 上实现 Java 应用的负载均衡
一、方案总览与选型
| 方案 | 组件/位置 | 适用场景 | 关键要点 |
|---|---|---|---|
| 反向代理/七层 LB | Nginx/HAProxy | HTTP/HTTPS、需要按域名/路径分流、限流、缓存 | 配置简单、生态成熟;Nginx 支持轮询、权重、ip_hash 等;HAProxy 支持 TCP/HTTP、细粒度健康检查 |
| 四层转发 | LVS(配合 Keepalived) | 超高并发、TCP 协议、内核级转发 | 性能极高,支持 DR/NAT/TUN 等模式,适合大流量入口 |
| 客户端 LB | Spring Cloud LoadBalancer / Ribbon | 微服务内部调用 | 与服务发现(如 Eureka)配合,代码侧负载,减少一层跳数 |
以上方案均为 Linux 上部署 Java 应用的常见实践,可按并发、协议、维护成本与团队栈综合选择。
二、服务端负载均衡实践
Nginx 示例(HTTP,Ubuntu/CentOS 通用)
http {
upstream backend {
server 192.168.1.11:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.12:8080 weight=1 max_fails=2 fail_timeout=30s;
# 可选:ip_hash; # 会话保持
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
HAProxy 示例(TCP/HTTP)
global
log /dev/log local0
log /dev/log local1 notice
daemon
defaults
mode http
option httplog
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http_front
bind *:80
default_backend http_back
backend http_back
balance roundrobin
server app1 192.168.1.11:8080 check
server app2 192.168.1.12:8080 check
LVS 四层转发(高并发入口)
三、客户端负载均衡实践(微服务)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!-- 如需声明式调用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
eureka:
client:
serviceUrl:
defaultZone: http://eureka1:8761/eureka/
四、健康检查、会话保持与故障演练
健康检查与熔断
upstream backend {
server 192.168.1.11:8080 max_fails=2 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=2 fail_timeout=30s;
}
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout http_500 http_404;
}
会话保持
快速故障演练