Spring Boot RSocketサーバーの全プロセス記録を作成します。


前言
マイクロサービスの多様な世界において、HTTPは代理通信における問題のない指導者である。成熟していて、どこにでもあります。しかし、場合によっては、HTTP要求−応答が面倒かもしれない。従来の要求-応答以外の通信モードが必要であれば、fire-and-forgetまたはstreeamingはどうすればいいですか?どの方向に情報を送りたいですか?
HTTPがあって、多くの方法がこの点を実現することができますが、これはプロトコルを構築する目的ではありません。多くの解決案には追加の秤量や欠点がある。また、ここにはルールマニュアルがありません。「HTTPをずっと使うべきです」と言っています。AMQPのようなメッセージ伝達プロトコルはすでにこのことを証明しています。ですから、あなたの選択は何がいいか分かります。しばらくごとにリストに新しい技術を追加するのも健康です。この記事はこのような代替RSocketについてです。
RSocketは、一般的なマイクロサービス通信の課題を解決するための新しいメッセージ伝達プロトコルである。RSocketを使用すると、TCPまたはWebSocketsで動作する柔軟なプロトコルが得られます。これは、変換しないでバイナリメッセージを処理できることを意味します。多重化、バックプレッシャー、回復、およびルーティングなどの現代的なコントロールを使用してもよく、起動および忘れ、要求−応答、およびストリーミングを含む複数のメッセージ伝達モードを使用してもよい。RSocketも完全に反応していますので、スループットが高いマイクロサービスアプリケーションにとても適しています。初期の採用者はNetflix、Pivotal、アリババとフェイスブックを含んでいます。これらはみな伸縮可能なインターネットサービスを提供する専門家です。
要求-応答はほとんどのweb開発者がよく知っている基礎ですので、このようなモードで私達のRSocketの旅を開始します。要求-応答の意味はかなり簡単です。要求を送信すると、応答が得られます。HTTPはこの基本的な相互作用の上に構築されており、非常に一般的である。
本論文では、RSocketをどのように使用するかを理解し、Spring Bootをサーバとして使用し、端末アプリケーションをクライアントとして使用して要求応答を実行します。
要求‐応答Request-reponseはSpringとRSocketがサポートする4つの相互作用モデルの一つにすぎない。
次の手順で操作すると、スプリングブックを使ってRSocketサーバを構築するために必要なコード量が非常に少ないことに気づきます。コードを提供しましたが、数分で自分で最初からコードを作成することもできます。
ステップ1:環境設定
まず、以下の必須部品がインストールされているかを確認します。
  • Java 8またはより高いバージョンのJavaSDK(確認するには、端末でJava-versionを使用してください)
  • 作業のjavaide(IntelliJ IDEAを使っています)
  • は、クローンまたは抽出されたデモコードの例のフォルダを含む。
  • Linux Bash/ZSH shell(もしWindowsユーザーであれば、以下のコメントを参照してください)
  • Windowsユーザーであれば、MicrosoftのLinux向けのWindowsサブシステムに切り替えてください。
    ダウンロードしたプロジェクトフォルダを端末の現在のディレクトリに設定します。
    
    cd spring-rsocket-demo
    
    端末では、JARファイルをダウンロードすると以下のようになります。
    
    cd rsocket-server
    wget -O rsc.jar https://github.com/making/rsc/releases/download/0.4.2/rsc-0.4.2.jar
    
    後でこのクライアントを使ってRSocketサーバと対話しますが、今は以下のようにhelpコマンドを呼び出して正常な動作かどうかをテストします。
    
    java -jar rsc.jar --help
    
    次のような出力が見られます。コマンドの使い方とオプションを説明しました。
    
    usage: rsc Uri [Options]
    
    Non-option arguments:
    [String: Uri]
    
    Option                              Description
    ------                              -----------
    --channel                           Shortcut of --im REQUEST_CHANNEL
    -d, --data [String]                 Data. Use '-' to read data from
    
    ...
    
    
    このターミナルの窓を開けてください。後で必要です。
    ステップ2:サーバコードをチェックする
    IDEでrsocketサーバ項目を開いてコードをチェックします。ご覧のように、springbootではRSocketサーバをサポートするために必要なコードが非常に少ないです。以下はいくつかのハイライトです。
    プロジェクトファイル
    プロジェクトのpom.xmlファイルでは、Spring Boot RSocketサーバに必要なが見られます。Spring BootVersion 2.2.5.RELEASEを使用しているのは、本論文を書く時に、このバージョンは最も生産に適したRSocket特性を持っているからです。このプロジェクトはまた、lombookとspringboot startersocketライブラリに依存します。LombookはJavaデータクラスにコンストラクション、getter、setter、equalsを追加しました。ログなどの内容へのアクセスも簡単になりました。RSocketのspringbootstarterはRSocketをspringbootと一体化して、運行時に自動的にいくつかのRSocketインフラを配置します。
    アプリケーションのプロパティ
    appication.propertiesファイルでは、RSocketサーバのTCPポートが7000に設定されており、Spring Bootの遅延初期化機能がオンされている。
    
    spring.rsocket.server.port=7000
    spring.main.lazy-initialization=true
    メッセージクラス
    最初のより詳細なクラスをMessage.javaといいます。これLombok@Dataクラスは、クライアントとサーバ(または「requester」と「reponder」)との間の要求と応答メッセージをモデル化するために使用されます。このタイプはこのように見えます。
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Message {
        private String origin;
        private String interaction;
        private long index;
        private long created = Instant.now().getEpochSecond();
    
        public Message(String origin, String interaction) {
            this.origin = origin;
            this.interaction = interaction;
            this.index = 0;
        }
    
        public Message(String origin, String interaction, long index) {
            this.origin = origin;
            this.interaction = interaction;
            this.index = index;
        }
    }
    
    
    このクラスを使用して、メッセージはどこから来たか(そのソース)と言ってもいいです。どのメッセージ伝達パターン(インタラクティブ)を使用するつもりですか?そしてメッセージシーケンスのシリアル番号(そのインデックス)。Lombookは、構造関数、getter、setter、tostring、hashcodeを提供することによってコードを簡略化する。
    コントローラクラス
    RSocketサーバコントローラコードは、RSocket Controller.javaファイルで見つけることができます。このクラスはSpring@Controllerこのことは本質的には、サービスポイント(この例ではRSocket endpoints)を宣言することを意味する。
    
    @Controller
    public class RSocketController {
    
        @MessageMapping("request-response")
        Message requestResponse(Message request) {
                log.info("Received request-response request: {}", request);
                // create a single Message and return it
                return new Message(SERVER, RESPONSE);
        }
    }
    
    
    クラスでは、単一のメッセージオブジェクト(要求)を受け入れ、単一のメッセージオブジェクト(応答)を返します。
    このrequest Resonse()メソッドは@Message Mapping(request-reponse)のコメントで修飾されていることに注意します。この注釈は、要求・応答を含むRSocketルーティングのメタデータのメッセージをすべてこの方法で処理するべきである。クライアントから要求メッセージが後で送信されると、このルートが使用されます。
    SpringのRESTコントローラと何か違いがあることに気づきましたか?RESTコントローラの場合、URLパスマッピング(例えば/hello)は、HTTPをその処理プログラム方法に関連付けるために使用される。
    これがコードです。試してみます。
    ステップ3:Spring Boot RSocketサーバを起動する
    第二の端末ウィンドウでは、既存の端末ウィンドウが開いている状態を維持し、rsocket serverフォルダを現在のディレクトリに設定します。次のコマンドでRSocketサーバを構築して実行します。
    
    ./mvnw clean package spring-boot:run -DskipTests=true
    
    あるいは、望むなら、javaideでBuildとRunコマンドを使用することができます。
    ステップ4:RSocket CLIを使用してサーバにコマンドを送信する
    次に、ステップ1でダウンロードしてテストするRSocket client rsc.jarを使用して、実行中のサーバにメッセージを送信します。元の端末ウィンドウに戻ります。そこには--helpテキストがあり、以下のコマンドがあります。
    
    java -jar rsc.jar --debug --request --data "{\"origin\":\"Client\",\"interaction\":\"Request\"}" --route request-response tcp://localhost:7000
    
    このコマンドは、RSocketメッセージのルーティングを宣言していることに注意します。これは、オプションを追加してルーティングの名前を指定することによって実現されます。本例では、ルーティングは、要求−応答であり、これは、RSocket Controller.javaにおいて要求−応答処理方法において宣言された@Message Mappingと一致する。
    コマンドが実行されると、端末ウィンドウにいくつかのデバッグ情報が表示されます。要求に応答してインタラクションする間に発生したことを説明します。このように見えます。
    
    2020-02-27 11:20:21.806 DEBUG --- [actor-tcp-nio-1] i.r.FrameLogger : sending ->
    Frame => Stream ID: 1 Type: REQUEST_RESPONSE Flags: 0b100000000 Length: 69
    Metadata:
             +-------------------------------------------------+
             |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
    +--------+-------------------------------------------------+----------------+
    |00000000| 10 72 65 71 75 65 73 74 2d 72 65 73 70 6f 6e 73 |.request-respons|
    |00000010| 65                                              |e               |
    +--------+-------------------------------------------------+----------------+
    Data:
             +-------------------------------------------------+
             |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
    +--------+-------------------------------------------------+----------------+
    |00000000| 7b 22 6f 72 69 67 69 6e 22 3a 22 43 6c 69 65 6e |{"origin":"Clien|
    |00000010| 74 22 2c 22 69 6e 74 65 72 61 63 74 69 6f 6e 22 |t","interaction"|
    |00000020| 3a 22 52 65 71 75 65 73 74 22 7d                |:"Request"}     |
    +--------+-------------------------------------------------+----------------+
    2020-02-27 11:20:21.927 DEBUG --- [actor-tcp-nio-1] i.r.FrameLogger : receiving ->
    Frame => Stream ID: 1 Type: NEXT_COMPLETE Flags: 0b1100000 Length: 81
    Data:
             +-------------------------------------------------+
             |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
    +--------+-------------------------------------------------+----------------+
    |00000000| 7b 22 6f 72 69 67 69 6e 22 3a 22 53 65 72 76 65 |{"origin":"Serve|
    |00000010| 72 22 2c 22 69 6e 74 65 72 61 63 74 69 6f 6e 22 |r","interaction"|
    |00000020| 3a 22 52 65 73 70 6f 6e 73 65 22 2c 22 69 6e 64 |:"Response","ind|
    |00000030| 65 78 22 3a 30 2c 22 63 72 65 61 74 65 64 22 3a |ex":0,"created":|
    |00000040| 31 35 38 32 38 30 32 34 32 31 7d                |1582802421}     |
    +--------+-------------------------------------------------+----------------+
    {"origin":"Server","interaction":"Response","index":0,"created":1582802421}
    
    見たデバッグ出力は3つの「メッセージフレーム」に分割されます。最初のメッセージフレームはMetadataとしてマークされる。本例では、サーバに送信されるルーティング・メタデータ(要求−応答)を表示する。第二フレームは、クライアントがサーバに送信するデータメッセージ(JSON文字列)を表示する。第3フレームの表示サーバは、クライアントへの応答メッセージ(JSON文字列でもある)を返す。
    最後の行では、サーバーからのJSON形式の応答が個別に印刷されているのを確認してください。コマンドメッセージがサーバによって受信され、確認されました。
    
    {"origin":"Server","interaction":"Response","index":0,"created":1582802421}
    
    RSocketを使って要求応答メッセージを送りました。今は、エンドウィンドウでCtrl-Cを押すか、RSocketサーバをオフにすることで、RSocketサーバを停止することができます。IDEを使ってRSocketサーバを実行すると、IDE中のプロセスを通常の方法で停止できます。
    仕事の原理
    あなたがダウンロードしたRSocket rscクライアントは、RSocketメッセージ転送プロトコルを使用して、RSocket Controllerに要求メッセージを送信します。メッセージはTCPを通じて送信されます。tcp://localhost:7000サーバが待っている場所です。
    メッセージルーティング命令は、第1のメッセージフレームで送信される。このルーティング命令はCLIクライアントの「routeオプション設定」を使用して、request-reponseに設定されます。Springは、このルーティング情報を使用して、正しい@Message Mappingエンドポイントを選択して、request Resonse(Message-request)方法を呼び出す。その後、この方法は自分のメッセージで応答する。CLIクライアントは、端末ウィンドウ内の相互作用全体を一連のメッセージフレームとして印刷する。
    このまま続けば、springbootを使って簡単なRSocketサーバーを作成することができます。
    原文の住所:https://spring.io/blog/2020/03/02/getting-started-with-rsocket-spring-boot-server
    締め括りをつける
    ここで、SpringBootがRSocketサーバを作成した記事について紹介します。もっと関連のあるSpring BootがRSocketサーバーの内容を作成しました。以前の記事を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。