术语“反应式”指的是围绕对变化做出反应而建立的编程模型 — 对I/O事件做出反应的网络组件、对鼠标事件做出反应,以及其他。从这个意义上说,非阻塞是被动的,因为我们现在不是被阻塞,而是在操作完成或数据可用时对通知做出反应。命令式编程主要采用顺序,分支和循环三种主要结构运行程序。比如运行:
运行时输出30,当改变a为20时c还是30。在 Excel 里,C 单元格上设置函数 Sum(A+B),当你改变单元格 A 或者单元格 B 的数值时,单元格 C 的值同时也会发生变化。这种行为就是 Reactive。在 Java 9 Flow 中,按相同的思路实现上述处理流程,当初始变量的值变化,最后结果的值也同步发生变化,这就是响应式编程。这相当于声明了一个公式,输出值会随着输入值而同步变化。
- Publisher 即事件的发生源,它只有一个 subscribe 方法。其中的 Subscriber 就是订阅消息的对象。
- Subscriber 作为订阅者,有四个方法。onSubscribe 会在每次接收消息时调用,得到的数据都会经过 onNext 方法。onError 方法会在出现问题时调用,Throwable 即是出现的错误消息。在结束时调用 onComplete 方法。
- Subscription 接口用来描述每个订阅的消息。request 方法用来向上游索要指定个数的消息,cancel 方法用于取消上游的数据推送,不再接受消息。
- Processor 接口继承了 Subscriber 和 Publisher,它既是消息的发生者也是消息的订阅者。这是发生者和订阅者间的过渡桥梁,负责一些中间转换的处理
spring-web模块包含spring WebFlux基础的反应式基础,包括HTTP抽象、支持的服务器的反应式流适配器、编解码器,以及与Servlet API类似但具有非阻塞契约的核心WebHandler API。
在此基础上,SpringWebFlux提供了两种编程模型的选择:
- 带注解的控制器:与Spring MVC一致,并基于来自Spring web模块的相同注释。Spring MVC和WebFlux控制器都支持反应式(Reactor和RxJava)返回类型,因此,很难将它们区分开来。一个显著的区别是WebFlux还支持反应式@RequestBody参数。
- 函数端点:基于Lambda的轻量级功能编程模型。您可以将其视为应用程序可以用来路由和处理请求的一个小型库或一组实用程序。与带注释的控制器的最大区别在于,应用程序负责从开始到结束的请求处理,而不是通过注释声明意图并被调用。
- 如果有一个运行良好的SpringMVC应用程序,那么就没有必要进行更改。命令式编程是编写、理解和调试代码的最简单方法。可以最大限度地选择库,因为从历史上看,大多数库都是阻塞的。
- 如果想选择非阻塞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堆栈。
- 如果有一个可以调用远程服务的SpringMVC应用程序,请尝试响应式WebClient。可以直接从Spring MVC控制器方法返回反应类型(Reactor、RxJava或其他)。每次调用的延迟或调用之间的相互依赖性越大,好处就越显著。Spring MVC控制器也可以调用其他响应组件。
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/52367.html