Spring webclient是非阻塞客户端吗?

2024-02-04

我不明白反应式网络客户端的工作原理。它说 spring webclient 是非阻塞客户端,但是这个 webclient 似乎在等待来自远程 api 的 onComplete() 信号,然后它可以处理从远程 api 发出的每个项目。 我期望当从目标 api 触发 onNext() 时,webclient 可以处理每个项目

我是 Spring Webflux 世界的新手。我读到它,它说它使用 netty 作为默认服务器。这个netty使用的是eventloop。因此,为了了解它是如何工作的,我尝试创建 2 个小应用程序:客户端和服务器。 服务器应用程序仅返回简单通量,每个项目延迟 1 秒。 客户端应用程序使用 webclient 调用远程 api。

Server:

@GetMapping(ITEM_END_POINT_V1)
public Flux<Item> getAllItems(){
        return Flux.just(new Item(null, "Samsung TV", 399.99),
                new Item(null, "LG TV", 329.99),
                new Item(null, "Apple Watch", 349.99),
                new Item("ABC", "Beats HeadPhones", 
      149.99)).delayElements(Duration.ofSeconds(1)).log("Item : ");
}

Client:

WebClient webClient = WebClient.create("http://localhost:8080");

@GetMapping("/client/retrieve")
public Flux<Item> getAllItemsUsingRetrieve() {
        return webClient.get().uri("/v1/items")
                .retrieve()
                .bodyToFlux(Item.class).log();
}

从服务器登录:

2019-05-01 22:44:20.121  INFO 19644 --- [ctor-http-nio-2] Item :                                   : onSubscribe(FluxConcatMap.ConcatMapImmediate)
2019-05-01 22:44:20.122  INFO 19644 --- [ctor-http-nio-2] Item :                                   : request(unbounded)
2019-05-01 22:44:21.126  INFO 19644 --- [     parallel-1] Item :                                   : onNext(Item(id=null, description=Samsung TV, price=399.99))
2019-05-01 22:44:22.129  INFO 19644 --- [     parallel-2] Item :                                   : onNext(Item(id=null, description=LG TV, price=329.99))
2019-05-01 22:44:23.130  INFO 19644 --- [     parallel-3] Item :                                   : onNext(Item(id=null, description=Apple Watch, price=349.99))
2019-05-01 22:44:24.131  INFO 19644 --- [     parallel-4] Item :                                   : onNext(Item(id=ABC, description=Beats HeadPhones, price=149.99))
2019-05-01 22:44:24.132  INFO 19644 --- [     parallel-4] Item :                                   : onComplete()

来自客户端的日志:

2019-05-01 22:44:19.934  INFO 24164 --- [ctor-http-nio-2] reactor.Flux.MonoFlatMapMany.1           : onSubscribe(MonoFlatMapMany.FlatMapManyMain)
2019-05-01 22:44:19.936  INFO 24164 --- [ctor-http-nio-2] reactor.Flux.MonoFlatMapMany.1           : request(unbounded)
2019-05-01 22:44:19.940 TRACE 24164 --- [ctor-http-nio-2] o.s.w.r.f.client.ExchangeFunctions       : [7e73de5c] HTTP GET http://localhost:8080/v1/items, headers={}
2019-05-01 22:44:24.159 TRACE 24164 --- [ctor-http-nio-6] o.s.w.r.f.client.ExchangeFunctions       : [7e73de5c] Response 200 OK, headers={masked}
2019-05-01 22:44:24.204  INFO 24164 --- [ctor-http-nio-6] reactor.Flux.MonoFlatMapMany.1           : onNext(Item(id=null, description=Samsung TV, price=399.99))
2019-05-01 22:44:24.204  INFO 24164 --- [ctor-http-nio-6] reactor.Flux.MonoFlatMapMany.1           : onNext(Item(id=null, description=LG TV, price=329.99))
2019-05-01 22:44:24.204  INFO 24164 --- [ctor-http-nio-6] reactor.Flux.MonoFlatMapMany.1           : onNext(Item(id=null, description=Apple Watch, price=349.99))
2019-05-01 22:44:24.204  INFO 24164 --- [ctor-http-nio-6] reactor.Flux.MonoFlatMapMany.1           : onNext(Item(id=ABC, description=Beats HeadPhones, price=149.99))
2019-05-01 22:44:24.205  INFO 24164 --- [ctor-http-nio-6] reactor.Flux.MonoFlatMapMany.1           : onComplete()

我期望客户端不会等待 4 秒然后得到实际结果。 正如你所看到的,服务器开始发出 onNext()22:44:21.126,客户得到结果22:44:24.159。 所以我不明白为什么 webclient 被称为非阻塞客户端,如果它有这种行为。


WebClient 是非阻塞的,即通过 WebClient 发送 HTTP 请求的线程不会被 IO 操作阻塞。 当响应可用时,netty 将通知工作线程之一,它将根据您定义的反应式流操作来处理响应。

在您的示例中,服务器将等到 Flux 中的所有元素都可用(4 秒),将它们序列化为 JSON 数组,然后在单个 HTTP 响应中将其发送回。

客户端等待这个单一响应,但在此期间其线程不会被阻塞。

如果你想实现流媒体效果,你需要利用不同的内容类型或底层协议(如WebSockets)。 查看以下有关的 SO 线程application/stream+json内容类型:Spring WebFlux Flux 与非流应用程序/json 的行为 https://stackoverflow.com/questions/54680001/spring-webflux-flux-behavior-with-non-streaming-application-json

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring webclient是非阻塞客户端吗? 的相关文章

随机推荐

  • Javascript - 提升的优先级

    在提升中 变量优先于函数定义还是反之亦然 请看下面的代码 function a var x 10 function x return 20 return x 这不是一个优先于另一个的问题 存在优先级 但这在很大程度上只是语义问题 这里重要的
  • 禁用 Android 日期选择器中的特定日期

    我正在使用 datePicker 我可以通过以下代码禁用今天的最后几天和 30 天后的几天 DatePickerDialog datePicker new DatePickerDialog Calendar calender Calenda
  • 自定义属性错误 - Android Studio 1.2

    在我的 Android 项目中 我有几个使用自定义属性的自定义组件 attrs xml 文件如下所示
  • SAVON是否支持客户端证书认证

    我正在评估 savon 的消费 Web 服务 但我没有找到任何信息 如果我可以使用 SSL 客户端证书对提供 SOAP Web 服务的服务器进行身份验证 我阅读了文档但没有找到任何相关内容 有谁知道SAVON是否支持客户端证书认证 问候 法
  • WCF 客户端端点压缩

    我正在尝试使用 netTCP 端点为我们的 WCF 服务实现压缩 我已经阅读了几乎所有开发者网络帖子以及 SO 上的帖子 但无济于事 如何配置客户端端点CompressionFormat 参见压缩和二进制编码器 http msdn micr
  • 删除 csv 文件中的字段内引号

    假设我们有一个逗号分隔的文件 csv 如下所示 name of movie starring director release year dark knight rises christian bale anna hathaway chri
  • 如何取消PHP中的CURL时间限制?

    我正在运行一个相当长的脚本 它获取指定域的内容并解析 html 然后再对所述 html 运行一系列测试 无论如何 脚本在一段时间后超时 我尝试将其放在页面顶部 但仍然没有成功 set time limit 0 这是有问题的错误 cURL e
  • 在数组中存储2个不同的对象

    如何在数组中存储两个不同的对象 因此 当我有例如对象工人 姓名 年龄 工资单 时 另一个对象是计算机 价格 规格 我将这些对象存储在一个类中 class Record top 1 private Worker array w private
  • 为什么我们不能在 NSFetchedResultsController 中更改 FetchRequest?

    示例我在名为 FetchController 的 ListController 处调用了 NSFetchedResultsController NSFetchRequest fetchRequestInContext NSString en
  • 什么是 ^= 运算符? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚在这里找到了一个答案 其中一个代码示例 我认为是java 使用了一个我以前从未见过的运算符 我搜索了 google 和 SO 但在其
  • “NaTType”对象没有属性“days”

    我的数据集中有一列代表以毫秒为单位的日期 有时它的值是nan 实际上我的专栏是类型str有时它的值是 nan 我想计算本专栏的纪元 以天为单位 问题是在计算两个日期的差异时 pd to datetime now pd to datetime
  • 使用 jQuery 将 div 附加到文档末尾?

    我想使用 jQuery 编写一个函数来附加div到网页的末尾 我希望能够在许多不同的页面上使用该功能 我写了下面的代码 但它不起作用 document append div div helloDiv html hello does noth
  • 街景进入信息窗口[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图在信息窗口中显示街景视图 但我
  • 使用预先填充的意图插入联系人

    我正在尝试使用意图插入联系人 并且我尝试了这段代码 取自 Android Sdk 请参阅here http developer android com reference android provider ContactsContract
  • RichEdit 2.0 使用单个 CR 字符作为换行符会导致 SelStart 计算失败 (Delphi XE2)

    当从 Delphi 2006 过渡到 Delphi XE2 时 我们了解到的一件事是 RichEdit 2 0 在内部进行了替换CRLF与单个配对CR特点 这会带来不幸的结果 即放弃基于 VCL 端实际文本字符串的所有字符索引计算 通过跟踪
  • Haskell Netwire:电线的电线

    我正在玩 netwire 包 试图了解 FRP 我有一个简单的问题 从以下简单的电线开始 我能够每 5 秒 大约 发出一个事件 myWire Monad m HasTime t s gt Wire s m a Float myWire ti
  • MATLAB:.mat 版本之间的差异

    The 官方文档 http www mathworks com help matlab ref save html inputarg version陈述如下 But I have noticed that there are other i
  • ImageButtons 数组,从变量分配 R.view.id

    嘿 我的应用程序将使用 64 个 ImageButtons 8x8 的数组 它们都已在我的 XML 布局中声明 名称如 one1 two5 eight8 等 我认为 与其在 Java 中单独声明它们 不如在一些 for 循环中声明它们可能是
  • 使用 Javascript 数组和对象创建表

    我有一个数组和一个对象 labels ID Name object id 1 name richard id 2 name santos 我必须创建一个像这样的表 table thead tr td ID td td Name td tr
  • Spring webclient是非阻塞客户端吗?

    我不明白反应式网络客户端的工作原理 它说 spring webclient 是非阻塞客户端 但是这个 webclient 似乎在等待来自远程 api 的 onComplete 信号 然后它可以处理从远程 api 发出的每个项目 我期望当从目