Spring Cloud LoadBalancer とは
Spring Cloud LoadBalancer は、Spring Cloud 自体によって提供される公式のクライアント ロード バランサーであり、Ribbon の代わりに使用されます。
Spring は公式に 2 つの負荷分散クライアントを提供しています。
残りのテンプレート
RestTemplate は、Rest サービスにアクセスするために Spring によって提供されるクライアントであり、リモートの Http サービスにアクセスするためのさまざまな便利なメソッドを提供し、クライアントの書き込み効率を大幅に向上させることができます。デフォルトでは、RestTemplate は jdk の HTTP 接続ツールに依存します。
ウェブクライアント
WebClient は、Spring WebFlux 5.0 以降で提供されている Http リクエストのリアクティブ プログラミングに基づくノンブロッキング クライアント ツールです。リアクティブ プログラミング用の Reactor ベースです。WebClient は、標準の Http リクエスト メソッドに対応する get、post、put、delete などのメソッドを提供しており、これらのメソッドを使用して、対応するリクエストを開始できます。
RestTemplate 統合LoadBalancer
依存関係を導入する
<!-- 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>
注: リボンは nacos-discovery で導入されています。リボン パッケージを削除する必要がある場合は、リボンを使用しないように yml で設定することもできます。
yml設定
spring:
application:
name: mall-user-loadbalancer-demo
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
# 不使用ribbon
loadbalancer:
ribbon:
enabled: false
原則: デフォルトでは、RibbonLoadBalancerClient と BlockingLoadBalancerClient の両方がある場合、下位互換性を維持するために、RibbonLoadBalancerClient が使用されます。これをオーバーライドするには、spring.cloud.loadbalancer.ribbon.enabled プロパティを false に設定します。
@LoadBalanced アノテーションを使用して RestTemplate を構成する
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
通常の通話
// url = http://user-service/getUserId
Result result = restTemplate.getForObject(url,Result.class);
WebClient は 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>
WebClient をロード バランサーのクライアントとして構成する
@Configuration
public class WebClientConfig {
@LoadBalanced
@Bean
WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
@Bean
WebClient webClient() {
return webClientBuilder().build();
}
}
通常の通話
// url = http://user-service/getUserId
//基于WebClient
Mono<Result> result = webClient.get().uri(url)
.retrieve().bodyToMono(Result.class);