web-dev-qa-db-ja.com

WebClientでReactiveSpring RestAPIを使用する方法

バックエンドジョブ(実行可能jar)でリアクティブREST API(Spring Webfluxで構築)を使用する必要があります。

Spring WebClientについて読んだことがありますが、いくつかの点がわかりません。

例えば:

WebClient webClient = WebClient.create("http://localhost:8080");

Mono<Person> person = webClient.get()
        .uri("/persons/{id}", 42)
        .accept(MediaType.APPLICATION_JSON)
        .exchange()
        .then(response -> response.bodyToMono(Person.class));

最後の行には「bodyToMono」があります。それが私の質問です:

呼び出されているRestAPIがすでにリアクティブサービスである場合、応答をモノラルに変換する必要がありますか?私が見逃している点はありますか?

私の観点からは、Rest APIがリアクティブであることをコードで明示的にする方法があると思いますが、おそらく私は気づいていません。

10
Igor Veloso

はい、必須です。リアクティブであるという全体的な考え方は、IOのためにブロックされているスレッドがないことを確認することです。

サーバー側のサービスをリアクティブにしたかもしれませんが、それを消費すると、サーバーからの応答があるまでクライアントがブロックされたときに得られるメリットは何ですか。クライアントスレッドは、サーバーが応答するまで待機し続けます。これは望ましくありません。

webClient.get()
        .uri("/persons/{id}", 42)
        .accept(MediaType.APPLICATION_JSON)
        .exchange().block()

サーバーが応答するまで待機するために、現在のクライアントスレッドをブロックします。これにより、クライアントスレッドがブロックされる可能性があります。

webClient.get()
        .uri("/persons/{id}", 42)
        .accept(MediaType.APPLICATION_JSON)
        .exchange()
        .then(response -> response.bodyToMono(Person.class));

将来的に単一の値を発行できる発行元への参照であるMonoを提供します。したがって、クライアントスレッドはブロックされません。

私はこれをもっと説明するブログを書きました。 https://dzone.com/articles/spring-5-reactive-web-services

10
Praneeth Ramesh