在 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