SpringBoot2.x
底层使用的Spring5
,Spring5
推出了响应式编程Spring WebFlux
。
WebFlux
特点:
①SpringMVC
是同步阻塞的IO模型,资源浪费相对来说比较严重。而WebFlux
就可以做到异步非阻塞。
②事件驱动(Event-driven
),就像和Vue
和Angular
一样,各个相关联的值会相应的动态变化。
③SpringMVC
项目均需要运行在Servlet容器上如Tomcat
, Jetty
…而现WebFlux
不仅能运行于传统的Servlet容器中(需要支持Servlet3.1
),还能运行在支持NIO
的Netty
和Undertow
中。
①引入WebFlux
依赖,引入了webflux
就不引入spring-boot-starter-web
,因为spring-boot-starter-web
的优先级更高。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webfluxartifactId>
dependency>
②启动方式默认是Netty
,8080端口。
③代码编写
因为如果是要达到异步非阻塞的效果,数据库也应换为innoDB
型数据库,这里使用静态变量模拟数据库。
public class User {
private long id ;
private String name;
}
@Service
public class UserService {
private static final Map<Integer, User> dataMap = new HashMap<>();
static {
dataMap.put(1,new User(1,"a"));
dataMap.put(2,new User(2,"b"));
dataMap.put(3,new User(3,"c"));
dataMap.put(4,new User(4,"d"));
}
/**
* 返回所有用户
*/
public Flux<User> getAllUser(){
Collection<User> users = dataMap.values();
return Flux.fromIterable(users);
}
/**
* 返回具体用户
*/
public Mono<User> getUserById(int id){
User user = dataMap.get(id);
return Mono.justOrEmpty(user);
}
}
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
/**
* 返回指定用户额
*/
@RequestMapping("/{id}")
public Mono<User> getUserById(@PathVariable int id){
return userService.getUserById(id);
}
/**
* 返回所有用户
*/
@RequestMapping("/all")
public Flux<User> getAllUsers(){
return userService.getAllUser();
}
/**
* 延迟返回用户
* produces控制服务器返回客户端的格式
*/
@RequestMapping(value = "/delay",produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
public Flux<User> getAllUsersDelay(){
return userService.getAllUser().delayElements(Duration.ofSeconds(2));
}
}
④说明
Mono
表示的是包含 0 或者 1 个元素的异步序列,为单一对象
Flux
表示的是包含 0 到 N 个元素的异步序列,为数组列表对象
Spring WebFlux
应用程序不严格依赖于Servlet API
,因此它们不能作为war
文件部署,也不能使用src/main/webapp
目录。
Spring WebFlux
支持各种模板技术,包括Thymeleaf
,FreeMarker
。