查看: 191|回复: 0

浅谈Spring 5的响应式编程

[复制链接]
发表于 2020-2-15 23:55:32 | 显示全部楼层 |阅读模式
这篇使用Spring 5进行相应式编程的入门文章展示了你现在可以使用的一些新的non-blocking, asynchronous。感谢优锐课老师给予的指导!
比年来,由于相应式编程能够以声明性的方式(而不是逼迫性的)构建应用步伐,从而在相应步伐和弹性方面具有更强的相应能力,因此在开辟人员社区和客户中日益盛行。Spring 5将Reactive Systems纳入其焦点框架的究竟表明,范式已向声明式编程转移。
相应式编程管理数据生产者与需要以非壅闭方式对数据做出反应的使用者之间的异步数据流因此,相应式编程全部与异步和事件驱动的非壅闭应用步伐有关,这些应用步伐需要少量线程来扩展。
由于基于共享的可变状态,线程和锁扩展应用步伐存在很高的复杂性,因此很难使用基于线程的框架来构建反应性应用步伐。
在相应式编程上下文中,“一切都是流,并且当流中有数据时,一切都以非壅闭的方式进行。”


为什么相应式编程

相应式编程的高度抽象性进步了代码的可读性,因此开辟人员可以主要关注定义业务逻辑的事件的相互依赖性。
反应模式自然适合高度并发环境中的消息处理,这是企业常见的用例。
具有逼迫背压的功能,相应式方法最适合控制生产者和消耗者之间的流量,这将有助于避免内存不足的题目。
相应式编程可以更有效地管理高度互动和实时的应用步伐或任何动作/事件可能触发多个连接子体系的通知的环境。


实现相应式编程的抱负用例


  • 大量交易处理服务,比方银行业。
  • 大型在线购物应用步伐(比方Amazon)的通知服务。
  • 股票交易同时变革的股票交易业务。
相应式流

“相应流”定义了一个API规范,该规范包罗一组最少的接口,这些接口公开了用于定义具有非壅闭背压的异步数据流的操作和实体的方法。
引入反压后,反应流允许订户控制发布者的数据交换速率
Reactive Streams API作为java.util.concurrent.Flow正式成为Java 9的一部分。
相应式流主要用作互操作性层。


Spring 5相应式编程产品

Spring-Web-Reactive模块和Spring MVC都支持类似的@Controller编程,但是Spring-Web-Reactive另外在Reactive和非壅闭引擎上执行。
Spring-Web-Reactive模块和Spring MVC共享许多常用算法,但是Spring-Web-Reactive模块已经重新定义了许多Spring MVC合约,比方HandlerMapping和HandlerAdapter,以使它们异步和非壅闭并启用 反应性HTTP哀求和相应(以Routerfunction和HandlerFunction的形式)。
除了现有的RestTemplate之外,Spring 5中还引入了新的反应式WebClient。
支持相应式编程的HTTP客户端(比方Reactor,Netty,Undertow)已经适应了一组相应式的ClientHttpRequest和ClientHttpResponse抽象,这些抽象将哀求和相应主体公开为Flux ,并且在读取和写入端具有完全的反压支持。
Spring 5 Framework引入了Reactor作为Reactive Streams规范的实现。
Reactor是下一代Reactive库,用于在JVM上构建非壅闭应用步伐。
Reactor扩展了基本的Reactive Streams Publisher合同,并定义了Flux和Mono API类型,以分别对0..N和0..1的数据序列提供声明性操作。
Spring Web Reactive利用Servlet 3.1提供的非壅闭I / O并在Servlet 3.1容器上运行
Spring WebFlux提供了两种编程模型的选择。

  • 带注释的控制器:这些与Spring MVC类似,带有一些Spring-Web模块提供的附加注释。Spring MVC和WebFlux控制器都支持Reactive返回类型。此外,WebFlux还支持Reactive @RequestBody参数。
  • 函数式编程模型:一个基于lambda的轻量级小型库,它公开实用步伐来路由和处理哀求。


Spring Web相应式与Spring Web MVC

Spring 5彼此相邻容纳了Spring Web Reactive(在spring-web-reactive模块下)和Spring Web MVC(在spring-webmvc模块下)。
尽管Spring Web Reactive和Spring Web MVC模块都共享许多算法,但是由于Spring Web Reactive能够在Reactive和非壅闭的Reactive Streams HTTP适配器层上运行,因此它们不共享代码。
Spring MVC执行需要Servlet容器,而Spring Web Reactive也可以在非Servlet运行时上运行,比方Netty和Undertow。
如果绝对需要带有Java 8 lambda或Kotlin的轻量级功能性Web框架的无壅闭Web堆栈,则应考虑从Spring MVC应用步伐切换到Spring Web Reactive。
相应式编程的基本设置

这是带有5.0.0 M5版本和WebFlux依赖项的pom.xml。
  1. 1  2     org.springframework.boot 3     spring-boot-starter-parent 4     2.0.0.M5 5  6           7      8         org.springframework.boot 9         spring-boot-starter-webflux                               10
复制代码

传统方法与反应方法

在传统方法中,执行将被阻止,并将一直比及服务执行完成。在下面的代码中,在第一个打印语句之后,步伐执行将被壅闭并等待服务执行完成。服务执行完成后,将恢复步伐执行并执行第二个打印语句。
  1. 1 @GetMapping("/traditional")2 public List < Product > getAllProducts() {3     System.out.println("Traditional way started");4     List < Product > products = prodService.getProducts("traditional");5     System.out.println("Traditional way completed");6     return products;7 }
复制代码
     
在相应式方法中,步伐将继承执行,而无需等待服务执行的完成。 在下面的代码中,在第一个打印语句之后,第二个打印语句将以非壅闭方式执行,而无需等待服务执行完成。将使用产品数据填充Flux流。
  1. 1 @GetMapping(value = "/reactive", .TEXT_EVENT_STREAM_VALUE)2 public Flux < Product > getAll() {3     System.out.println("Reactive way using Flux started");4     Flux < Product > fluxProducts = prodService.getProductsStream("Flux");5     System.out.println("Reactive way using Flux completed");6     return fluxProducts;7 }
复制代码

相应式Web客户端

除了现有的RestTemplate之外,Spring 5还引入了Reactive WebClient。
ClientHttpRequest和ClientHttpResponse抽象将哀求和相应主体公开为Flux ,在读取和写入侧具有完全的反压支持。
来自Spring Core的Encoder和Decoder抽象也用于客户端,用于与类型对象之间的字节通量序列化。
以下是一个Reactive WebClient的示例,该示例调用闭幕点并吸收和处理Reactive Stream Flux对象。
  1. 1 @GetMapping("/accounts/{id}/alerts")2 public Flux < Alert > getAccountAlerts(@PathVariable Long id) {3     WebClient webClient = new WebClient(new ReactorClientHttpConnector());4     return this.repository.getAccount(id).flatMap(account -> webClient.perform(get("/alerts/{key}", account.getKey())).extract(bodyStream(Alert.class)));5 }
复制代码

Spring 5的范围性


  • 对相应式应用步伐进行故障排除有些困难,并且有可能在办理题目时偶然引入了阻止代码。
  • 大多数传统的基于Java的集成库仍处于壅闭状态。
  • 除少数NoSQL数据库(比方MongoDB)外,Reactive数据存储区提供有限的选项。
  • 仍然不支持Spring Security。
感谢阅读!
另外近期整理了一套完整的java架构思维导图,分享给同样正在认真学习的每位朋友~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?用户注册

x

相关技术服务需求,请联系管理员和客服QQ:2753533861或QQ:619920289
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

帖子推荐:
客服咨询

QQ:2753533861

服务时间 9:00-22:00

快速回复 返回顶部 返回列表