SpringBoot2.0 WebFlux入门
SpringBoot2.0响应式编程WebFlux入门
·
一、WebFlux 简介
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
依赖,引入了webflux
就不引入spring-boot-starter-web
,因为spring-boot-starter-web
的优先级更高。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</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
更多推荐
已为社区贡献1条内容
所有评论(0)