© 2020 NTT DATA Corporation
今から始めるWebClient
JSUG勉強会 2020年その6 LT大会
2020年7月30日
株式会社NTTデータ
伊藤 司
© 2020 NTT DATA Corporation 2
今日話すこと
SpringアプリケーションのHTTP Clientとして
WebClientを使っていこう
Spring Boot(MVC)でのWebClientの始め方
© 2020 NTT DATA Corporation 3
今日話さないこと
WebFluxの詳しい話
Reactorの詳しい話
JettyベースのWebClient
© 2020 NTT DATA Corporation 4
WebClientって何?
Reactor NettyベースのノンブロッキングなHTTP
Client
Spring WebFluxに同梱されている
Spring MVCでも使える
© 2020 NTT DATA Corporation 5
なぜWebClient?
SpringにおけるHTTP Clientといえば...
RestTemplate
© 2020 NTT DATA Corporation 6
なぜWebClient?
ですが...
RestTemplateはSpring 5.0でメンテナンスモードに
※非推奨になったわけではありません
© 2020 NTT DATA Corporation 7
なぜWebClient?
そこで...
WebClient
© 2020 NTT DATA Corporation 8
WebClientを利用する際のメリット・デメリット
メリット
• Genericsの扱いが楽
• RestTemplateと比べてGenericsを素直に扱える
• 大量のリクエストをさばきやすい
• ノンブロッキングであるため、少ないスレッドで大量のリクエストを並列に実行できる
• Reactorベースのインタフェースであるため、スレッドを意識せずに並列処理を記述できる
デメリット
• WebFlux/Reactorの理解が必要
• 凝った処理を実装したい場合にWebFlux/Reactorの知識が必要になる
© 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>
© 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();
}
}
© 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(); // リアクティブ型から通常のオブジェクトを取得
}
© 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(); // リアクティブ型から通常のオブジェクトを取得
}
© 2020 NTT DATA Corporation 13
WebClientのカスタマイズ
WebClient.Builderをカスタマイズ
• WebClientCustomizerインタフェースを実装したクラスを作成する
• デフォルトのURL、ヘッダ、Cookieなどを設定可能
WebClientが内部的に使用しているHttpClientをカスタマイズ
• ReactorNettyHttpClientMapperインタフェースを実装したクラスを作成する
• ReactorNetty、Nettyの知識が必要になるので若干ハードルが高い
© 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)));
}));
}
}
© 2020 NTT DATA Corporation 15
まとめ
Sprint Boot(MVC)でもWebClientを使っていき
ましょう!
WebClientをきっかけにして、WebFlux/Reactorにも
触れてみましょう!
サンプルコードはこちら
• https://github.com/itoutki/introduction-to-webclient
© 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
© 2020 NTT DATA Corporation
その他、記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)

  • 1.
    © 2020 NTTDATA Corporation 今から始めるWebClient JSUG勉強会 2020年その6 LT大会 2020年7月30日 株式会社NTTデータ 伊藤 司
  • 2.
    © 2020 NTTDATA Corporation 2 今日話すこと SpringアプリケーションのHTTP Clientとして WebClientを使っていこう Spring Boot(MVC)でのWebClientの始め方
  • 3.
    © 2020 NTTDATA Corporation 3 今日話さないこと WebFluxの詳しい話 Reactorの詳しい話 JettyベースのWebClient
  • 4.
    © 2020 NTTDATA Corporation 4 WebClientって何? Reactor NettyベースのノンブロッキングなHTTP Client Spring WebFluxに同梱されている Spring MVCでも使える
  • 5.
    © 2020 NTTDATA Corporation 5 なぜWebClient? SpringにおけるHTTP Clientといえば... RestTemplate
  • 6.
    © 2020 NTTDATA Corporation 6 なぜWebClient? ですが... RestTemplateはSpring 5.0でメンテナンスモードに ※非推奨になったわけではありません
  • 7.
    © 2020 NTTDATA Corporation 7 なぜWebClient? そこで... WebClient
  • 8.
    © 2020 NTTDATA Corporation 8 WebClientを利用する際のメリット・デメリット メリット • Genericsの扱いが楽 • RestTemplateと比べてGenericsを素直に扱える • 大量のリクエストをさばきやすい • ノンブロッキングであるため、少ないスレッドで大量のリクエストを並列に実行できる • Reactorベースのインタフェースであるため、スレッドを意識せずに並列処理を記述できる デメリット • WebFlux/Reactorの理解が必要 • 凝った処理を実装したい場合にWebFlux/Reactorの知識が必要になる
  • 9.
    © 2020 NTTDATA 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 NTTDATA 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 NTTDATA Corporation 11 WebClientの基本的な使い方 – GETリクエスト public JsonNode get() { return webClient.get() // リクエストメソッドを指定 .uri("https://httpbin.org/delay/1") // URLを指定 .retrieve() // リクエスト実行 .bodyToMono(JsonNode.class) // レスポンスをオブジェクト(リアクティブ型)にマッピング .block(); // リアクティブ型から通常のオブジェクトを取得 }
  • 12.
    © 2020 NTTDATA 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 NTTDATA Corporation 13 WebClientのカスタマイズ WebClient.Builderをカスタマイズ • WebClientCustomizerインタフェースを実装したクラスを作成する • デフォルトのURL、ヘッダ、Cookieなどを設定可能 WebClientが内部的に使用しているHttpClientをカスタマイズ • ReactorNettyHttpClientMapperインタフェースを実装したクラスを作成する • ReactorNetty、Nettyの知識が必要になるので若干ハードルが高い
  • 14.
    © 2020 NTTDATA 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 NTTDATA Corporation 15 まとめ Sprint Boot(MVC)でもWebClientを使っていき ましょう! WebClientをきっかけにして、WebFlux/Reactorにも 触れてみましょう! サンプルコードはこちら • https://github.com/itoutki/introduction-to-webclient
  • 16.
    © 2020 NTTDATA 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 NTTDATA Corporation その他、記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。