我们必须在 WebFlux 中编写响应式代码吗?

Do we have to write reactive code inside WebFlux?

我知道反应式控制器应该 return Flux<T>Mono<T>,这意味着它在 http 处理程序级别上是反应式的。

但是如果我们在控制器中使用非反应性代码进行外部http调用,这必须等待很长时间IO在那个http调用响应之前,如果10000个用户同时使用http调用这个controller会怎样?假设只有 one 线程来处理控制器内部的代码,那么在 IO 期间会处理 more 请求吗?

如果不是,我们是否必须使用WebClientReactiveRepository等响应式代码来调用外部httpAPI和CRUD数据库?

如果是,如何实施?因为它只是几行非反应性代码,所以 Java 怎么知道 "hey, it's waiting for response, let's handle another event first"?

我自己做了一个实验,看起来我们必须在 WebFlux 中使用响应式代码,这样一切都是响应式的,性能非常高

禁止在反应式管道(例如反应式控制器方法)中进行阻塞 I/O;如果使用 block 运算符,这样做可能会导致运行时出现严重问题,甚至出现终端错误。

Reactor 提供基础结构来包装阻塞调用并安排在特定线程上工作。请参阅反应器参考文档中的 How do I wrap a synchronous, blocking call 部分。这样做会奏效,但可能会对性能产生负面影响。