【问题标题】:In spring boot webflux based microservice, who is the subscriber?在 spring boot 基于 webflux 的微服务中,订阅者是谁?
【发布时间】:2018-06-19 06:59:53
【问题描述】:

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

在基于 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/browser 之类的客户端调用上面的 restful 端点,那么在这种情况下,客户端如何向响应式服务器发出请求信号? (只有 Subscriber 对 Subscription 对象有句柄,使用 request(n) 方法发出需求信号。但是,由于 Subscriber 可能也在 Spring Boot 框架实现的服务器端,实际客户端如何发出需求信号?)我显然错过了一些东西。

【问题讨论】:

  • 你上面的控制器代码是Publisher。你的邮递员/浏览器是Consumer
  • @pvpkiran - 对不起,伙计,您的评论没有任何价值。问题清楚地询问订阅者是谁/是什么,而不是消费者。

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


【解决方案1】:

目前使用 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 实现。

【讨论】:

  • 所以响应式流需求在 HTTP 级别被转换为/从实际读/写。 -- 你能详细说明一下吗?读/写是什么意思?你的意思是说背压依赖于 TCP 流量控制?
  • 它依赖于操作系统 TCP 缓冲区的读写。这反过来又转化为 TCP 控制流(例如,如果缓冲区已满,操作系统可以使用 TCP 控制流来停止传入数据)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 2015-06-24
    • 2022-01-03
    • 2018-09-08
    • 1970-01-01
    • 2021-08-25
    • 2017-08-12
    • 2018-06-11
    相关资源
    最近更新 更多