已编写了一个微服务(使用webFlux),该微服务又调用了其他三个微服务(不使用webflux)。新的微服务使用flatmap调用其他三个。控制器返回Mono。这是正确的设计。我需要pushlishOn吗?
Mono<String> result =service1.api(input)
.flatmap(innput-> service2.api).flatmap(input-> service3.api);
并且Controller也返回Mono。设计是否正确。它会以非阻塞方式工作吗?
答案 0 :(得分:1)
publishOn
方法不会将代码更改为非阻塞代码或阻塞代码。它所做的只是迫使下游运算符在不同的线程中运行。但是,如果在这些线程中进行的服务调用被阻塞,那么使用publishOn
只会阻塞另一个线程。
因此,要回答“它将以非阻塞方式工作”,实际上取决于您如何实现service1.api()
,service2.api()
和service3.api()
。如果他们同步获取您的数据,那么无论您做什么,该数据仍将处于阻塞状态。
但是,例如,如果您使用新的WebClient
API从三个微服务正确地反应性地获取数据,那么是的,它应该是非阻塞的。