【从入门到精通Spring Cloud】负载均衡Spring Cloud Load Balancer

【从入门到精通Spring Cloud】负载均衡Spring Cloud Load Balancer


特此注明 :
Designed By :长安城没有风
Version:1.0
Time:2025.09.08
Location:辽宁 · 大连

📕1. 什么是负载均衡?

负载均衡(Load Balancing)是一种分布式系统技术,核心目标是将大量的并发请求或数据流量均匀分配到多个服务器、节点或资源上,以避免单一设备过载,同时最大化系统的整体性能、可靠性和资源利用率。(简单来说,负载均衡就像 “交通调度员”:当一条道路(单一服务器)无法承载过多车辆(用户请求)时,调度员会引导车辆分流到其他畅通的道路(多台服务器),从而避免拥堵、减少事故(服务崩溃),并让所有道路的运力都得到充分利用。)

为什么需要负载均衡呢?

在没有负载均衡的系统中,所有用户请求都会直接发送到一台 “单点服务器”。随着业务增长,这种架构会面临三大核心问题:

  1. 性能瓶颈:单点服务器的 CPU、内存、带宽有限,无法处理高并发请求(如电商秒杀、直播带货),会导致响应缓慢甚至超时。
  2. 单点故障:一旦服务器宕机,整个系统直接瘫痪,可用性为 0。
  3. 资源浪费:若为了应对峰值请求而单纯升级单点服务器(“垂直扩容”),成本极高,且非峰值时资源会大量闲置。

负载均衡通过 “水平扩容”(增加服务器数量)+“流量分配”,完美解决了上述问题,是构建高可用、高并发系统的核心基础设施。

📕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 仅⽀持两种负载均衡策略 : 轮询策略 和 随机策略。

  1. 轮询(Round Robin) : 轮询策略是指服务器轮流处理用户的请求,这是⼀种实现最简单,也最常⽤的策略。⽣活中也有类似的场景,⽐如学校轮流值⽇,或者轮流打扫卫⽣。
  2. 随机选择(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);
    }
}

注意: 该类需要满⾜:

  1. 不⽤ @Configuration 注释
  2. 在组件扫描范围内

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 注解说明:

  1. name: 该负载均衡策略对哪个服务⽣效(服务提供⽅)
  2. configuration : 该负载均衡策略 ⽤哪个负载均衡策略实现.
转载请说明出处内容投诉
CSS教程网 » 【从入门到精通Spring Cloud】负载均衡Spring Cloud Load Balancer

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买