More Related Content
Similar to 今から始めるWebClient(JSUG勉強会 2020年その6 LT大会) (20)
More from NTT DATA Technology & Innovation (20)
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
- 1. © 2020 NTT DATA Corporation
今から始めるWebClient
JSUG勉強会 2020年その6 LT大会
2020年7月30日
株式会社NTTデータ
伊藤 司
- 2. © 2020 NTT DATA Corporation 2
今日話すこと
SpringアプリケーションのHTTP Clientとして
WebClientを使っていこう
Spring Boot(MVC)でのWebClientの始め方
- 3. © 2020 NTT DATA Corporation 3
今日話さないこと
WebFluxの詳しい話
Reactorの詳しい話
JettyベースのWebClient
- 4. © 2020 NTT DATA Corporation 4
WebClientって何?
Reactor NettyベースのノンブロッキングなHTTP
Client
Spring WebFluxに同梱されている
Spring MVCでも使える
- 5. © 2020 NTT DATA Corporation 5
なぜWebClient?
SpringにおけるHTTP Clientといえば...
RestTemplate
- 6. © 2020 NTT DATA Corporation 6
なぜWebClient?
ですが...
RestTemplateはSpring 5.0でメンテナンスモードに
※非推奨になったわけではありません
- 7. © 2020 NTT DATA Corporation 7
なぜWebClient?
そこで...
WebClient
- 8. © 2020 NTT DATA Corporation 8
WebClientを利用する際のメリット・デメリット
メリット
• Genericsの扱いが楽
• RestTemplateと比べてGenericsを素直に扱える
• 大量のリクエストをさばきやすい
• ノンブロッキングであるため、少ないスレッドで大量のリクエストを並列に実行できる
• Reactorベースのインタフェースであるため、スレッドを意識せずに並列処理を記述できる
デメリット
• WebFlux/Reactorの理解が必要
• 凝った処理を実装したい場合にWebFlux/Reactorの知識が必要になる
- 9. © 2020 NTT DATA Corporation 9
WebClientの始め方 Spring Boot(MVC) + WebClient
spring-boot-starter-webとspring-boot-starter-webfluxを依存関係に加える
両方が依存関係に含まれる場合、Spring MVCタイプのアプリケーションとして起動
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
- 10. © 2020 NTT DATA Corporation 10
WebClientの始め方 Spring Boot(MVC) + WebClient
WebClient.Builderをインジェクションし、WebClientを生成する
WebClient.BuilderはSpring BootのAuto ConfigurationによってBean定義されてい
る。
@Component
public class WebClientSample {
private final WebClient webClient;
public WebClientSample(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.build();
}
}
- 11. © 2020 NTT DATA Corporation 11
WebClientの基本的な使い方 – GETリクエスト
public JsonNode get() {
return webClient.get() // リクエストメソッドを指定
.uri("https://httpbin.org/delay/1") // URLを指定
.retrieve() // リクエスト実行
.bodyToMono(JsonNode.class) // レスポンスをオブジェクト(リアクティブ型)にマッピング
.block(); // リアクティブ型から通常のオブジェクトを取得
}
- 12. © 2020 NTT DATA Corporation 12
WebClientの基本的な使い方 – POSTリクエスト
public JsonNode post() {
return webClient.post() // リクエストメソッドを指定
.uri("https://httpbin.org/delay/1") // URLを指定
.contentType(MediaType.APPLICATION_JSON) // コンテンツタイプを指定
.bodyValue(new Message("Hello WebClient")) // POSTのボディを指定
.retrieve() // リクエスト実行
.bodyToMono(JsonNode.class) // レスポンスをオブジェクト(リアクティブ型)にマッピング
.block(); // リアクティブ型から通常のオブジェクトを取得
}
- 13. © 2020 NTT DATA Corporation 13
WebClientのカスタマイズ
WebClient.Builderをカスタマイズ
• WebClientCustomizerインタフェースを実装したクラスを作成する
• デフォルトのURL、ヘッダ、Cookieなどを設定可能
WebClientが内部的に使用しているHttpClientをカスタマイズ
• ReactorNettyHttpClientMapperインタフェースを実装したクラスを作成する
• ReactorNetty、Nettyの知識が必要になるので若干ハードルが高い
- 14. © 2020 NTT DATA Corporation 14
WebClientのカスタマイズ例 - タイムアウト
@Component
public class ReactorNettyHttpClientTimeoutMapper implements ReactorNettyHttpClientMapper {
@Override
public HttpClient configure(HttpClient httpClient) {
return httpClient.tcpConfiguration((tcpClient -> {
// コネクションタイムアウト(ミリ秒で設定)
return tcpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000)
.doOnConnected(conn -> conn
// リードタイムアウト(秒で設定)
.addHandlerLast(new ReadTimeoutHandler(30))
// ライトタイムアウト(秒で設定)
.addHandlerLast(new WriteTimeoutHandler(30)));
}));
}
}
- 15. © 2020 NTT DATA Corporation 15
まとめ
Sprint Boot(MVC)でもWebClientを使っていき
ましょう!
WebClientをきっかけにして、WebFlux/Reactorにも
触れてみましょう!
サンプルコードはこちら
• https://github.com/itoutki/introduction-to-webclient
- 16. © 2020 NTT DATA Corporation 16
参考資料
• Web on Reactive Stack 2. WebClient
• https://docs.spring.io/spring/docs/current/spring-framework-reference/web-
reactive.html#webflux-client
• Web on Servlet Stack 2.1. RestTemplate
• https://docs.spring.io/spring/docs/current/spring-framework-
reference/web.html#webmvc-resttemplate
• 業務で使いたいWebFluxによるReactiveプログラミング
• https://speakerdeck.com/shintanimoto/introduction-to-reactive-programming-using-
spring-webflux
• Functional Spring Cookbook
• https://docs.google.com/presentation/d/1-0NopTfA-CGiCNvKPDOH9ZDMHhazKuoT-
_1R69Wp8qs
• SpringのWebClientのtimeoutとretryについて
• https://blog.ik.am/entries/467
- 17. © 2020 NTT DATA Corporation
その他、記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。