春ブーツはRSocketを使用しました
1.概要
RSocket
サポートアプリケーション層プロトコル Reactive Streams
セマンティクス、例えば:HTTPへの代替としてRSocket。このチュートリアルでは、我々が表示されますRSocket
春ブーツが低レベル抽象RSocketのAPIを支援するために、特にどのように、春のブートに使用します。
2.依存性
さんが追加してみましょうspring-boot-starter-rsocket
に頼るようになります:
<dependency>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-rsocket</artifactId> </dependency>
このプルはかかります推移依存RSocket
のような関連の依存関係、:rsocket-core
とし rsocket-transport-netty
アプリケーションの3例
今、私たちの簡単なアプリケーションを継続します。強調表示するにはRSocket
、対話型モードを提供し、私は、トレーディング・アプリケーション、クライアントとサーバを含むトランザクションのアプリケーションを作成する予定。
3.1。サーバの設定
まず、我々はspringbootアプリケーションによるブートを設定するRSocket server
サーバー。そのためのspring-boot-starter-rsocket dependency
依存性なので、自動的に設定springboot RSocket server
。いつものように、あなたは変更する属性駆動型の方法を使用することができRSocket server
、デフォルトの設定値を。たとえば、次のコンフィギュレーションを増加させることによりapplication.properties
、修飾されたRSocket
ポート
spring.rsocket.server.port=7000
必要に応じて、さらに、サーバーの他のプロパティを変更することができます
3.2。クライアントの設定
次に、我々はクライアントでなく、springbootアプリケーションを設定しました。springbootが自動的に最もRSocket関連のコンポーネントを設定するだけでなく、セットアップを完了するためにいくつかのオブジェクトをカスタマイズします。
@Configuration
public class ClientConfiguration {
@Bean
public RSocket rSocket() {
return RSocketFactory
.connect()
.mimeType(MimeTypeUtils.APPLICATION_JSON_VALUE, MimeTypeUtils.APPLICATION_JSON_VALUE)
.frameDecoder(PayloadDecoder.ZERO_COPY)
.transport(TcpClientTransport.create(7000))
.start()
.block();
}
@Bean
RSocketRequester rSocketRequester(RSocketStrategies rSocketStrategies) {
return RSocketRequester.wrap(rSocket(), MimeTypeUtils.APPLICATION_JSON, rSocketStrategies);
}
}
ここでは、作成しているRSocket
クライアントおよび構成されたTCPポートを:7000。注意:我々はすでに設定されているサービスポートを。次はRSocketの装飾的なオブジェクトを定義しますRSocketRequester
。私たちが好きなオブジェクトRSocket server
対話するときには、私たちを助けます。あなたは、これらのオブジェクトが設定されている定義した後、私たちは骨格を持っています。次では、我々は、異なる対話モードに暴露され、そしてこの場所に役立つspringboot表示されます。
4. springboot RSocket
中的 Request/Response
私たちは、からRequest/Response
始まり、HTTP
また、対話モードに最も類似して、最も一般的であるこの通信手段を使用しています。この対話モードでは、クライアントからの通信の初期化とは、要求を送信します。その後、サーバーは、操作を実行し、クライアントに応答を返す-通信が完了したとき。クライアントが特定の株式の現在の市場データを要求し、当社のトレーディング・アプリケーションで。それに応答して、サーバは要求されたデータを転送します。
4.1サーバー
サーバー側では、我々は最初に作成する必要がありcontroller
、当社のプロセッサ方式を保持します。私たちは、使用する @MessageMapping
代わりのようなSpringMVCのアノテーションの@RequestMapping
か@GetMapping
コメント
@Controller
public class MarketDataRSocketController {
private final MarketDataRepository marketDataRepository;
public MarketDataRSocketController(MarketDataRepository marketDataRepository) {
this.marketDataRepository = marketDataRepository;
}
@MessageMapping("currentMarketData")
public Mono<MarketData> currentMarketData(MarketDataRequest marketDataRequest) {
return marketDataRepository.getOne(marketDataRequest.getStock());
}
}
当社の管理下に研究するために。私たちは、使用する@Controller
RSocketを入力するための要求を処理するために、コントローラを定義するために注釈を。また、注釈は、@MessageMapping
私たちがルートを定義してみましょう、我々は要求に応答する方法に興味があります。この例では、サーバーはルーターをリッスンしcurrentMarketData
、それに応答して単一の結果Mono<MarketData>
をクライアントに。
4.2クライアント
次に、私たちのRSocketクライアントは、株式の価格を尋ねると、単一の応答を取得する必要があります。リクエストを初期化するために、我々は、使用しRSocketRequester
、次のように、クラスを:
@RestController
public class MarketDataRestController {
private final RSocketRequester rSocketRequester;
public MarketDataRestController(RSocketRequester rSocketRequester) {
this.rSocketRequester = rSocketRequester;
}
@GetMapping(value = "/current/{stock}")
public Publisher<MarketData> current(@PathVariable("stock") String stock) {
return rSocketRequester
.route("currentMarketData")
.data(new MarketDataRequest(stock))
.retrieveMono(MarketData.class);
}
}
注意:この例では、RSocket
クライアントでもあるREST
、スタイルcontroller
、私たちにアクセスする方法RSocket
のサーバを。したがって、我々は、使用@RestController
して@GetMapping
私たちの要求/応答のエンドポイントを定義するためのアノテーション。エンドポイント法では、我々はクラスを使用RSocketRequester
してルートを指定します。実際に、これはサーバ側でRSocket
我々は要求データを渡し、所望の経路の。お電話の際は最後に、retrieveMono()
この方法により、springbootは、私たちは、要求/応答対話を開始するのに役立ちます。
5. パターンSpring Boot RSocket
Fire And Forget
次に我々は見ていき Fire And Forget
対話モード。名前がヒントとして、のように、クライアントがサーバに要求を送信しますが、サーバーが戻って応答を返す期待しないでください。当社のトレーディング・プログラムでは、一部のクライアントはデータリソースとして機能し、サーバーへの市場データをプッシュします。
5.1サーバー
次のようにのは、私たちのサーバアプリケーション内の別のエンドポイントを作成してみましょう:
@MessageMapping("collectMarketData")
public Mono<Void> collectMarketData(MarketData marketData) { marketDataRepository.add(marketData); return Mono.empty(); }
ここでも、我々は新しい定義@MessageMapping
のためのルートをcollectMarketData
。さらに、春ブーツは自動的に受信し、負荷に変換するMarketData
インスタンスを。しかし、ここでの最大の違いは、私たちがに戻るということですMono<Void>
クライアントがサーバーに戻す必要はありませんので、。
5.2クライアント
私達は私達の初期化方法を確認するために、fire-and-forget
要求モードを。次のように私たちは、別のスタイルのRESTエンドポイントを作成します。
@GetMapping(value = "/collect")
public Publisher<Void> collect() {
return rSocketRequester
.route("collectMarketData") .data(getMarketData()) .send(); }
ここでは、ルーティングおよび負荷は次のようになり指定MarketData
例。我々は、使用しているのでsend()
代わりの方法をretrieveMono()
に、すべての対話パターンをfire-and-forget
パターン。
6.Spring Boot RSocket
中的Request Stream
要求ストリームは、それが時間の経過と共に応答を複数のサーバから取得し、クライアントはこのモードにリクエストを送信し、より複雑な対話モードです。この相互作用モデルをシミュレートするために、クライアントは、指定された株式のすべての市場データを要求します。
6.1サーバー
我々は、サーバーから始まりました。次のように私たちは、別のメッセージのマッピング方法を追加します。
@MessageMapping("feedMarketData")
public Flux<MarketData> feedMarketData(MarketDataRequest marketDataRequest) {
return marketDataRepository.getAll(marketDataRequest.getStock());
}
あなたが見ることができるように、他のプロセッサのプロセッサ方法で、この方法は非常に似ています。返品の異なる部分Flux<MarketData>
の場所Mono<MarketData>
。最後に、私たちのRSocketサーバは、クライアントに複数の応答を返します。
6.2クライアント
次のようにクライアント側では、我々は、エンドポイントの初期化要求/応答通信を作成します。
@GetMapping(value = "/feed/{stock}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Publisher<MarketData> feed(@PathVariable("stock") String stock) {
return rSocketRequester
.route("feedMarketData")
.data(new MarketDataRequest(stock))
.retrieveFlux(MarketData.class);
}
私たちは、RSocket要求に師事しました。まず、ルーティング要求と負荷を定義します。その後、我々はの使用を定義retrieveFlux()
応答たいコールを。このセクションでは、対話型モードを決定します。また、注意してください。私たちのクライアントであるためREST
、サーバのスタイル、クライアントは、メディアタイプの応答を定義しますMediaType.TEXT_EVENT_STREAM_VALUE
。
7.例外処理
今、私たちは、例外を処理する方法を宣言的な方法、サーバプログラムを見てみましょう。ときに処理要求/応答、私はシンプルな使用することができ@MessageExceptionHandler
、次のように、注釈を:
@MessageExceptionHandler
public Mono<MarketData> handleException(Exception e) {
return Mono.just(MarketData.fromException(e));
}
ここでは、例外処理としてマークされたノートを与えます@MessageExceptionHandler
。結果として、この方法は、例外のすべてのタイプを処理するException
異常なスーパークラスの他のすべてのタイプです。我々はまた、明示的にそれ以上の異なるタイプ、異なる例外処理を作成することができます。もちろん、これは、要求/応答モードであり、我々は返しますMono<MarketData>
。私たちは、対話モードの試合の戻り値の型を持つこのタイプの応答を期待しています。
8.おわり
このチュートリアルでは、RSocketサポートspringbootと提供される異なるインタラクティブモードRSocketの詳細なリストを導入しました。で、すべてのサンプルコードを参照してくださいGitHubの上。
オリジナルリンク:www.baeldung.com/spring-boot ...
著者:baeldung
翻訳:スリーブ