特此注明 :
Designed By :长安城没有风
Version:1.0
Time:2025.09.08
Location:辽宁 · 大连
📕1. 什么是负载均衡?
负载均衡(Load Balancing)是一种分布式系统技术,核心目标是将大量的并发请求或数据流量均匀分配到多个服务器、节点或资源上,以避免单一设备过载,同时最大化系统的整体性能、可靠性和资源利用率。(简单来说,负载均衡就像 “交通调度员”:当一条道路(单一服务器)无法承载过多车辆(用户请求)时,调度员会引导车辆分流到其他畅通的道路(多台服务器),从而避免拥堵、减少事故(服务崩溃),并让所有道路的运力都得到充分利用。)
为什么需要负载均衡呢?
在没有负载均衡的系统中,所有用户请求都会直接发送到一台 “单点服务器”。随着业务增长,这种架构会面临三大核心问题:
- 性能瓶颈:单点服务器的 CPU、内存、带宽有限,无法处理高并发请求(如电商秒杀、直播带货),会导致响应缓慢甚至超时。
- 单点故障:一旦服务器宕机,整个系统直接瘫痪,可用性为 0。
- 资源浪费:若为了应对峰值请求而单纯升级单点服务器(“垂直扩容”),成本极高,且非峰值时资源会大量闲置。
负载均衡通过 “水平扩容”(增加服务器数量)+“流量分配”,完美解决了上述问题,是构建高可用、高并发系统的核心基础设施。
📕2. 快速上手使用Spring Cloud LoadBalancer
✏️2.1 添加注解
想使⽤Spring Cloud LoadBalancer实现负载均衡,给 RestTemplate 这个Bean添加@LoadBalanced 注解就可以。
@Configuration
public class BeanConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
✏️2.2 修改IP端口号微服务名称
我们只需要把原来的127.0.0.1:9090这个IP端口号换成服务名称即可。(例如我当前服务名称是product- service)
String url = "http://product-service/product/" + orderInfo.getProductId();
✏️2.3 启动多个服务示例
1.点击service -> 右键选中Copy Configuration
2.点击Modify options -> 点击Add VM options
3.输入:-Dserver.port=你想用的端口号 -> 点击apply -> 点击OK即可
✏️2.4 测试负载均衡
连续多次发起请求: http://127.0.0.1:8080/order/1,观察product-service的⽇志, 会发现请求被分配到这3个实例上了。
📕3. 负载均衡策略
负载均衡策略是⼀种思想,⽆论是哪种负载均衡器,它们的负载均衡策略都是相似的。Spring Cloud
LoadBalancer 仅⽀持两种负载均衡策略 : 轮询策略 和 随机策略。
- 轮询(Round Robin) : 轮询策略是指服务器轮流处理用户的请求,这是⼀种实现最简单,也最常⽤的策略。⽣活中也有类似的场景,⽐如学校轮流值⽇,或者轮流打扫卫⽣。
- 随机选择(Random) : 随机选择策略是指随机选择⼀个后端服务器来处理新的请求。
✏️3.1 自定义负载均衡策略
Spring Cloud LoadBalancer 默认负载均衡策略是 轮询策略,实现是 RoundRobinLoadBalancer,如果
服务的消费者如果想采⽤随机的负载均衡策略,也⾮常简单。参考官网地址
1. 定义随机算法对象, 通过 @Bean 将其加载到 Spring 容器中
package order.config;
import org.springframework.cloud.client.ServiceInstance;
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;
public class CustomLoadBalancerConfiguration {
@Bean
ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(loadBalancerClientFactory
.getLazyProvider(name, ServiceInstanceListSupplier.class),
name);
}
}
注意: 该类需要满⾜:
- 不⽤ @Configuration 注释
- 在组件扫描范围内
2. 使⽤ @LoadBalancerClient 或者 @LoadBalancerClients 注解
在 RestTemplate 配置类上⽅,使⽤ @LoadBalancerClient 或 @LoadBalancerClients 注解,可以对不同的服务提供⽅配置不同的客⼾端负载均衡算法策略。由于咱们项⽬中只有⼀个服务提供者,所以使⽤@LoadBalancerClient。
@Configuration
@LoadBalancerClient(name = "product-service", configuration = CustomLoadBalancerConfiguration.class)
public class BeanConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@LoadBalancerClient 注解说明:
- name: 该负载均衡策略对哪个服务⽣效(服务提供⽅)
- configuration : 该负载均衡策略 ⽤哪个负载均衡策略实现.