注意:此处的术语订阅者和订阅正在从反应流规范中使用。
在spring boot webflux的微服务中考虑以下@RestController方法。
@GetMapping(path = "/users", produces = MediaType.APPLICATION_JSON_VALUE)
public Flux<TradingUser> listUsers() {
return this.tradingUserRepository.findAll();
}
@GetMapping(path = "/users/{username}", produces = MediaType.APPLICATION_JSON_VALUE)
public Mono<TradingUser> showUsers(@PathVariable String username) {
return this.tradingUserRepository.findByUserName(username);
}
此处“谁/什么”将充当“订阅者”? 我假设spring boot框架提供了一个Subscriber(?) 有人可以提供详细信息或任何链接吗?
假设我使用postman / curl / browser等客户端调用上面的restful端点,那么在这种情况下客户端如何向反应服务器发出信号请求? (只有订阅者在Subscription对象上有一个句柄,其中带有request(n)方法来指示需求。但是,由于订阅者可能也在服务器端由spring boot框架实现,所以实际客户端如何发出需求信号?)我显然缺少一些东西。
答案 0 :(得分:4)
目前使用HTTP,精确的背压信息不会通过网络传输,因为HTTP协议不支持此功能。如果我们使用不同的线路协议,这可能会改变。
因此,反应流需求将转换为HTTP级别的实际读取/写入。
如果您查看Spring Framework的org.springframework.http.server.reactive.ServletHttpHandlerAdapter
,您将看到此类在Servlet 3.1 Async I / O和Reactive Streams之间进行了调整。它确实实现了特定的Subscriber
类。
还有其他特定的适配器实现:Undertow,Jetty,Tomcat,Reactor Netty。如果底层服务器支持反应流,我们只需让服务器处理需求。如果没有,则使用Subscriber
实现。
答案 1 :(得分:0)
在依赖项 org.springframework.spring-web
中有一个名为 public void service(...
的函数,它调用 .subscribe
中的 ServletHttpHandlerAdapter
。我认为,当 WebFlux 上的许多教程显式地展示 Mono 或 Flux 的订阅者以演示响应式流的工作原理时,框架在幕后处理这种订阅有时会令人困惑,但在这里它是由框架为我们完成的。< /p>