从Browser / REST Client调用时如何自动订阅REST端点?

时间:2018-06-11 10:00:11

标签: reactive-programming spring-webflux project-reactor reactive-streams

在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以获取数据流?

我在这里错过了一些东西吗?

1 个答案:

答案 0 :(得分:1)

你是对的 - 当你的应用程序设置一个Flux / Mono被动管道时,该管道中的任何内容都不会被执行,直到它subscribe为止。

以下是Spring WebFlux中请求/响应交换期间发生的事情:

  • 服务器收到请求并将其转发给WebFlux
  • 根据请求和您的应用程序代码,将构建一个包含过滤器,控制器等的反应式管道。您可以看到这是一个将请求链接到响应的管道
  • HTTP客户端通过TCP堆栈请求读取,并且底层服务器传输背压信息。

Spring WebFlux中的最低合约是HttpHandler - 它是与底层服务器连接的合约。 在Reactor Netty的情况下,该服务器已经支持反应流API,并且订阅由服务器本地完成。 对于其他基于Servlet的服务器,我们使用反应流桥接到Servlet 3.1。在ServletHttpHandlerAdapter中,我们在反应流世界和异步I / O Servlet API之间进行桥接 - 订阅实际上发生在该桥中。

另外:请注意,我们subscribe返回的值通常不会WebClient;如果您不在活动管道中间(即不在Controller处理程序的中间),您只能这样做。在这些情况下,我们通常将其插入管道中间的反应式操作员;如果你不这样做,你将不能保证什么时候你会得到HTTP客户端响应 - 这完全解除了你的应用程序其余部分的调用。