Ribbon 已过时,spring boot 3 采用 LoadBalancer 负载均衡(从入门到实战、原理、架构整合)
Spring Boot 3整合Ribbon指南:推荐使用Spring Cloud LoadBalancer替代Ribbon,提供Nacos集成方案。包含环境配置(Maven依赖、Nacos服务发现)、负载均衡启用方法(@LoadBalanced注解)、服务调用示例和策略配置(轮询/随机)。同时说明Spring Boot 3已移除Ribbon支持,建议新项目采用LoadBalancer方案。
Spring Boot 3 整合 Ribbon:基于 Nacos 的完整指南(从入门到实战与原理)
一、前言:Spring Boot 3 与 Ribbon 的现状说明
需要特别注意的是:Spring Boot 3 对应的 Spring Cloud 2022+ 版本已彻底移除 Ribbon,因为 Ribbon 已被 Netflix 停止维护,Spring Cloud 官方推荐使用 Spring Cloud LoadBalancer 作为替代方案。
但考虑到部分项目仍有迁移需求,本文将分为两部分:
- 推荐方案:Spring Boot 3 + Spring Cloud LoadBalancer + Nacos(符合当前技术趋势)
- 兼容方案:Spring Boot 3 兼容 Ribbon 的特殊配置(不推荐用于新项目)
二、推荐方案:Spring Cloud LoadBalancer + Nacos
2.1 什么是 Spring Cloud LoadBalancer?
Spring Cloud LoadBalancer 是 Spring 官方推出的客户端负载均衡器,作为 Ribbon 的替代者,它:
- 轻量且易于扩展
- 支持同步和反应式编程模型
- 与 Spring Cloud 生态完美兼容
- 支持服务发现集成(如 Nacos)

LoadBalancer
2.2 环境准备
依赖配置(Maven)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.3</version>
<relativePath/>
</parent>
<dependencies>
<!-- Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Nacos 服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2022.0.0.0-RC2</version> <!-- 适配 Spring Boot 3 -->
</dependency>
<!-- Spring Cloud LoadBalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>4.0.4</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2022.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0-RC2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.3 配置 Nacos 服务发现
-
安装 Nacos Server:参考 Nacos 官方文档 启动 Nacos 服务(默认端口 8848)
-
应用配置(application.yml):
spring:
application:
name: loadbalancer-demo # 服务名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos 服务地址
loadbalancer:
nacos:
enabled: true # 启用 Nacos 负载均衡支持(可选,默认已集成)
server:
port: 8080
2.4 开启负载均衡功能
通过 @LoadBalanced 注解为 RestTemplate 开启负载均衡能力:
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class WebConfig {
@Bean
@LoadBalanced // 关键:开启负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
2.5 服务调用示例
假设 Nacos 中已注册名为 user-service 的服务(多个实例),通过服务名调用:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/call-user")
public String callUserService() {
// 使用服务名调用,而非具体 IP:端口
String url = "http://user-service/user/info";
return restTemplate.getForObject(url, String.class);
}
}
2.6 负载均衡策略配置
Spring Cloud LoadBalancer 提供多种策略,默认是 轮询,可通过以下方式配置:
方式 1:全局配置
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
@Configuration
public class LoadBalancerConfig {
@Bean
ReactorLoadBalancer<?> randomLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
// 配置随机策略
return new RandomLoadBalancer(
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
}
}
方式 2:针对特定服务配置
在 application.yml 中配置:
spring:
cloud:
loadbalancer:
clients:
user-service: # 针对 user-service 服务
configuration:
NacosLoadBalancerRuleConfiguration: # 使用 Nacos 权重策略
三、实战案例:完整服务调用流程
3.1 架构设计
- 服务注册中心:Nacos Server(8848)
- 服务提供者:
user-service(2 个实例,端口 9001、9002) - 服务消费者:
loadbalancer-demo(8080,使用 LoadBalancer 调用)
3.2 服务提供者实现(user-service)
-
依赖:同上(需包含 Nacos 发现依赖)
-
代码:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class UserServiceApplication {
@GetMapping("/user/info")
public String getUserInfo() {
// 返回当前服务端口,便于观察负载均衡效果
return "User service response from port: " +
SpringApplication.run(UserServiceApplication.class).getEnvironment().getProperty("server.port");
}
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
- 配置:
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
server:
port: 9001 # 第二个实例启动时改为 9002
3.3 测试负载均衡效果
- 启动 Nacos Server
- 启动
user-service的两个实例(9001 和 9002) - 启动消费者
loadbalancer-demo(8080) - 多次访问
http://localhost:8080/call-user
预期结果:请求会被均衡分配到 9001 和 9002 两个实例(默认轮询策略)
四、底层原理:Spring Cloud LoadBalancer 工作机制
4.1 核心组件
- LoadBalancerClient:负载均衡客户端核心接口
- ServiceInstanceListSupplier:服务实例列表提供者(从 Nacos 获取)
- ReactorLoadBalancer:反应式负载均衡器
- LoadBalancerRequestTransformer:请求转换器
- LoadBalancerRetryPolicy:重试策略
4.2 工作流程
- 服务发现:
ServiceInstanceListSupplier定期从 Nacos 拉取服务实例列表 - 负载均衡选择:
- 当调用
restTemplate.getForObject("http://user-service/xxx")时 @LoadBalanced注解会触发拦截器- 负载均衡器根据配置的策略(如轮询、随机)从服务列表中选择实例
- 当调用
- 请求转发:将服务名替换为选中实例的 IP:端口,执行实际请求
graph TD
A[客户端发起请求 http://user-service/xxx] --> B[LoadBalanced 拦截器]
B --> C[ServiceInstanceListSupplier 从 Nacos 获取实例列表]
C --> D[ReactorLoadBalancer 选择实例(如 192.168.1.1:9001)]
D --> E[改写 URL 为 http://192.168.1.1:9001/xxx]
E --> F[执行请求并返回结果]
五、兼容方案:Spring Boot 3 整合 Ribbon(不推荐)
如果因历史原因必须使用 Ribbon,需注意:
- Spring Boot 3 与 Ribbon 存在兼容性问题(Ribbon 基于 Java 8,且未适配 Spring 6)
- 需手动引入低版本依赖并处理冲突
5.1 特殊依赖配置
<!-- 注意:此配置可能导致兼容性问题 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.9.RELEASE</version> <!-- 最后一个稳定版本 -->
<exclusions>
<!-- 排除与 Spring Boot 3 冲突的依赖 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 强制指定兼容的 Spring 版本 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.20</version>
</dependency>
5.2 基本使用
与 Spring Boot 2 中类似,通过 @LoadBalanced 注解开启功能,但可能需要解决大量兼容性问题,因此强烈不推荐。
六、总结
-
技术选型建议:
- 新项目直接使用 Spring Cloud LoadBalancer + Nacos
- 老项目逐步从 Ribbon 迁移到 LoadBalancer
-
核心优势:
- LoadBalancer 更轻量,支持反应式编程
- 与 Spring Boot 3 完美兼容,持续更新维护
- 与 Nacos 集成良好,支持权重等高级策略
-
关键知识点:
@LoadBalanced注解的作用- 负载均衡策略的配置方式
- 服务发现与负载均衡的协同工作机制
通过本文,你已掌握 Spring Boot 3 中实现客户端负载均衡的最佳实践,以及与 Nacos 集成的完整流程。
更多推荐
所有评论(0)