一、WebFlux 简介

SpringBoot2.x底层使用的Spring5Spring5推出了响应式编程Spring WebFlux

WebFlux特点:

  1. SpringMVC是同步阻塞的IO模型,资源浪费相对来说比较严重。而WebFlux就可以做到异步非阻塞
  2. 事件驱动(Event-driven),就像和VueAngular一样,各个相关联的值会相应的动态变化
  3. SpringMVC项目均需要运行在Servlet容器上如Tomcat, Jetty…而现WebFlux不仅能运行于传统的Servlet容器中(需要支持Servlet3.1),还能运行在支持NIONettyUndertow

二、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支持各种模板技术,包括ThymeleafFreeMarker
Logo

尧米是由西云算力与CSDN联合运营的AI算力和模型开源社区品牌,为基于DaModel智算平台的AI应用企业和泛AI开发者提供技术交流与成果转化平台。

更多推荐