什么是webflux

  1. Spingboot 5.0之后出现的
  2. 继续Reactive Streams API 实现的
  3. 由于构建基于Reactive 技术栈之上的 Web应用程序

    为什么有webFlux

  4. 对于非阻塞 Web 应用需要

    1. 并发量大的时候降低资源的开销,提升性能
      1. 使用极少数的线程和较少的内存就能并发支持
    2. 必须使用非阻塞的web服务器
      1. netty (默认)
      2. jetty
      3. war运行可能会出问题,没测试过
  5. 函数式编程

使用建议

  • 原有的Spring Mvc 应用正常运行就别换成webflux
  • 依赖了大量的阻塞式持久化API和网络API,建议使用 MVC
    • mysql数据库
  • 已经使用了非阻塞技术栈,可以考虑使用WebFlux
    • redis
    • mongodb
  • 想要使用Java8 Lambda 结合轻量级函数式框架,可以考虑WebFlux

WebFlux两中编程模型

  • 基于注解的控制器
    • 常用注解
      • @Controller
      • @RequestMapping 及其等价注解
      • @RequestBody / @ResponseBody
    • 返回值
      • Mono
        • 0或者1个返回
      • Flux
        • 多个返回
  • 函数式Endpoints

栗子例子

  1. /**
  2. * @link https://www.jianshu.com/p/1f610b90d40c
  3. * @return
  4. */
  5. @GetMapping("mono")
  6. public Mono<ResultVO<List<String>>> mono() {
  7. // Mono.just()方法会发射一个元素
  8. return Mono.just(ResultVO.successForData(Arrays.asList("hello", "webflux", "spring", "boot")));
  9. }
  10. /**
  11. * @link https://www.jianshu.com/p/1f610b90d40c
  12. * @return
  13. */
  14. @GetMapping("flux")
  15. public Flux<ResultVO<List<String>>> flux() {
  16. // Mono 最多发射一个数据,Flux 可以发射多个数据
  17. return Flux.just(ResultVO.successForData(Arrays.asList("hello", "webflux", "spring", "boot")),
  18. ResultVO.successForData(Arrays.asList("hello1", "webflux1", "spring1", "boot1")),
  19. ResultVO.successForData(Arrays.asList("hello2", "webflux2", "spring2", "boot2")));
  20. }
  21. GET http://localhost:8080/api/flux
  22. [
  23. {
  24. "code": 200,
  25. "message": "success",
  26. "data": [
  27. "hello",
  28. "webflux",
  29. "spring",
  30. "boot"
  31. ],
  32. "ts": 1614045969727,
  33. "success": true
  34. },
  35. {
  36. "code": 200,
  37. "message": "success",
  38. "data": [
  39. "hello1",
  40. "webflux1",
  41. "spring1",
  42. "boot1"
  43. ],
  44. "ts": 1614045969729,
  45. "success": true
  46. },
  47. {
  48. "code": 200,
  49. "message": "success",
  50. "data": [
  51. "hello2",
  52. "webflux2",
  53. "spring2",
  54. "boot2"
  55. ],
  56. "ts": 1614045969729,
  57. "success": true
  58. }
  59. ]