在spring boot webflux的微服务中,谁是订阅者?

时间:2018-01-10 06:51:34

标签: spring-boot spring-webflux reactive-streams

注意:此处的术语订阅者和订阅正在从反应流规范中使用。

在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);
    }
  1. 此处“谁/什么”将充当“订阅者”? 我假设spring boot框架提供了一个Subscriber(?) 有人可以提供详细信息或任何链接吗?

  2. 假设我使用postman / curl / browser等客户端调用上面的restful端点,那么在这种情况下客户端如何向反应服务器发出信号请求? (只有订阅者在Subscription对象上有一个句柄,其中带有request(n)方法来指示需求。但是,由于订阅者可能也在服务器端由spring boot框架实现,所以实际客户端如何发出需求信号?)我显然缺少一些东西。

2 个答案:

答案 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>