What is Spring Cloud LoadBalancer?

What is Spring Cloud LoadBalancer

Spring Cloud LoadBalancer is the official client load balancer provided by Spring Cloud itself, which is used to replace Ribbon.

Spring officially provides two load balancing clients:

RestTemplate

RestTemplate is a client provided by Spring for accessing Rest services. RestTemplate provides a variety of convenient methods for accessing remote Http services, which can greatly improve the writing efficiency of clients. By default, RestTemplate relies on jdk's HTTP connection tool by default.

WebClient

WebClient is a non-blocking client tool based on reactive programming for Http requests provided since Spring WebFlux 5.0. It's Reactor-based for reactive programming. WebClient provides get, post, put, delete and other methods corresponding to standard Http request methods, which can be used to initiate corresponding requests.

RestTemplate整合LoadBalancer

Introduce dependencies

<!-- LoadBalancer -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

<!-- 提供了RestTemplate支持 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- nacos服务注册与发现  移除ribbon支持-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Note: Ribbon is introduced in nacos-discovery, if you need to remove the ribbon package, you can also configure not to use ribbon in yml

yml configuration

spring:
  application:
    name: mall-user-loadbalancer-demo
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    # 不使用ribbon
    loadbalancer:
      ribbon:
        enabled: false

Principle: By default, if you have both RibbonLoadBalancerClient and BlockingLoadBalancerClient, in order to maintain backward compatibility, RibbonLoadBalancerClient will be used. To override this, set the spring.cloud.loadbalancer.ribbon.enabled property to false.

insert image description here
Configure RestTemplate with @LoadBalanced annotation

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

normal call

	// url = http://user-service/getUserId
  Result result = restTemplate.getForObject(url,Result.class);

WebClient integrates LoadBalancer

<!-- LoadBalancer -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

<!-- webflux -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

<!-- nacos服务注册与发现 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Configure WebClient as the client of the load balancer

@Configuration
public class WebClientConfig {
    
    

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

normal call

 // url = http://user-service/getUserId
    //基于WebClient
    Mono<Result> result = webClient.get().uri(url)
            .retrieve().bodyToMono(Result.class);

insert image description here

Guess you like

Origin blog.csdn.net/qq_42600094/article/details/130676670