在微服务架构中,服务集群化部署是常态,如何将海量请求均匀分发到多个服务实例,避免单点过载、保证系统高可用,是负载均衡要解决的核心问题。本文将从负载均衡分类、核心策略讲起,深入讲解 Spring Cloud 官方推荐的 LoadBalancer 组件,并通过完整实战案例带你落地使用。

一、负载均衡策略核心分类

负载均衡本质是请求分发机制,根据分发逻辑的执行位置,分为两大类:服务端负载均衡和客户端负载均衡。

1. 服务端负载均衡

代表组件:Nginx、F5、HAProxy核心逻辑:请求先到达独立的负载均衡中介(服务器 / 中间件),由中介根据预设策略转发到后端服务实例。关键特点:对客户端完全透明,客户端无需知晓后端服务数量、地址,所有请求统一流向中心负载均衡器。

2. 客户端负载均衡

代表组件:Spring Cloud LoadBalancer、Ribbon核心逻辑:分发逻辑集成在服务消费者(客户端)本地,客户端提前缓存服务实例列表,自主选择目标实例发送请求。关键特点:客户端直接掌握服务信息,无需经过中心中介,直接调用目标服务。

3. 两者核心区别

表格

维度服务端负载均衡客户端负载均衡
灵活性全局统一配置,无法精细化控制支持单服务、单请求自定义配置
性能多一次请求转发,中心节点压力大直接调用,无中心节点,性能更优
代理性质反向代理(隐藏后端服务)正向代理(客户端知晓服务列表)

二、常见负载均衡策略

无论哪种负载均衡模式,核心都是通过策略选择服务实例,常用策略如下:

  1. 轮询:按顺序依次分配请求,适合实例性能一致场景;
  2. 随机选择:随机挑选实例,请求分布均匀;
  3. 最少连接:优先选择当前连接数最少的实例,适配长连接场景;
  4. IP 哈希:固定 IP 请求分配给固定实例,保证会话一致性;
  5. 加权轮询 / 随机:按实例性能分配权重,高性能实例接收更多请求;
  6. 最短响应时间:优先选择响应快的实例,动态适配服务性能;
  7. 区域感知:优先调用同区域实例,减少跨机房延迟。

三、Spring Cloud LoadBalancer 核心认知

Spring Cloud LoadBalancer 是 Spring 官方替代 Ribbon的客户端负载均衡器,Ribbon 自 Spring Cloud 2020.0.0 版本后被移除且停止维护,LoadBalancer 成为微服务负载均衡的首选方案。

1. 核心原理

(1)服务发现机制

依托 Nacos、Eureka 等注册中心,实现服务实例的动态感知:

  • 服务启动时,向注册中心注册自身 IP、端口、服务名;
  • LoadBalancer 定期拉取服务实例列表并本地缓存;
  • 监听注册中心事件,实例新增、下线时实时更新缓存,保证可用性。
(2)内置负载均衡策略
  • 轮询(RoundRobin):默认策略,按实例顺序循环分发;
  • 随机(Random):随机选择实例,简单高效;
  • 权重(Weighted):按权重概率选择,适配性能差异实例;
  • 最少连接数(LeastConnections):动态匹配实例负载;
  • 加权响应时间(WeightedResponseTime):响应越快权重越高,动态优化;
  • 区域感知(ZoneAvoidance):优先同区域调用,降低网络延迟。

四、Spring Cloud LoadBalancer 实战搭建

基于 Spring Boot 3.2.0 + Spring Cloud 2023.0.0 + Nacos,搭建服务提供者 + 服务消费者,实现负载均衡调用。

1. 搭建父工程

创建 Maven 父工程 loadBalancer,统一管理依赖版本:

xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>net.togogo</groupId>
  <artifactId>loadBalancer</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
  <properties>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.boot.version>3.2.0</spring.boot.version>
    <spring.cloud.version>2023.0.0</spring.cloud.version>
    <spring.cloud.alibaba.version>2023.0.1.0</spring.cloud.alibaba.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring.cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>${spring.cloud.alibaba.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring.boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

2. 创建服务提供者

(1)引入依赖

创建子模块 quickstart-provider,引入 Nacos 服务发现和 Web 依赖:

xml

<parent>
  <groupId>net.togogo</groupId>
  <artifactId>loadBalancer</artifactId>
  <version>1.0-SNAPSHOT</version>
</parent>
<artifactId>quickstart-provider</artifactId>
<dependencies>
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
</dependencies>
(2)配置文件

application.yml 配置服务名、Nacos 地址:

yaml

spring:
  application:
    name: quickstart-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
server:
  port: 8082
(3)编写接口

java

运行

@RestController
public class TestController {
    @GetMapping("/api/hello")
    public String hello() {
        return "Hello from quickstart-provider (port: 8082)!";
    }
}
(4)启动类

java

运行

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }
}

3. 创建服务消费者

(1)引入依赖

创建子模块 quickstart-consumer,新增 LoadBalancer 依赖:

xml

<parent>
  <groupId>net.togogo</groupId>
  <artifactId>loadBalancer</artifactId>
  <version>1.0-SNAPSHOT</version>
</parent>
<artifactId>quickstart-consumer</artifactId>
<dependencies>
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
</dependencies>
(2)配置文件

开启负载均衡、配置健康检查:

yaml

server:
  port: 8081
spring:
  application:
    name: quickstart-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    loadbalancer:
      health-check:
        enabled: true
        interval: 5000
        timeout: 1000
        healthy-threshold: 1
      rule:
        name: roundRobin
      enabled: true
(3)配置 RestTemplate

添加 @LoadBalanced 注解,开启负载均衡:

java

运行

@Configuration
public class RestTemplateConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
(4)调用服务提供者

java

运行

@RestController
public class ConsumerControllerTest {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/api/consumer/call-provider")
    public String callProvider() {
        String url = "http://quickstart-provider/api/hello";
        return restTemplate.getForObject(url, String.class);
    }
}
(5)启动类

java

运行

@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

五、负载均衡策略实战验证

1. 基础验证(多实例轮询)

  1. 复制服务提供者,修改端口为 8083,启动两个提供者实例;
  2. 访问消费者接口 http://localhost:8081/api/consumer/call-provider;
  3. 多次请求会交替返回 8082、8083 端口的响应,验证轮询策略生效。

2. 随机策略配置

修改消费者 application.yml,将策略改为 Random:

yaml

spring:
  cloud:
    loadbalancer:
      rule:
        name: Random

重启消费者,多次请求会随机分配到不同提供者实例。

3. 加权响应时间策略

配置策略为 WeightedResponseTime,模拟实例响应差异:

yaml

spring:
  cloud:
    loadbalancer:
      rule:
        name: WeightedResponseTime

响应快的实例会被优先调用,请求分配比例随响应时间动态调整。

4. 区域感知策略

  1. 给提供者配置区域元数据:

yaml

spring:
  cloud:
    nacos:
      discovery:
        metadata:
          region: cn-hangzhou
  1. 消费者配置策略 ZoneAvoidance,优先调用同区域实例。

六、总结

  1. 负载均衡分服务端(Nginx)和客户端(LoadBalancer),客户端更灵活、性能更优;
  2. Spring Cloud LoadBalancer 替代 Ribbon,依托注册中心实现服务发现,支持多种内置策略;
  3. 实战核心:通过 @LoadBalanced 开启负载均衡,配置文件指定策略,轻松实现微服务请求分发。

更多推荐