探索现代Web开发的未来:新一代Web框架WebFlux

8,840次阅读
没有评论

共计 2767 个字符,预计需要花费 7 分钟才能阅读完成。

智慧女孩不秃头
2023-12-12 14:42:49
浏览数 (1939)

WebFlux 是一个基于反应式编程模型的 Web 框架,它提供了一种处理高并发和高吞吐量的 Web 应用程序的解决方案。本文将介绍 WebFlux 的概念、反应式编程的核心 API 和编程模型,并探讨学习 WebFlux 的重要性。

WebFlux 是什么?

WebFlux 是 Spring5 添加的一个新模块,是一个使用响应式编程和异步非阻塞的 Web 开发框架,它的功能和 Spring MVC 类似,但是它可以更好地利用多核处理器和高并发连接,提高系统的吞吐量和伸缩性。它完全无阻塞,支持反应流反向压力,可在 Netty、Undertow 和 Servlet 3.1+ 容器等服务器上运行。核心是基于 Reactor 的相关 API 实现的。

1632195879789

什么是反应式编程?

  • 反应式一词指的是围绕对变化做出反应而构建的编程模型,如网络组件对 I/O 事件做出反应、用户界面控制器对鼠标事件做出反应等。从这个意义上说,非阻塞就是反应式,因为我们现在的模式是在操作完成或数据可用时对通知做出反应,而不是被阻塞。
  • 同时反应式与非阻塞反向压力建立了联系。在同步的命令式代码中,阻塞调用是一种自然的反向压力,它迫使调用者等待。而在非阻塞代码中,控制事件的速度就变得非常重要,这样快速的生产者就不会压倒其消费者(目的地)。
  • 反应流(Reactive Streams)是一种规范(Java 9 也采用了这种规范),它定义了异步组件与反向压力之间的交互。例如,数据存储库(作为发布者)可以生成数据,然后 HTTP 服务器(作为订阅者)可以将数据写入响应。反应流的主要目的是让订阅者控制发布者生成数据的快慢。

WebFlux 是如何实现响应式编程的?

  • WebFlux 是基于 Reactor 库的,Reactor 是一个实现了响应式流规范的 Java 库,它提供了 Flux 和 Mono 两种类型的数据流,分别表示多个和单个的异步数据源。WebFlux 使用 Flux 和 Mono 来处理 Web 请求和响应,以及与数据库和其他服务的交互,从而实现了端到端的异步非阻塞的处理流程。
  • WebFlux 支持两种编程模式,一种是基于注解的,类似于 Spring MVC,使用​@Controller​和​@RequestMapping​等注解来定义控制器和路由;另一种是基于函数式的,使用​RouterFunction​和​HandlerFunction​来编写更灵活和函数式的代码。

WebFlux 有什么优势和局限性?

  • WebFlux 的主要优势是可以提高 Web 应用的性能和效率,特别是在 IO 密集型和高并发的场景下,WebFlux 可以使用更少的线程和资源来处理更多的请求,从而减少延迟和内存占用。WebFlux 也可以更好地适应微服务和云原生的架构,因为它可以更容易地实现服务间的异步通信和流式处理。
  • WebFlux 的主要局限性是它需要使用响应式编程的思维和技巧来编写和理解代码,这对于习惯了同步阻塞编程的开发者来说可能有一定的学习曲线和挑战。WebFlux 也需要与其他支持响应式编程的库和框架配合使用,例如 Reactor,RxJava,Spring Data Reactive 等,否则可能会出现阻塞或不兼容的问题。

应用示例

环境配置

dependency>
  groupId>org.springframework.bootgroupId>
  artifactId>spring-boot-starter-webfluxartifactId>
dependency>

注意: 不要再引 spring-boot-starter-web 包,否则默认还是使用的 Servlet 栈 

基于注解

@RestController
@RequestMapping("/demos")
public class DemoController {

  private static final Logger logger = LoggerFactory.getLogger(DemoController.class);

  @GetMapping("/index")
  public Mono index() {logger.info("start {}, {}", Thread.currentThread().getName(), System.currentTimeMillis()) ;
    
    Mono result = Mono.just(666) ;
    logger.info("end {}, {}", Thread.currentThread().getName(), System.currentTimeMillis()) ;
    return result;
  }
}

基于注解的方式处理返回值不一样外其它与传统的 WebMVC 一样。

基于函数式

@Bean
public RouterFunction router1() {return RouterFunctions.route()
          .GET("/r1", request -> {String id = request.queryParam("id").orElse(null) ;
            if ("2".equals(id)) {throw new RuntimeException("Router Param id Error...") ;
            }
            return ServerResponse.ok().bodyValue("你输入的是 id =" + id) ;
          }).build() ;}

函数式,我们只需像定义普通的 bean 一样即可,返回值为​RouterFucntion​。

在 WebFlux.fn 中,HTTP 请求由 ​HandlerFunction​ 处理:该函数接收 ​ServerRequest​ 并返回延迟的 ​ServerResponse​(即 ​Mono​)。请求和响应对象都不可变。​HandlerFunction​ 相当于基于注解的编程模型中 ​@RequestMapping​ 方法的主体。

总结

WebFlux 作为一种新一代的 Web 框架,具有响应式能力、非阻塞 I / O 和函数式编程风格等优势。它适用于需要处理高并发和高吞吐量的应用场景,并在微服务架构和云原生应用开发中表现出色。然而,学习和采用 WebFlux 可能需要一些时间和精力,并且在迁移到 WebFlux 时需要考虑现有代码的调整和迁移工作。因此,您应该根据您的项目需求和团队的技术能力来决定是否值得学习和采用 WebFlux。了解其特点和优势,并与团队进行讨论和评估,以做出明智的决策。

1698630578111788

如果你对编程知识和相关职业感兴趣,欢迎访问编程狮官网(https://www.w3cschool.cn/)。在编程狮,我们提供广泛的技术教程、文章和资源,帮助你在技术领域不断成长。无论你是刚刚起步还是已经拥有多年经验,我们都有适合你的内容,助你取得成功。

原文地址: 探索现代 Web 开发的未来:新一代 Web 框架 WebFlux

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-09-19发表,共计2767字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)