Spring WebFlux入门(简介篇)

目录

1.简介

1.1异步编程与同步编程的区别?

1.2响应式编程与传统编程区别?

  1.3选择Spring MVC 还是 WebFlux?      

1.3.1实现区别

2.Reactor

2.1 什么是 Reactor ?

2.2 Reactor响应式编程库 、WebFlux 与 Spring 是什么关系?

         2.3建议


1.简介

以下是本人总结的一些知识点,如果想看官方文档这:反应式堆栈上的 Web (spring.io)        

                Spring WebFlux是随Spring 5推出的是一个响应式编程和异步非阻塞的Web开发框架, 它与Spring MVC不同,它不需要Servlet API,完全异步和非阻塞,以Reactor为基础实现响应式编程。

1.1异步编程与同步编程的区别?

        了解Spring WebFlux首先先了解异步非阻塞与传统的同步堵塞式有什么区别?

这里我简单的对这两个打个比方:

        同步编程: 同步也就是A节点发送了一个消息给B节点,等待收到 B 节点的回复,以便完成某件后续事情,这个等待的要求就叫做同步!(不管A节点后面的操作需不需要B节点的结果,都要等待!)

         

        异步编程:异步也就是A节点发送一个消息给B节点,可以不等待B节点的回复,直接可以进行其他操作。可以通过一段时间轮询或者另外开一个线程去接收B节点的结果(前提是A节点不依赖B节点的结果才行)!

双方的利:

         同步编程:

               1. 同步的流程对结果处理通常更为简单,可以就近处理。

               2.因为在执行的过程中,同步需要等待下一个节点的回复所以被叫做同步堵塞式编程,

               3.同步可以很容易捕获、处理异常。

         异步编程 :

               1.异步流程可以立即给调用方返回初步的结果,也可以延迟给调用方最终的结果数据,在此期间可以做更多额外事情,

                2.在执行的过程中,可以释放占用的线程的资源也可以创建新的线程等,避免阻塞。所以被叫做异步非堵塞式编程

                3.可以多个调用的结果出来后,统一返回一个集合,提升了效率。

1.2响应式编程与传统编程相比的优势?

      1.2.1编写理念差距

        在响应式编程中,我们不再用对象的概念来对现实世界进行建模,而是使用的思想对信息进行拆分和聚合。在面向对象编程中,数据信息数据更新方法绘制方法这三大要素都是描述具体类的,他们被类的定义聚合在了一起;而在响应式编程中,不再强调“关系”,而是将数据和变化聚合在一起,将处理方式聚合在一起。

       1.2.2编写体验差距

在传统编程中,经常会有一个无法直接用于最终场景的数据集合,所以需要手动做一些后,再处理,最终把要使用的数据提供给消费模块;而在响应式编程中是“直接告诉程序你最终想要获得什么数据”,然后将程序的加工流程内化到生产过程中,从而当消费模块得到数据时,直接就可以使用,而不需要再做过多的处理,这对于消费者来说体验感杠杆的.

1.3选择Spring MVC 还是 WebFlux?      

        这是一个自然而然的问题,但却设置了一个不合理的二分法。实际上,两者协同工作以扩展可用选项的范围。两者旨在实现彼此的连续性和一致性,它们可以并排使用,并且双方的反馈使双方都受益。下图显示了两者之间的关系,它们有什么共同点,以及它们各自唯一支持的内容:

如果你在纠结的话以下有很好的建议:

  • 如果您有一个运行良好的Spring MVC应用程序,则无需更改。命令式编程是编写、理解和调试代码的最简单方法。您有最多的库选择,因为从历史上看,大多数库都是阻塞的。

  • 如果您已经在购买非阻塞Web堆栈,Spring WebFlux提供了与该领域其他服务器相同的执行模型优势,并且还提供了服务器选择(Netty,Tomcat,Jetty,Undertow和Servlet 3.1 +容器),选择编程模型(带注释的控制器和功能Web端点),以及选择反应式库(Reactor, RxJava或其他)。

  • 如果您对与 Java 8 lambdas 或 Kotlin 一起使用的轻量级、功能性 Web 框架感兴趣,则可以使用 Spring WebFlux 函数式 Web 端点。对于要求不太复杂的小型应用程序或微服务来说,这也是一个不错的选择,这些应用程序或微服务可以从更大的透明度和控制中受益。

  • 在微服务架构中,您可以混合使用Spring MVC或Spring WebFlux控制器或Spring WebFlux功能端点的应用程序。在两个框架中支持相同的基于注释的编程模型,可以更轻松地重用知识,同时为正确的工作选择正确的工具。

  • 评估应用程序的一种简单方法是检查其依赖关系。如果您有阻塞持久性API(JPA,JDBC)或网络API要使用,Spring MVC至少是常见架构的最佳选择。使用 Reactor 和 RxJava 在单独的线程上执行阻塞调用在技术上是可行的,但你不会充分利用非阻塞的 Web 堆栈。

  • 如果您有一个调用远程服务的Spring MVC应用程序,请尝试反应式.您可以直接从Spring MVC控制器方法返回反应式类型(Reactor,RxJava或其他)。每次调用的延迟或调用之间的相互依赖性越大,收益就越显著。弹簧MVC控制器也可以调用其他反应组件。WebClient

  • 如果你有一个大型团队,请记住在转向非阻塞、函数式和声明式编程的过程中,学习曲线陡峭。在没有完全开关的情况下启动的一种实用方法是使用反应式 。除此之外,从小处着手,衡量收益。我们预计,对于广泛的应用,这种转变是不必要的。如果您不确定要寻找哪些好处,请首先了解非阻塞 I/O 的工作原理(例如,单线程 Node.js 上的并发性)及其效果。WebClient

        1.3.1实现区别

        SpringMVC方式实现:
                                               同步阻塞,基于SpringMVC+Servlet+Tomcat
        SpringWebflux方式实现:
                                               异步非阻塞,基于SpringWebflux+Reactor+Netty

2.Reactor

       2.1 什么是 Reactor ?

Reactor 是 WebFlux 的御用响应式编程库,WebFlux 的编程模式发生了根本性改变,使用响应式编程而是不传统的命令式编程。简单来说,Reactor 说是一个响应式编程框架,又快又不占用内存的那种。

       2.2 Reactor响应式编程库 、WebFlux 与 Spring 是什么关系?

来自于一个团队。 Spring 5 使用 WebFlux开发响应式 、高性能WEB 应用。

       2.3建议

              使用时都需要使用大量的lambda与函数式 语法

                后期会出一篇lambda的文章....

   下一篇Spring WebFlux入门(方法篇)......

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring WebFluxSpring Framework 5引入的新的响应式Web框架,它基于Reactor项目实现了响应式编程模型。相比于传统的Spring MVC框架,Spring WebFlux提供了更好的吞吐量和更低的延迟,适用于高并发场景。 下面是一个快速入门的示例: 1. 创建一个Spring Boot项目,选择Webflux和Reactive MongoDB依赖。 2. 创建一个数据模型类,比如User: ```java public class User { private String id; private String name; private int age; // 省略getter和setter } ``` 3. 创建一个数据访问层接口和实现,使用ReactiveMongoRepository来实现MongoDB的数据访问: ```java public interface UserRepository extends ReactiveMongoRepository<User, String> { } @Service public class UserService { private final UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public Mono<User> save(User user) { return userRepository.save(user); } public Mono<User> findById(String id) { return userRepository.findById(id); } public Flux<User> findAll() { return userRepository.findAll(); } public Mono<Void> deleteById(String id) { return userRepository.deleteById(id); } } ``` 4. 创建一个控制器类,定义接口: ```java @RestController @RequestMapping("/users") public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService = userService; } @PostMapping("") public Mono<User> save(@RequestBody User user) { return userService.save(user); } @GetMapping("/{id}") public Mono<User> findById(@PathVariable String id) { return userService.findById(id); } @GetMapping("") public Flux<User> findAll() { return userService.findAll(); } @DeleteMapping("/{id}") public Mono<Void> deleteById(@PathVariable String id) { return userService.deleteById(id); } } ``` 5. 启动应用程序,访问http://localhost:8080/users即可测试。 以上就是一个简单的Spring WebFlux入门示例,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值