微服务负载均衡详解
在微服务架构中,服务集群化部署是常态,如何将海量请求均匀分发到多个服务实例,避免单点过载、保证系统高可用,是负载均衡要解决的核心问题。本文将从负载均衡分类、核心策略讲起,深入讲解 Spring Cloud 官方推荐的 LoadBalancer 组件,并通过完整实战案例带你落地使用。
一、负载均衡策略核心分类
负载均衡本质是请求分发机制,根据分发逻辑的执行位置,分为两大类:服务端负载均衡和客户端负载均衡。
1. 服务端负载均衡
代表组件:Nginx、F5、HAProxy核心逻辑:请求先到达独立的负载均衡中介(服务器 / 中间件),由中介根据预设策略转发到后端服务实例。关键特点:对客户端完全透明,客户端无需知晓后端服务数量、地址,所有请求统一流向中心负载均衡器。
2. 客户端负载均衡
代表组件:Spring Cloud LoadBalancer、Ribbon核心逻辑:分发逻辑集成在服务消费者(客户端)本地,客户端提前缓存服务实例列表,自主选择目标实例发送请求。关键特点:客户端直接掌握服务信息,无需经过中心中介,直接调用目标服务。
3. 两者核心区别
表格
| 维度 | 服务端负载均衡 | 客户端负载均衡 |
|---|---|---|
| 灵活性 | 全局统一配置,无法精细化控制 | 支持单服务、单请求自定义配置 |
| 性能 | 多一次请求转发,中心节点压力大 | 直接调用,无中心节点,性能更优 |
| 代理性质 | 反向代理(隐藏后端服务) | 正向代理(客户端知晓服务列表) |
二、常见负载均衡策略
无论哪种负载均衡模式,核心都是通过策略选择服务实例,常用策略如下:
- 轮询:按顺序依次分配请求,适合实例性能一致场景;
- 随机选择:随机挑选实例,请求分布均匀;
- 最少连接:优先选择当前连接数最少的实例,适配长连接场景;
- IP 哈希:固定 IP 请求分配给固定实例,保证会话一致性;
- 加权轮询 / 随机:按实例性能分配权重,高性能实例接收更多请求;
- 最短响应时间:优先选择响应快的实例,动态适配服务性能;
- 区域感知:优先调用同区域实例,减少跨机房延迟。
三、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. 基础验证(多实例轮询)
- 复制服务提供者,修改端口为 8083,启动两个提供者实例;
- 访问消费者接口
http://localhost:8081/api/consumer/call-provider; - 多次请求会交替返回 8082、8083 端口的响应,验证轮询策略生效。
2. 随机策略配置
修改消费者 application.yml,将策略改为 Random:
yaml
spring:
cloud:
loadbalancer:
rule:
name: Random
重启消费者,多次请求会随机分配到不同提供者实例。
3. 加权响应时间策略
配置策略为 WeightedResponseTime,模拟实例响应差异:
yaml
spring:
cloud:
loadbalancer:
rule:
name: WeightedResponseTime
响应快的实例会被优先调用,请求分配比例随响应时间动态调整。
4. 区域感知策略
- 给提供者配置区域元数据:
yaml
spring:
cloud:
nacos:
discovery:
metadata:
region: cn-hangzhou
- 消费者配置策略
ZoneAvoidance,优先调用同区域实例。
六、总结
- 负载均衡分服务端(Nginx)和客户端(LoadBalancer),客户端更灵活、性能更优;
- Spring Cloud LoadBalancer 替代 Ribbon,依托注册中心实现服务发现,支持多种内置策略;
- 实战核心:通过
@LoadBalanced开启负载均衡,配置文件指定策略,轻松实现微服务请求分发。
更多推荐


所有评论(0)