在基于Spring Boot WebFlux的微服务中,谁是订阅者?

6
注意:这里使用了反应式流规范中的订阅者和订阅。
考虑在基于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框架提供了一个订阅者(?) 请有人提供详细信息或任何链接吗?

  2. 假设我正在使用像Postman/Curl/浏览器这样的客户端调用上面的RESTful端点,那么在这种情况下,客户端如何向响应式服务器发出信号要求?(只有订阅者具有处理请求(n)方法的订阅对象。但是,由于订阅者可能也是由Spring Boot框架实现的服务器端,那么实际客户端如何发出需求信号?)我显然漏掉了一些东西。


你上面的控制器代码是“发布者”。而你的Postman/浏览器是“消费者”。 - pvpkiran
1
@pvpkiran - 抱歉,朋友,你的评论没有任何价值。问题明确要求回答订阅者是谁/什么,而不是消费者。 - Jatin
2个回答

9

目前使用 HTTP,因为 HTTP 协议不支持直接传输 确切的背压信息,所以网络上无法传递该信息。如果我们使用不同的线路协议,则可以改变这种情况。

因此,反应流需要被转换为在 HTTP 层面实际读/写的需求。

如果您查看 Spring Framework 的 org.springframework.http.server.reactive.ServletHttpHandlerAdapter,您将会发现此类会在 Servlet 3.1 异步 I/O 和反应流之间进行适配。它确实实现了一个具体的 Subscriber 类。

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


因此,反应式流的需求被翻译成HTTP级别的实际读写操作。您能否详细说明一下?您所说的读/写是什么意思?您是否意味着背压依赖于TCP流控制? - Jatin
1
它依赖于在操作系统TCP缓冲区中的读写。这反过来又转化为TCP控制流(例如,如果缓冲区已满,操作系统可以使用TCP控制流停止传入数据)。 - Brian Clozel

3

在依赖项org.springframework.spring-web中,有一个名为public void service(...的函数调用了ServletHttpHandlerAdapter中的.subscribe。我认为有时候很难理解框架是如何在后台处理订阅的,因为WebFlux的许多教程都显式地展示了Mono或Flux的订阅者,以演示响应式流如何工作,但这里是由框架为我们完成的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接