我最近遇到了一个让我感到困惑的问题。我很高兴你能给出的每一个建议,即使它是关于如何获得更多的见解(即日志记录)。
我正在使用 spring boot 2.0.0M1(从 start.spring.io 生成)和响应式(netty backed)org.springframework.web.reactive.function.client.WebClient
。
当调用一个只返回一个 JSON 对象的旧的、非响应式的服务时,WebClient 不会发出任何事件,即使被调用的服务是完全响应的(比较日志)。
2017-05-29 17:33:30,016 | reactor-http-nio-2 | INFO | | onSubscribe([Fuseable] FluxOnAssembly.OnAssemblySubscriber) | myLogClass:145 |
2017-05-29 17:33:30,016 | reactor-http-nio-2 | INFO | | request(unbounded) | myLogClass:145 |
2017-05-29 17:33:30,016 | reactor-http-nio-2 | DEBUG | | onSubscribe([Fuseable] FluxOnAssembly.OnAssemblySubscriber) | client:125 |
2017-05-29 17:33:30,016 | reactor-http-nio-2 | DEBUG | | request(unbounded) | client:125 |
在调试这个问题时,我发现了一些奇怪的东西,这让我认为我只是以错误的方式使用了这个实现:我在 nettys 池/通道处理中看到了另一个服务(我之前调用过)的 URL(将添加类后来找到了)。
其他观察:
- 当我将其他 WebClient 调用排除在图片之外时,有问题的调用有效
- 被调用的服务位于网关后面,因此它们(可能)具有相同的 IP 但不同的 URI
所以到目前为止我看似不太可能的想法:
- netty 频道/池处理以某种方式搞砸了我的网址
- WebClient 不应与不同的 URI 一起使用
- 在从 netty 回到订阅者的路上,有一个带有 URI/IP 映射的 f'up
正如我在开头所说的:我感谢每一个帮助,当然我会添加你要求的任何信息来重现这个虫子。任何关于如何为此编写测试的指针也是受欢迎的!
从信息开始:这就是我使用 WebClient 作为最小样本的方式(我知道 - 我不打算以阻塞方式使用它..)
return WebClient.create(serviceUri)
.put()
.uri("/mypath/" + id)
.body(fromObject(request))
.accept(APPLICATION_JSON)
.header(HttpHeaders.CONTENT_TYPE, APPLICATION_JSON_VALUE)
.header(HttpHeaders.COOKIE, createCookie())
.retrieve()
.bodyToMono(Response.class)
.log("com.mypackage.myLogClass", Level.ALL)
.block();