webflux使用webclient阻止rest调用

oprakyz7  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(382)

在这种情况下,我可以使用阻塞的i/o库来访问外部服务上的rest端点,也可以直接使用httpclient调用rest,比如webclient。现在,我想知道在该库上 Package 调用和在弹性线程上发布调用或使用webclient访问端点之间是否存在性能差异。
这两个选项究竟是如何处理呼叫的。假设webflux使用单线程来处理请求。请求随后由webclient处理。这是否意味着线程或事件将被阻止,直到请求接收到所有数据并将其传回客户端?我也很感兴趣eventloop是从哪里来的,它是从webclient来的还是已经在控制器/服务层了。
这是我正在考虑使用的替代方法,因为我已经有了通过okhttpclient访问该端点的库。

Mono blockingWrapper = Mono.fromCallable(() -> { 
    return /* make a remote synchronous call */ 
});
blockingWrapper = blockingWrapper.subscribeOn(Schedulers.boundedElastic());
slhcrj9b

slhcrj9b1#

当您在非webflux应用程序中使用reactor时,例如在常规springweb应用程序中使用webclient时,reactor框架将启动单个事件循环来处理调度器调度的所有事件。
另一方面,如果您在完全React式webflux应用程序中运行webclient,那么底层服务器将启动与主机上的内核数量相同的事件循环。
现在我们知道了,让我们从你的例子开始。

spring网络客户端

如果您使用它,框架将启动一个带有线程池的调度程序,并且它可以在任何时候自由切换调度线程。它可以使用一个线程调度flapmap,使用另一个调度线程调用restapi,它可以根据需要进行切换。当您阻塞或订阅时,您将线程留给框架,框架将尽可能地优化它所拥有的。

正在 Package 阻止调用

另一方面,如果您使用 onSubscribe 你基本上是在说 when someone subscribes (or blocks) pick a single thread from the defined scheduler and use that thread all through out execution to schedule events on the event loop .
因此,最终得到的基本上与常规servlet应用程序的标准行为相同。
我个人的观点是使用webclient,因为reactor基本上是从您那里抽象出线程的,这样它就可以尽可能地做好它的工作,而您可以将精力集中在处理业务逻辑上。基本上,您可以选择响应式编程来获得高度优化的异步非阻塞代码,使之尽可能简单,而不需要处理异步注解、锁、锁存、未来、线程池等。

相关问题