春ブーツはRSocketを使用しました

春ブーツは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());
    }
}

当社の管理下に研究するために。私たちは、使用する@ControllerRSocketを入力するための要求を処理するために、コントローラを定義するために注釈を。また、注釈は、@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 RSocketFire 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

翻訳:スリーブ

 

おすすめ

転載: www.cnblogs.com/liululee/p/10978601.html