クライアント要求を複数受信した後、有意な減少を遮断する方法のパフォーマンス。
この方法の反応性および非ブロックパフォーマンスが要求の数、安定した性能の独立していなければなりません
春ブーツWebFluxスターター依存追加します
<依存性> <のgroupId> org.springframework.boot </のgroupId> <たartifactId>ばねブートスタータwebflux </たartifactId> </依存>
かかる比較
@GetMapping( "/低速サービスツイート") 、プライベートリスト<さえずる> getAllTweets(){ のThread.sleep(2000L)。//は延迟 は、Arrays.asList(戻る 新しいツイート( "RestTemplateルール"、 "USER1 @")、 新しいツイートを( "USER2 @"、 "Webクライアントが優れている")、 新しいツイートが(「、 "OK、両方が便利です" @ USER1" )); }
RestTemplate時間のかかるサービスコール
( "/ツイートブロッキング"を@GetMapping ) 公共の一覧<さえずる> getTweetsBlocking(){ log.info( "ブロッキングコントローラーを開始!" ); 最終的な文字列のURI = getSlowServiceUri()。 RestTemplate restTemplate = 新しいRestTemplate(); ResponseEntity <リスト<さえずる>>応答= restTemplate.exchange( URI、HttpMethod.GET、ヌル、 新しい ParameterizedTypeReference <リスト<さえずる>> (){}); リスト <さえずる>結果= response.getBody()。 result.forEach(つぶやき - >log.info(tweet.toString()))。 log.info( "コントローラを遮断終了!" ); 戻り値の結果; }
RestTemplateは同期呼び出しであるので、時間のかかるサービスコールであることを応答を待っているエンドポイントブロックを呼び出すときに、コードを入力してください。応答が受信された後にのみ、この方法は、後続のコードで実行され、ログは、以下:
コントローラーを遮断開始! ツイートは(テキスト = RestTemplateルール、ユーザ名= @ user1の) さえずる(テキストは =のWebClientが優れている、ユーザ名= @ user2の) ツイート(テキスト = OK、両方が有用であり、ユーザ名= @ user1の) コントローラを遮断終了します!
次 WebClientサービスコールを、時間のかかります
(値= "/ツイート非ブロッキング"、@GetMapping 産生= MediaType.TEXT_EVENT_STREAM_VALUE)を 公衆フラックス<さえずる> getTweetsNonBlocking(){ log.info( "開始ノンブロッキングコントローラ!")。 フラックス<さえずる> tweetFlux = WebClient.create() に.get() .uri(getSlowServiceUri()) .retrieve() .bodyToFlux(Tweet.class)。 tweetFlux.subscribe(つぶやき- > log.info(tweet.toString())); log.info(「非ブロックコントローラを終了!」); tweetFluxを返します。 }
Webクライアントは、返さ フラックス 実行が完了した後に出版社を。結果の準備ができたら、出版社が加入者につぶやきのリストをお送りします。注意:(Webブラウザと呼ぶ)、クライアントは、コール/エンドポイントがツイート-、非ブロッキング にも加入することができる フラックス オブジェクトを。この方法では、応答が受信される前に、エンドポイントが完了実装されていました。
非ブロックコントローラを開始! 非ブロックコントローラを終了! ツイート(テキスト= RestTemplateルール、ユーザ名= @ USER1) ツイート(テキスト= Webクライアントが優れている、ユーザ名= @ user2が) さえずる(テキスト= OK、両方が有用で、ユーザ名= @ user1の)
要約:
この記事では、Webクライアントを使用しての2つの異なる方法で春を説明します。
RestTemplateは、このように同期呼び出しをブロックし、JavaサーブレットAPIを使用して。その代わり、Webクライアントは非同期であり、実行中のスレッドの応答を待っている間にブロックされません。結果は準備ができて応答されている場合にのみ、我々は、通知を開始します。
RestTemplateはまだその用途を持っています。いくつかのシナリオモードをノンブロッキングWebクライアントがより良い選択であるとき、はるかに少ない方法を阻止するよりも、システムリソースを取ります