在spring boot webflux based microservice中,订阅者是谁?

In spring boot webflux based microservice, who is the subscriber?

注意:这里使用的术语订阅者和订阅来自反应流规范。

在 spring 引导基于 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. 这里"who/what"会充当"Subscriber"? 我假设 spring 引导框架提供了一个 Subscriber(?) 有人可以提供详细信息或相关链接吗?

  2. 假设我正在使用像 postman/curl/browser 这样的客户端调用上面的 restful 端点,那么在这种情况下,客户端如何向响应式服务器发出请求信号? (只有 Subscriber 有一个 Subscription 对象的句柄,用 request(n) 方法来发出请求。但是,由于 Subscriber 可能也在 spring 启动框架实现的服务器端,实际的客户端如何发出信号需求?)我显然遗漏了一些东西。

目前使用 HTTP,确切的背压信息 不通过网络传输,因为 HTTP 协议不支持此功能。如果我们使用不同的线路协议,这可能会改变。

因此反应流需求在 HTTP 级别被翻译成 to/from 实际 read/writes。

如果你查看 Spring Framework 的 org.springframework.http.server.reactive.ServletHttpHandlerAdapter,你会看到这个 class 做了 Servlet 3.1 Async I/O 和 Reactive Streams 之间的适配。它确实实现了特定的 Subscriber class.

还有其他特定的适配器实现:Undertow、Jetty、Tomcat、Reactor Netty。如果底层服务器支持反应流,我们将简单地让服务器处理需求。如果不是,则使用 Subscriber 实现。

在依赖项 org.springframework.spring-web 中有一个名为 public void service(... 的函数,它调用 ServletHttpHandlerAdapter 中的 .subscribe。当 WebFlux 上的许多教程明确显示 Mono 或 Flux 的订阅者以演示反应流如何工作时,我认为有时理解框架正在处理这个订阅是令人困惑的,但在这里它是由框架为我们完成的。