专业的编程技术博客社区

网站首页 > 博客文章 正文

详细介绍一下Spring Boot中如何使用Spring Cloud LoadBalancer?

baijin 2025-04-01 15:48:28 博客文章 23 ℃ 0 评论

Spring Cloud LoadBalancer是Spring Cloud生态体系下的一个轻量级的服务负载均衡的解决方案,主要的功能是在服务客户端实现负载均衡策略,其目的就是为了替代之前的Ribbon框架,成为Spring Cloud 生态下的权限的客户端负载均衡的框架,下面我们就来详细的介绍一下在Spring Boot中如何整合Spring Cloud LoadBalancer实现客户端的负载均衡。

引入依赖

在Spring Cloud LoadBalancer中需要与注册中心配合实现动态服务列表的获取操作,下面我们就以Eureka注册中心为例来演示如何对Spring Cloud LoadBalancer进行集成。

首先需要添加的就是Spring Cloud LoadBalancer的依赖配置,如果要使用Eureka作为注册中心的话还需要添加Eureka客户端依赖,如下所示。


    org.springframework.cloud
    spring-cloud-starter-loadbalancer



    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client

基本配置

依赖添加完成之后,第二步操作就是完成配置信息的管理,首先需要保证服务能够正确的从Eureka注册中心获取到服务注册的列表信息,如下所示。

yaml复制代码spring:
  application:
    name: demo-service
  cloud:
    discovery:
      client:
        enabled: true
  eureka:
    client:
      service-url:
        defaultZone: http://localhost:8761/eureka/

接下来就是需要保证能够在客户端正确的使用对应的客户端负载均衡机制,需要通过@LoadBalanced 注解标记RestTemplate或WebClient Bean,以启用客户端侧负载均衡。

基于RestTemplate的示例

首先需要在配置文件中创建一个通过RestTemplate调用的客户端操作,如下所示。

@Configuration
public class AppConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

在上面的代码中,通过@LoadBalanced注解就开启了客户端负载均衡的操作,然后我们就可以通过RestTemplate直接进行服务的调用操作,如下所示。

@RestController
public class DemoController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/invoke-service")
    public String invokeService() {
        String url = "http://target-service/api/endpoint";
        return restTemplate.getForObject(url, String.class);
    }
}

其中,target-service是目标微服务的服务名在进行微服务调用的时候Spring Cloud LoadBalancer会自动解析为实际的实例地址。

基于 WebClient 的示例

WebClient是在Spring WebFlux提供的接口访问支持,它也支持通过@LoadBalanced注解开启客户端负载均衡操作。如下所示。

@Configuration
public class WebClientConfig {

    @Bean
    @LoadBalanced
    public WebClient.Builder webClientBuilder() {
        return WebClient.builder();
    }
}

在调用服务的时候,通过服务名称就可以调用对应的微服务。如下所示。

@RestController
public class WebClientController {

    @Autowired
    private WebClient.Builder webClientBuilder;

    @GetMapping("/invoke-service-webclient")
    public String invokeService() {
        String url = "http://target-service/api/endpoint";
        return webClientBuilder.build()
                .get()
                .uri(url)
                .retrieve()
                .bodyToMono(String.class)
                .block();
    }
}

上面我们演示了如何通过默认的负载均衡策略来实现客户端负载均衡的操作,当然Spring Cloud LoadBalancer提供的功能远远不止这些,下面我们就来看看如何通过自定义的配置来改变默认的负载均衡策略。

自定义负载均衡策略

配置随机策略

我们可以在application.yml配置文件中将默认的策略改成随机,如下所示。

spring:
  cloud:
    loadbalancer:
      ribbon:
        enabled: false
    discovery:
      client:
        simple:
          instances:
            target-service:
              - uri: http://localhost:8081
              - uri: http://localhost:8082
      loadbalancer:
        default:
          hint: random

当然我们还可以通过Java的配置类来进行配置,如下所示。

@Configuration
@LoadBalancerClients(defaultConfiguration = LoadBalancerClientConfiguration.class)
public class CustomLoadBalancerConfig {

    @Bean
    public ReactorLoadBalancer randomLoadBalancer() {
        return new ReactorLoadBalancer<>() {
            @Override
            public ServiceInstance choose(Request request) {
                List instances = discoveryClient.getInstances("target-service");
                return instances.get(ThreadLocalRandom.current().nextInt(instances.size()));
            }
        };
    }
}

总结

上面我们演示了如何在Spring Boot中整合Spring Cloud LoadBalancer,实现高效灵活的负载均衡解决方案,通过与Spring Cloud 的生态的整合,可以快速实现微服务之间的高可用调用。通过对上面实现的介绍,我们了解了在实际项目中如何去选择负载均衡策略以及如何实现负载均衡策略。有兴趣的读者可以自己上手操作,遇到问题可以在评论区留言一起讨论。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表