Spring WebFlux是随Spring 5推出的响应式Web框架。
一. 它能干什么?
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上层支持两种开发模式:- 类似于Spring WebMVC的基于注解(@Controller、@RequestMapping)的开发模式;
- Java 8 lambda 风格的函数式开发模式。
- Spring WebFlux也支持响应式的Websocket服务端开发。
d. 响应式Http客户端
1. 是非阻塞的,可以基于少量的线程处理更高的并发;
2. 可以使用Java 8 lambda表达式;
3. 支持异步的同时也可以支持同步的使用方式;
4. 可以通过数据流的方式与服务端进行双向通信。
二. 普通使用示例
创建Controller类HelloController,仅提供一个Endpoint:/hello
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Welcome to reactive world ~";
}
}
b. Controller中处理请求的返回类型采用响应式类型 ```java @RestController public class HelloController {@GetMapping(“/hello”) public Mono
hello() { // 【改】返回类型为Mono return Mono.just("Welcome to reactive world ~"); // 【改】使用Mono.just生成响应式数据
} }
<a name="cVuNV"></a>
### 三. WebFlux的函数式开发模式
注解方式使用 @GetMapping中url分发路由<br />在WebFlux的函数式开发模式中,我们用HandlerFunction和RouterFunction来实现上边这两点。
1. HandlerFunction相当于Controller中的具体处理方法,输入为请求,输出为装在Mono中的响应:
```java
Mono<T extends ServerResponse> handle(ServerRequest request);
b. RouterFunction,顾名思义,路由,相当于@RequestMapping,用来判断什么样的url映射到那个具体的HandlerFunction,输入为请求,输出为装在Mono里边的Handlerfunction。
Mono<HandlerFunction<T>> route(ServerRequest request);
与WebMVC不同之处在于:
WebMVC中的ServletRequest和ServletResponse,更换为ServerRequest和ServerResponse;
而ServerRequest和ServerResponse响应式编程中使用的接口,它们提供了对非阻塞和回压特性的支持,以及Http消息体与响应式类型Mono和Flux的转换方法。
c. 在Spring容器配置RouterFunction
import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;
@Configuration
public class RouterConfig {
@Autowired
private TimeHandler timeHandler;
@Bean
public RouterFunction<ServerResponse> timerRouter() {
return route(GET("/url1"), req -> timeHandler.getTime(req))
.andRoute(GET("/url2"), timeHandler::getDate); // 这种方式相对于上一行更加简洁
}
}
参考博客链接:https://blog.csdn.net/get_set/article/details/79480233