Spring WebFlux是随Spring 5推出的响应式Web框架。

一. 它能干什么?

  1. Spring WebFlux是基于响应式流的,因此可以用来建立异步的、非阻塞的、事件驱动的服务。它采用Reactor作为首选的响应式流的实现库,不过也提供了对RxJava的支持。

    b. 由于响应式编程的特性,Spring WebFlux和Reactor底层需要支持异步的运行环境,比如Netty和Undertow;也可以运行在支持异步I/O的Servlet 3.1的容器之上,比如Tomcat(8.0.23及以上)和Jetty(9.0.4及以上)。
    c. spring-webflux上层支持两种开发模式:

    1. 类似于Spring WebMVC的基于注解(@Controller、@RequestMapping)的开发模式;
    2. Java 8 lambda 风格的函数式开发模式。
    3. Spring WebFlux也支持响应式的Websocket服务端开发。

d. 响应式Http客户端

  1. 1. 是非阻塞的,可以基于少量的线程处理更高的并发;
  2. 2. 可以使用Java 8 lambda表达式;
  3. 3. 支持异步的同时也可以支持同步的使用方式;
  4. 4. 可以通过数据流的方式与服务端进行双向通信。

二. 普通使用示例

  1. 创建Controller类HelloController,仅提供一个Endpoint:/hello

    1. @RestController
    2. public class HelloController {
    3. @GetMapping("/hello")
    4. public String hello() {
    5. return "Welcome to reactive world ~";
    6. }
    7. }



    b. Controller中处理请求的返回类型采用响应式类型 ```java @RestController public class HelloController {

    @GetMapping(“/hello”) public Mono hello() { // 【改】返回类型为Mono

    1. return Mono.just("Welcome to reactive world ~"); // 【改】使用Mono.just生成响应式数据

    } }

  1. <a name="cVuNV"></a>
  2. ### 三. WebFlux的函数式开发模式
  3. 注解方式使用 @GetMapping中url分发路由<br />在WebFlux的函数式开发模式中,我们用HandlerFunction和RouterFunction来实现上边这两点。
  4. 1. HandlerFunction相当于Controller中的具体处理方法,输入为请求,输出为装在Mono中的响应:
  5. ```java
  6. Mono<T extends ServerResponse> handle(ServerRequest request);

b. RouterFunction,顾名思义,路由,相当于@RequestMapping,用来判断什么样的url映射到那个具体的HandlerFunction,输入为请求,输出为装在Mono里边的Handlerfunction。

  1. Mono<HandlerFunction<T>> route(ServerRequest request);

与WebMVC不同之处在于:
WebMVC中的ServletRequest和ServletResponse,更换为ServerRequest和ServerResponse;
而ServerRequest和ServerResponse响应式编程中使用的接口,它们提供了对非阻塞和回压特性的支持,以及Http消息体与响应式类型Mono和Flux的转换方法。
c. 在Spring容器配置RouterFunction

  1. import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
  2. import static org.springframework.web.reactive.function.server.RouterFunctions.route;
  3. @Configuration
  4. public class RouterConfig {
  5. @Autowired
  6. private TimeHandler timeHandler;
  7. @Bean
  8. public RouterFunction<ServerResponse> timerRouter() {
  9. return route(GET("/url1"), req -> timeHandler.getTime(req))
  10. .andRoute(GET("/url2"), timeHandler::getDate); // 这种方式相对于上一行更加简洁
  11. }
  12. }


参考博客链接:https://blog.csdn.net/get_set/article/details/79480233