WebClient与WebSocketClient

时间:2017-11-20 14:19:43

标签: spring project-reactor spring-webflux

我正在尝试使用spring webflux。当我们有WebClient时,我对为什么需要WebSocketClient感到有点困惑。

在春季之前,我们有两个问题 1. REST调用是一个阻塞调用,因为我们使用的是HttpClient。 和
2.每当我们需要数据时,它主要是来自客户端的拉动机制。

但是使用Spring 5和web flux模块,我们可以在服务器端有类似的东西

@Bean
    public RouterFunction<ServerResponse> routerFunction () {
        return
                route(
                        GET("/streaming"),  serverRequest -> {

                            Flux<Integer> flow = Flux.just(1, 2, 3, 4, 5).delayElements(Duration.ofSeconds(2)).doOnEach(entry -> System.out.println(entry.get()));
                            return ServerResponse.ok().contentType(MediaType.APPLICATION_STREAM_JSON).body(BodyInserters.fromPublisher(flow, Integer.class));
                        }
                )
        ;
    }

我们可以使用客户端的WebClient来解决上面提到的两个问题

WebClient.create("http://localhost:8080")
        .get()
        .uri("/streaming")
        .accept(MediaType.APPLICATION_STREAM_JSON)
        .exchange()
        .flatMap(response -> response.bodyToMono(String.class))
        .subscribe(System.out::println);

    IntStream.range(0,10).forEach(i -> {
      try {
        Thread.sleep(2000);
        System.out.println("non blocking");
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    });

在这种情况下,首先,REST调用是非阻塞的,可以通过立即执行下一个语句来验证。而且数据也是从服务器端推出的,而不是从客户端提取的。

因此,如果我们可以使用WebClient执行此操作,那么我需要WebSocketClient。

1 个答案:

答案 0 :(得分:2)

WebSocketClient

相比,

WebClient有两个主要差异

  1. 它不提供被动但是异步API

  2. 它在较低的抽象级别上运行,对连接关闭等事情作出反应。

  3. 它使用双向的WebSockets。

  4. WebSocketClient的用例是:

    • 你想要双向通信而不是请求/响应(响应可能很大并且一点一点地到达。

    • 您想对低级协议事件做出反应

    • 您不想依赖Project Reactor