RSocketとWebSocket

3421 ワード

アプリケーション バックエンドのパラダイマ レアティーボは、さまざまなアルゴリズムに対応する必要があります.
Dentre as principais, está na comunicação http entre as aplicações, ou seja, a comunicação http é síncrona e o processamento é assíncrono.詳細:

cliente -> efetua uma requisição ao servidor
クライアント -> aguarda a reposta

servidor -> recebe a requisição
servidor -> processa em um outro evento
servidor -> 応答を送信

cliente -> recebe a reposta e finaliza o processo

100% の同期で、ソケット反応性を利用することができます. Socket utiliza protocolo tcp ou http assincrono, baseado em fluxos reativos. O dados são venados de forma binária, onde não precisamos nos preocupar com a serialização/deserialização (por default utiliza-se json).

通信のヒント


リクエスト - レスポンス



Enviamos um mono e esperamos como resposta um outro mono

リクエスト - ストリーム



Enviamos um mono e esperamos um flux

ファイア アンド フォーゲット



Enviamos um mono e não esperamos resposta

運河



Enviamos um flux e esperamos outro flux

Canal の通信モデルの使用例。



クライアントとサーバーの 2 つの依存関係 (春のイニシャライザーのユーティリティの使用) としての追加.

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-rsocket</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>


obs: apenas または rsocket を使用する場合は、依存する webflux を使用し、apenas を porta tcp no servidor として構成する必要があります.

プロトコルの http なしでサーバーを使用する場合は、次の構成を追加します.

spring:
  rsocket:
    server:
      transport: websocket
      mapping-path: /rsocket
      port: 7000


Crie as 2 クラス、タントのクライアントコモのサービドール

@NoArgsConstructor
@AllArgsConstructor
@Data
public class PersonIn {

    private String name;
}

@AllArgsConstructor
@Data
public class PersonOut {

    private String name;
    private String code;
}


Abaixo um exemplo de código no servidor e client:

サーバー: mapeamos 経由の anotação @MessageMapping a rota que será utilizada.

@Controller
@Slf4j
public class PersonController {

    @MessageMapping("person")
    public Flux<PersonOut> addCode(Flux<PersonIn> fluxPerson) {
        return fluxPerson.doOnNext(p -> log.info("Receive : {}", p.toString()))
                .map(p -> {
                    var code = UUID.randomUUID().toString();
                    return new PersonOut(p.getName(), code);
                });
    }
}


クライアント: envio de um fluxo com 2 elementos e recebendo em algum momento as respostas.

var list2 = List.of(new PersonIn("Fabricio"), new PersonIn("Suzana"));
var fluxIn = Flux.fromIterable(list2);
RSocketRequester requester = builder.websocket(URI.create("http://localhost:8080/rsocket"));
requester.route("person")
    .data(fluxIn)
        .retrieveFlux(PersonOut.class)
    .subscribe(p -> log.info(p.toString()));


Socket é uma opção mais simples, para uso de uma comunicação 完全リアクティブ.