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

Posted

技术标签:

【中文标题】在 spring boot 基于 webflux 的微服务中,订阅者是谁?【英文标题】:In spring boot webflux based microservice, who is the subscriber? 【发布时间】: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);
    

    这里“谁/什么”将充当“订阅者”? 我假设 Spring Boot 框架提供了一个订阅者(?) 有人可以提供有关此的详细信息或任何链接吗?

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

【问题讨论】:

你上面的控制器代码是Publisher。你的邮递员/浏览器是Consumer @pvpkiran - 对不起,伙计,您的评论没有任何价值。问题清楚地询问订阅者是谁/是什么,而不是消费者。 【参考方案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 的订阅者以演示反应流的工作方式时,有时理解框架正在处理这个订阅是令人困惑的,但这里它是由框架为我们完成的。

【讨论】:

以上是关于在 spring boot 基于 webflux 的微服务中,订阅者是谁?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring boot 2 + Webflux + Thymeleaf 中配置 i18n?

如何使用WebFlux在Spring Boot 2中设置登录页面?

如何使用 WebFlux 在 Spring Boot 2 中设置登录页面?

Kotlin Spring Boot Webflux 使用 @Valid 注解验证 @RequestBody

为啥使用 webflux 进行 spring boot 测试会忽略自定义 jackson 模块

使用 JWT 令牌的 Spring Boot webflux 安全性