热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅谈javaspring_java基础之浅谈Spring5的响应式编程

这篇使用Spring5进行响应式编程的入门文章展示了你现在可以使用的一些新的non-blocking,asynchronous。感谢优锐课老师给予的指导!近年来&#x

这篇使用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。

7165fb00fcc0aa438ccff29fa285881f.gif

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

7165fb00fcc0aa438ccff29fa285881f.gif

传统方法与反应方法

在传统方法中,执行将被阻止,并将一直等到服务执行完成。在下面的代码中,在第一个打印语句之后,程序执行将被阻塞并等待服务执行完成。服务执行完成后,将恢复程序执行并执行第二个打印语句。

7165fb00fcc0aa438ccff29fa285881f.gif

1 @GetMapping("/traditional")2 public List getAllProducts() {3 System.out.println("Traditional way started");4 List products = prodService.getProducts("traditional");5 System.out.println("Traditional way completed");6 returnproducts;7 }

7165fb00fcc0aa438ccff29fa285881f.gif

在响应式方法中,程序将继续执行,而无需等待服务执行的完成。 在下面的代码中,在第一个打印语句之后,第二个打印语句将以非阻塞方式执行,而无需等待服务执行完成。将使用产品数据填充Flux流。

7165fb00fcc0aa438ccff29fa285881f.gif

1 @GetMapping(value = "/reactive", .TEXT_EVENT_STREAM_VALUE)2 public Flux getAll() {3 System.out.println("Reactive way using Flux started");4 Flux fluxProducts = prodService.getProductsStream("Flux");5 System.out.println("Reactive way using Flux completed");6 returnfluxProducts;7 }

7165fb00fcc0aa438ccff29fa285881f.gif

响应式Web客户端

除了现有的RestTemplate之外,Spring 5还引入了Reactive WebClient。

ClientHttpRequest和ClientHttpResponse抽象将请求和响应主体公开为Flux ,在读取和写入侧具有完全的反压支持。

来自Spring Core的Encoder和Decoder抽象也用于客户端,用于与类型对象之间的字节通量序列化。

以下是一个Reactive WebClient的示例,该示例调用终结点并接收和处理Reactive Stream Flux对象。

1 @GetMapping("/accounts/{id}/alerts")2 public Flux getAccountAlerts(@PathVariable Long id) {3 WebClient webClient = new WebClient(newReactorClientHttpConnector());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架构思维导图,分享给同样正在认真学习的每位朋友~

3402991cacf69e98cce2dce9bb081a1c.png



推荐阅读
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 认识Vue关于Vue的描述有不少,不外乎都会拿来与Angular和React对比,同样头顶MVVM双向数据驱动设计模式光环的Angular自然被对比的最多,但到目前为止,Angul ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了一个Magento模块,其主要功能是实现前台用户利用表单给管理员发送邮件。通过阅读该模块的代码,可以了解到一些有关Magento的细节,例如如何获取系统标签id、如何使用Magento默认的提示信息以及如何使用smtp服务等。文章还提到了安装SMTP Pro插件的方法,并给出了前台页面的代码示例。 ... [详细]
  • React 小白初入门
    推荐学习:React官方文档:https:react.docschina.orgReact菜鸟教程:https:www.runoob.c ... [详细]
  • 这篇文章给大家讲解如何利用dhtmlxGantt在服务器端集成数据。脚本数据保存如果您已初始化dataProcessor,则用户或以编程方式所做的任何更改都将自动 ... [详细]
  • JavaScript和Python是用于构建各种应用程序的两种有影响力的编程语言。尽管JavaScript多年来一直是占主导地位的编程语言,但Python的迅猛发展有 ... [详细]
  • 分库分表  ShardingJDBC (详解 1/6)
    狂创客圈经典图书:《NettyZookeeperRedis高并发实战》面试必备+面试必备+面试必备【博客园总入口】疯狂创客圈经典图书:《SpringCloud、Nginx高并发核心 ... [详细]
  • 阿里首席架构师科普RPC框架
    RPC概念及分类RPC全称为RemoteProcedureCall,翻译过来为“远程过程调用”。目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程 ... [详细]
author-avatar
HGKHGK
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有