レスポンシブプログラミングは、近年、より敏感で回復力のあるアプリケーションを形成することを強制するのではなく、宣言的な方法でアプリケーションを構築する能力により、近年開発者コミュニティと顧客の間で人気があります。 Spring 5が反応システムをそのコアフレームワークに組み込んでいるという事実は、宣言的プログラミングへのパラダイムシフトを示しています。
レスポンシブプログラミングは、データプロデューサーと消費者の間の非同期データフローを管理しています。これは、スムーズな方法でデータに応答する必要があります。したがって、レスポンシブプログラミングは、非同期でイベント駆動型のスムーズなアプリケーションであり、スケーリングに少数のスレッドが必要です。
レスポンシブプログラミングは、共有された可変状態、スレッド、およびロックに基づいたアプリケーションの拡張に関与する複雑さが高いため、スレッドベースのアーキテクチャを構築することが困難です。
レスポンシブプログラミングのコンテキストでは、「ストリームにデータがある場合、すべてがストリームであり、スムーズに動作します。」
高レベルの抽象化とレスポンシブプログラミングは、コードの読みやすさの向上につながるため、開発者は主にビジネスロジックを定義するイベントの相互依存に焦点を当てることができます。
非常に同時環境では、応答パターンは、一般的なエンタープライズのユースケースであるメッセージ処理に自然に適しています。
実行バックプレッシャーの性質により、レスポンシブなアプローチは、生産者と消費者間のトラフィックを制御するのに最適です。これは、メモリの疲労を避けるのに役立ちます。
1つまたは複数のスレッドの場合、IOバインディングタスクは、現在のスレッドをブロックせずに非同期および非ブロッキングを実行できます。
複数の接続サブシステムの通知は、高い相互作用およびリアルタイムアプリケーション、または操作/イベントでトリガーされる場合があります。この場合、応答性のあるプログラミングをより効率的に管理できます。
「Response Flow」は、非ブロッキングバックプレッシャーのデータストリームの操作とエンティティを定義する方法を開示する最小限のインターフェイスセットを含むAPI仕様を定義します。
バックプレッシャーの導入により、応答フローにより、ユーザーはパブリッシャーからのデータ交換レートを制御できます。
応答ストリーミングAPI java.util.concurrent.flowは、正式にJava 9の一部になりました。
応答ストリームは、主に相互運用性レイヤーとして使用されます。
Spring-Web反応性モジュールとSpring MVCの両方が同じ@Controllerプログラミングをサポートしていますが、Spring-WEB反応性は反応エンジンと非ブロッキングエンジンの両方で実行されます。
このドキュメントに従ってください。
http://docs.spring.io/spring-framework/docs/5.0.0.build-snapshot/spring-framework-reference/html/web-rective.html
Spring-WEB反応性モジュールとSpring MVCは多くの一般的なアルゴリズムを共有していますが、Spring-WEB反応性モジュールは、ハンドラーマッピングやハンドラダプターなどの多くのSpring MVC契約を再定義し、非同期や非ブロッキングにし、応答性のあるHTTPリクエストと応答を可能にします。
既存のレストテンプレートに加えて、春5に新しいレスポンシブWebClientも導入されています。
レスポンシブプログラミング(Reactor、Netty、UnderTowなど)をサポートするHTTPクライアントは、要求と応答体をフラックス<データバッファー>として公開し、読み取りおよび書き込み側で包括的なバックプレッシャーサポートを提供する一連の応答性のあるクライアントHTTPRequestおよびClientHTTPResponseの抽象化を採用しています。
Spring 5フレームワークでは、リアクティブストリーム仕様の実装としてリアクターを紹介します。
Reactorは、JVMに非ブロッキングアプリケーションを構築するための次世代リアクティブライブラリです。
Reactorは、基本的なReactive Streams Publisher Contractを拡張し、フラックスとモノのAPIタイプを定義して、それぞれ0.Nと0..1のデータシーケンスの宣言的操作を提供します。
Spring Web Reactiveはサーブレット3.1を使用して非ブロッキングI/Oを提供し、サーブレット3.1コンテナで実行します。
Spring WebFluxは、選択できる2つのプログラミングモデルを提供します。
スプリング5には、スプリングウェブリアクティブ(スプリングウェブ反応性モジュールの下)とスプリングウェブMVC(Spring-WEBMVCモジュールの下)が含まれます。
Spring Web ReactiveおよびSpring Web MVCモジュールは多くのアルゴリズムを共有していますが、Spring Web ReactiveはレスポンシブノンブロッキングリアクティブストリームHTTPアダプターレイヤーで実行できるため、それらの間でコードを共有しません。
Spring MVCの実行にはサーブレットコンテナが必要ですが、Spring Web Reactiveは、NettyやUndertowなどの非サービスランタイムでも実行できます。
軽量で機能的なWebフレームワークを備えた非ブロッキングWebスタックを使用し、Java 8 LambdaまたはKotlinで使用する必要がある場合は、Spring MVCアプリケーションからSpring Web Reactiveに切り替えることを検討する必要があります。
これは、WebFiuxに依存するpom.xmlの2.0.0 m5バージョンです。
<parent> groupId> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <バージョン> 2.0.0.m5 </version> </parent> <依存>依存症> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-webflux </artifactid> </dependency> </dependencies>
従来の方法と応答方法
従来の方法では、実行がブロックされ、サービスの実行が完了するまで待ちます。次のコードでは、最初の印刷ステートメントの後、プログラムの実行がブロックされ、サービスの実行が完了するのを待ちます。サービスの実行が完了した後、プログラムの実行が再開され、2番目の印刷ステートメントが実行されます。
@getMapping( "/cladition")public list <product> getallProducts(){system.out.println( "従来の方法が開始されました"); List <Product> Products = ProducerService.getProducts( "Traditional"); System.out.println( "従来の方法が完了した");製品を返す;}応答方法では、プログラムの実行がサービスの実行の完了を待たずに継続します。次のコードでは、最初の印刷ステートメントの後、2番目の印刷ステートメントは、サービスの実行が完了するのを待つことなく、非ブロッキング方法で実行されます。フラックスストリームには、製品データが利用可能になります。
@getMapping(value = "/racerive"、.text_event_stream_value)public flux <product> getall(){system.out.println( "fluxを使用したリアクティブウェイスタート"); flux <product> fluxproducts = prodservice.getProductsStream( "Flux"); System.out.println( "Flux完了を使用した反応方法");フラックスプロダクトを返します;}既存のレストテンプレートに加えて、Spring 5にはリアクティブWebClientも導入されました。
clienthttprequestおよびclienthtttpresponseの抽象化は、flux <databuffer>を使用して要求と応答の本体を公開し、読み取り側と書き込み側の両方で完全な逆圧力サポートを提供します。
Spring Coreからのエンコーダーとデコーダーの抽象化も、クライアント側で使用され、Endian Flusをタイプオブジェクトにシリアル化または送信します。
以下は、端子を呼び出し、リアクティブストリームフラックスオブジェクトを受信および処理するリアクティブWebClientの例です。
@getMapping( "/accounts/{id}/alerts")public flux <Alert> getAccountalerts(@pathvariable long id){webclient webclient = new webclient(new ReactorClientHttpConnector()); return this.repository.getacount(id).flatmap(account-> webclient.perform(get( "/alerts/{key}"、account.getkey()))))。上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。