Spring Boot负载均衡分客户端(推荐LoadBalancer)、服务端(如Nginx)及数据源层三类:客户端通过@LoadBalanced自动路由服务名并支持轮询/随机策略;服务端由Nginx配置upstream实现;数据源层可用Dynamic Datasource做读库随机/轮询。

Spring Boot 项目配置负载均衡策略,核心取决于你用的是哪种负载均衡类型:服务端(如 Nginx)还是客户端(如 Ribbon 或 Spring Cloud LoadBalancer)。微服务场景下,客户端负载均衡更常见,也更灵活。
客户端负载均衡:用 Spring Cloud LoadBalancer(推荐)
这是 Spring 官方维护的现代方案,已取代 Ribbon,轻量、易集成、支持响应式编程。
- 添加依赖(Maven):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency> - 配置
@LoadBalanced的RestTemplate或WebClient.Builder:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
- 调用时直接用服务名(如
http://user-service/users/1),LoadBalancer 会自动从注册中心(如 Nacos/Eureka)拉取实例列表,并按默认轮询策略分发请求。 - 自定义策略(如随机):
在application.yml中写:
user-service:
spring:
cloud:
loadbalancer:
round-robin:
enabled: false
random:
enabled: true
客户端负载均衡:Ribbon(兼容旧项目)
若仍在使用 Spring Cloud Netflix 生态(如 Hoxton 及更早版本),Ribbon 仍可用,但已进入维护模式。
- 确保引入了
spring-cloud-starter-netflix-ribbon(通常被eureka-client间接依赖)。 - 同样需要
@LoadBalanced RestTemplate。 - 策略可通过 YAML 配置:
user-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule - 注意:Java 配置类(
@RibbonClient)需放在启动类包外,否则会触发 Spring 上下文扫描冲突。
服务端负载均衡:Nginx 反向代理
适用于非微服务或网关层统一入口场景,与 Spring Boot 代码无关,纯配置驱动。
- 在
nginx.conf中定义 upstream:
upstream user-service-cluster {
least_conn;
server 192.168.1.10:8080 weight=2;
server 192.168.1.11:8080 weight=1;
}
- 配合 proxy_pass 使用:
location /api/users {
proxy_pass http://user-service-cluster;
} - 支持策略包括:轮询(默认)、least_conn(最少连接)、ip_hash(会话保持)、hash $request_uri consistent(一致性哈希)等。
数据源层负载均衡(读写分离场景)
如用 MyBatis-Plus Dynamic Datasource,可对多个从库做随机或轮询分发。
- YAML 配置示例:
spring:
datasource:
dynamic:
strategy: com.baomidou.dynamic.datasource.strategy.RandomDynamicDataSourceStrategy - 该策略只影响读操作(如
slave_1、slave_2),写操作仍走master。


















