从 Browser/REST 客户端调用时如何自动订阅 REST 端点?
How REST endpoints are auto subscribed while calling from Browser/REST Client?
在 ProjectReactor 或 Reactive Streams 中,订阅之前什么都不会发生。
反应流数据流不会发生,除非有人订阅它,但我看到所有 REST API,如查找、保存和插入都没有显式调用订阅,但数据在生产者和订阅者之间流动。
@RestController
class PersonController {
private final PersonRepository repository;
public PersonController(PersonRepository repository) {
this.repository = repository;
}
@GetMapping("/all")
public Flux<Person> index() {
return repository.findAll();
}
@GetMapping("/people")
Flux<String> namesByLastname(@RequestParam Mono<String> lastname) {
Flux<Person> result = repository.findByLastname(lastname);
return result.map(it -> it.getFullName());
}
@PostMapping("/people")
Flux<People> AddPeople(@RequestBody Flux<Person> people) {
return repository.saveAll(people);
}
}
为什么我们不需要为 REST 端点调用 subscribe 来启动 Project Reactor 中的数据流?
当我从浏览器调用时,REST 端点(HTTP 请求)如何自动订阅 Reactive Streams 以获取数据流?
我是不是遗漏了什么?
你是对的 - 当你的应用程序正在设置一个 Flux
/Mono
反应管道时,该管道中的任何内容都不会执行,直到 subscribe
到它为止。
以下是 request/response 在 Spring WebFlux 中交换期间发生的事情:
- 服务器收到请求并将其转发给 WebFlux
- 根据请求和您的应用程序代码,将构建反应管道,包括过滤器、控制器等。您可以将其视为将请求链接到响应的管道
- HTTP 客户端通过 TCP 堆栈请求读取,并且背压信息由底层服务器传输。
SpringWebFlux 中最低的合同是 HttpHandler
- 它是与底层服务器接口的合同。
对于 Reactor Netty,该服务器已经支持反应流 API 并且订阅由服务器本地完成。
对于其他基于 Servlet 的服务器,我们正在使用到 Servlet 3.1 的反应式流桥。在 ServletHttpHandlerAdapter
中,我们在反应流世界和异步 I/O Servlet API 之间架起桥梁 - 订阅实际上发生在该桥中。
另外:注意我们通常不会subscribe
到WebClient
返回的值;如果您不在反应管道的中间(即不在 Controller 处理程序的中间),您只能这样做。在那些情况下,我们通常将其插入管道中间的反应式运算符;如果不这样做,您将无法保证何时会收到 HTTP 客户端响应 - 这完全将调用与应用程序的其余部分分离。
在 ProjectReactor 或 Reactive Streams 中,订阅之前什么都不会发生。
反应流数据流不会发生,除非有人订阅它,但我看到所有 REST API,如查找、保存和插入都没有显式调用订阅,但数据在生产者和订阅者之间流动。
@RestController
class PersonController {
private final PersonRepository repository;
public PersonController(PersonRepository repository) {
this.repository = repository;
}
@GetMapping("/all")
public Flux<Person> index() {
return repository.findAll();
}
@GetMapping("/people")
Flux<String> namesByLastname(@RequestParam Mono<String> lastname) {
Flux<Person> result = repository.findByLastname(lastname);
return result.map(it -> it.getFullName());
}
@PostMapping("/people")
Flux<People> AddPeople(@RequestBody Flux<Person> people) {
return repository.saveAll(people);
}
}
为什么我们不需要为 REST 端点调用 subscribe 来启动 Project Reactor 中的数据流?
当我从浏览器调用时,REST 端点(HTTP 请求)如何自动订阅 Reactive Streams 以获取数据流?
我是不是遗漏了什么?
你是对的 - 当你的应用程序正在设置一个 Flux
/Mono
反应管道时,该管道中的任何内容都不会执行,直到 subscribe
到它为止。
以下是 request/response 在 Spring WebFlux 中交换期间发生的事情:
- 服务器收到请求并将其转发给 WebFlux
- 根据请求和您的应用程序代码,将构建反应管道,包括过滤器、控制器等。您可以将其视为将请求链接到响应的管道
- HTTP 客户端通过 TCP 堆栈请求读取,并且背压信息由底层服务器传输。
SpringWebFlux 中最低的合同是 HttpHandler
- 它是与底层服务器接口的合同。
对于 Reactor Netty,该服务器已经支持反应流 API 并且订阅由服务器本地完成。
对于其他基于 Servlet 的服务器,我们正在使用到 Servlet 3.1 的反应式流桥。在 ServletHttpHandlerAdapter
中,我们在反应流世界和异步 I/O Servlet API 之间架起桥梁 - 订阅实际上发生在该桥中。
另外:注意我们通常不会subscribe
到WebClient
返回的值;如果您不在反应管道的中间(即不在 Controller 处理程序的中间),您只能这样做。在那些情况下,我们通常将其插入管道中间的反应式运算符;如果不这样做,您将无法保证何时会收到 HTTP 客户端响应 - 这完全将调用与应用程序的其余部分分离。