Spring Cloud LoadBalancer

Spring Cloud LoadBalancer概述

Spring Cloud LoadBalancer 是 Spring Cloud 项目中的一个模块,用于在微服务架构中实现客户端负载均衡。它取代了以前常用的 Netflix Ribbon,提供了更轻量级、更可定制化的负载均衡解决方案。以下是其主要特性和功能:

  1. 轻量级实现:Spring Cloud LoadBalancer 是基于 Spring 的轻量级负载均衡实现,与 Ribbon 相比,它更加简洁易用。

  2. 无侵入性设计:它通过 Spring 的注解和配置来实现负载均衡,无需对应用代码进行大量修改。

  3. 支持多种负载均衡策略

    • 轮询 (Round Robin):请求按照顺序分配给每个服务实例。
    • 随机 (Random):请求随机分配给某个服务实例。
    • 权重 (Weighted):根据实例的权重分配请求。
  4. 自定义负载均衡策略:开发者可以根据需求自定义负载均衡策略,满足特定的业务需求。

  5. 与 Spring Cloud 组件无缝集成:它与 Spring Cloud Discovery Client(如 Eureka、Consul 等)无缝集成,能够自动从注册中心获取服务实例列表,并进行负载均衡。

  6. 简单配置:使用者只需在配置文件中进行简单配置即可启用负载均衡功能,无需额外的复杂设置。

Spring Cloud LoadBalancer使用

  1. 引入依赖:在 pom.xml 中添加相关依赖。

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
    
  2. 启用负载均衡:在需要进行负载均衡的客户端应用中,使用 @LoadBalanced 注解标注 RestTemplate 或者 WebClient

    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 RestTemplateConfig {
        @Bean
        @LoadBalanced //必须加入负载均衡
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
    
  3. 配置文件:在 application.yml 或者 application.properties 中进行配置,例如:

    spring:
      cloud:
        loadbalancer:
          ribbon:
            enabled: false  # 禁用 Ribbon
    
  4. 示例代码,假设有一个服务提供者 provider-service,客户端应用通过负载均衡访问该服务:

       import jakarta.annotation.Resource;
       import org.springframework.web.bind.annotation.GetMapping;
       import org.springframework.web.bind.annotation.RestController;
       import org.springframework.web.client.RestTemplate;
       
       @RestController
       public class OrderController {
       
           public static final String PaymentSrv_URL = "http://cloud-payment-service";//服务注册中心上的微服务名称
           @Resource
           private RestTemplate restTemplate;
       
           @GetMapping("/loadBalancer/test")
           public String getPaymentTimeout() {
               return restTemplate.getForObject(PaymentSrv_URL + "/next/loadBalancer/test", String.class);
           }
       }
    

通过上述步骤和配置,客户端应用可以通过 Spring Cloud LoadBalancer 实现对 provider-service 服务的负载均衡访问。