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.
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);