Spring Boot 3 整合 Ribbon:基于 Nacos 的完整指南(从入门到实战与原理)

一、前言:Spring Boot 3 与 Ribbon 的现状说明

需要特别注意的是:Spring Boot 3 对应的 Spring Cloud 2022+ 版本已彻底移除 Ribbon,因为 Ribbon 已被 Netflix 停止维护,Spring Cloud 官方推荐使用 Spring Cloud LoadBalancer 作为替代方案。

但考虑到部分项目仍有迁移需求,本文将分为两部分:

  1. 推荐方案:Spring Boot 3 + Spring Cloud LoadBalancer + Nacos(符合当前技术趋势)
  2. 兼容方案: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 服务发现

  1. 安装 Nacos Server:参考 Nacos 官方文档 启动 Nacos 服务(默认端口 8848)

  2. 应用配置(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)

  1. 依赖:同上(需包含 Nacos 发现依赖)

  2. 代码

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);
    }
}
  1. 配置
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
server:
  port: 9001 # 第二个实例启动时改为 9002

3.3 测试负载均衡效果

  1. 启动 Nacos Server
  2. 启动 user-service 的两个实例(9001 和 9002)
  3. 启动消费者 loadbalancer-demo(8080)
  4. 多次访问 http://localhost:8080/call-user

预期结果:请求会被均衡分配到 9001 和 9002 两个实例(默认轮询策略)

四、底层原理:Spring Cloud LoadBalancer 工作机制

4.1 核心组件

  • LoadBalancerClient:负载均衡客户端核心接口
  • ServiceInstanceListSupplier:服务实例列表提供者(从 Nacos 获取)
  • ReactorLoadBalancer:反应式负载均衡器
  • LoadBalancerRequestTransformer:请求转换器
  • LoadBalancerRetryPolicy:重试策略

4.2 工作流程

  1. 服务发现ServiceInstanceListSupplier 定期从 Nacos 拉取服务实例列表
  2. 负载均衡选择
    • 当调用 restTemplate.getForObject("http://user-service/xxx")
    • @LoadBalanced 注解会触发拦截器
    • 负载均衡器根据配置的策略(如轮询、随机)从服务列表中选择实例
  3. 请求转发:将服务名替换为选中实例的 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,需注意:

  1. Spring Boot 3 与 Ribbon 存在兼容性问题(Ribbon 基于 Java 8,且未适配 Spring 6)
  2. 需手动引入低版本依赖并处理冲突

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 注解开启功能,但可能需要解决大量兼容性问题,因此强烈不推荐

六、总结

  1. 技术选型建议

    • 新项目直接使用 Spring Cloud LoadBalancer + Nacos
    • 老项目逐步从 Ribbon 迁移到 LoadBalancer
  2. 核心优势

    • LoadBalancer 更轻量,支持反应式编程
    • 与 Spring Boot 3 完美兼容,持续更新维护
    • 与 Nacos 集成良好,支持权重等高级策略
  3. 关键知识点

    • @LoadBalanced 注解的作用
    • 负载均衡策略的配置方式
    • 服务发现与负载均衡的协同工作机制

通过本文,你已掌握 Spring Boot 3 中实现客户端负载均衡的最佳实践,以及与 Nacos 集成的完整流程。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐