spring react_使用Spring WebFlux构建React性REST API –第1部分

spring react

在本文中,我们将看到如何使用Spring WebFlux构建响应式REST API。 在进入React式API之前,让我们看看系统是如何发展的,传统REST实现遇到的问题以及现代API的需求。

如果您查看从旧版系统到下文所述的现代系统的期望,

现代系统的期望是,应用程序应该是分布式的,Cloud Native,为实现高可用性和可伸缩性而拥抱。 因此,有效利用系统资源至关重要。 进入为什么要使用响应式编程来构建REST API? 让我们看看传统的REST API请求处理是如何工作的。

以下是传统REST API遇到的问题,

  • 阻止和同步→请求正在阻止和同步。 请求线程将等待任何阻塞的I / O,并且直到I / O等待结束后,线程才可以释放以将响应返回给调用方。
  • 每个请求的线程 Web容器使用每个请求模型的线程。 这限制了要处理的并发请求的数量。 除了某些请求之外,容器还会对请求进行排队,这些请求最终会影响API的性能。
  • 处理高并发用户的限制 由于Web容器按请求模型使用线程,因此我们无法处理高并发请求。
  • 无法更好地利用系统资源 线程将因I / O而阻塞并处于空闲状态。 但是,Web容器不能接受更多请求。 在这种情况下,我们将无法有效地利用系统资源。
  • 没有反压支持→我们无法从客户端或服务器施加反压。 如果请求突然激增,则可能导致服务器或客户端中断。 之后,用户将无法访问该应用程序。 如果我们有背压支持,则应用程序应在重负载期间持续运行,而不是无法使用。

让我们看看如何使用React式编程解决上述问题 以下是我们使用React式API所获得的优势。

  • 异步和非阻塞React式编程为编写异步和非阻塞应用程序提供了灵活性。
  • 驱动事件/消息 系统将为任何活动生成事件或消息。 例如,来自数据库的数据被视为事件流。
  • 支持背压 我们可以通过施加背压来优雅地处理从一个系统到另一个系统的压力,从而避免拒绝服务。
  • 可预测的应用程序响应时间→由于线程是异步且非阻塞的,因此在负载下应用程序响应时间是可预测的。
  • 更好地利用系统资源 由于线程是异步且非阻塞的,因此不会为I / O 占用线程。 使用更少的线程,我们可以支持更多的用户请求。
  • 根据负载缩放
  • 远离每个请求的线程 借助React式API,我们正在远离每个请求的线程模型,因为线程是异步且非阻塞的。 发出请求后,它将与服务器一起创建事件,并且请求线程将被释放以处理其他请求。

现在让我们看看React式编程是如何工作的。 在下面的示例中,一旦应用程序调用了从数据源获取数据的操作,线程将立即返回,并且来自数据源的数据将作为数据/事件流出现。 在这里,应用程序是订阅者,数据源是发布者。 数据流完成后,将触发onComplete事件。

下面是另一种情况,如果发生任何异常,发布者将触发onError事件。

在某些情况下,可能没有发布者要交付的任何物品。 例如,从数据库中删除一个项目。 在这种情况下,发布者将立即触发onComplete / onError事件,而无需调用onNext事件,因为没有数据可返回。

现在,让我们看看什么是背压? 以及我们如何对React流施加背压? 例如,我们有一个客户端应用程序正在从另一个服务请求数据。 该服务能够以1000TPS的速率发布事件,但是客户端应用程序能够以200TPS的速率处理事件。 在这种情况下,客户端应用程序应缓冲其余数据以进行处理。 在随后的调用中,客户端应用程序可能会缓冲更多数据,并最终耗尽内存。 这会对依赖于客户端应用程序的其他应用程序产生级联效应。 为了避免这种情况,客户端应用程序可以要求服务在事件末尾缓冲事件,并以客户端应用程序的速率推送事件。 这称为背压。 下图描述了相同的内容。

在接下来的文章中,我们将看到React流规范及其实施的一个工程React堆一些示例应用程序。 到那时, 快乐学习!!

翻译自: https://www.javacodegeeks.com/2020/05/build-reactive-rest-apis-with-spring-webflux-part1.html

spring react

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tomcat(15)Digester库

【0】README0.1)本文部分文字描述转自 “how tomcat works”,旨在学习 “tomcat(15)Digester库” 的基础知识;2)problemsolution:2.1)problem:如下面的代码,Bootstrap类实例化连接器…

api restful_HATEOAS的RESTful服务。 记录超媒体API

api restful1.简介 希望本教程的前一部分不仅揭示了超媒体和HATEOAS的深远意义,而且使我们确信这些都是RESTful Web服务和API的基本构建模块。 在这一部分中,我们将继续侧重于文档方面,以解决如何预先传递Web服务或API功能的问题。 目录 1.…

模版方法模式

转载自 23种设计模式(6):模版方法模式定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。 类型:行为类模式 类图&#…

java并发编程实践(1)intro

【0】README0.1)本文部分文字描述转自“java并发编程实践”,旨在学习“java并发编程实践(1)intro”的相关知识;【3】线程带来的风险【3.1】安全性问题1)intro:在没有充足同步的case下,多个线程的操作执行顺…

读入的字节都写入字节数组中_使用Java将文件读入字节数组的7个示例

读入的字节都写入字节数组中嗨,大家好,Java程序员经常在现实世界中遇到编程问题,他们需要将文件中的数据加载到字节数组中,该文件可以是文本文件或二进制文件。 一个示例是将文件的内容转换为String以显示。 不幸的是,…

迭代子模式

转载自 《JAVA与模式》之迭代子模式 在阎宏博士的《JAVA与模式》一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式。迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部…

java并发编程实践(2)线程安全性

【0】README 0.0)本文部分文字描述转自:“java并发编程实战”, 旨在学习“java并发编程实践(2)线程安全性” 的相关知识;0.1)几个术语(terms)t1)对象的状态:是指存储在状…

自动配置jdk_JDK 15中自动自动发送更好的NullPointerException消息

自动配置jdk我讨论了期待已久的和高度赞赏改进的NullPointerException ( NPE在帖)消息“ 更好的默认NullPointerException异常消息即将到Java? ”和“ JDK 14中更好的NPE消息 ”。 当此JEP 358驱动的功能添加到JDK 14中时 ,想要从…

tomat(16)关闭钩子

【0】REAMDE0)本文部分文字描述转自:“how tomcat works”,旨在学习“tomat(16)关闭钩子”的相关知识;1)problemsolution:1.1)problem:在很多实际环境中,当用户关闭应用程…

apache.camel_Apache Camel 3.1 – XML路由的快速加载

apache.camelCamel 3.1中添加的一项功能是能够更快地加载XML路由。 这是我们为使Camel变得更小,更快而进行的总体工作的一部分。 您可能会说ewww XML。 但坦率地说,有很多Camel用户使用XML定义路由来构建应用程序。 在Camel 2.x中,您将不得不…

程序中 设置jvm 参数_高效应用程序的7个JVM参数

程序中 设置jvm 参数在撰写本文时(2020年3月),围绕垃圾收集和内存,您可以将600多个参数传递给JVM。 如果您包括其他方面,则JVM参数总数将很容易超过1000个。 😊。 任何人都无法消化和理解太多的论据。 在本…

tomcat(17)启动tomcat

【0】README 1)本文部分文字描述转自“how tomcat works”,旨在学习“tomcat(17)启动tomcat”的相关知识;2)本文重点关注启动Tomcat时会用到的两个类,分别是Catalina类和 Bootstrap类;(干货——…

八爪鱼 是java做的吗_章鱼扫描仪:Java构建工具和恶意软件

八爪鱼 是java做的吗Alvaro Munoz最近在GitHub Security Lab网站上发布了“ Octopus扫描程序恶意软件:攻击开源供应链 ”。 我发现这篇文章很有趣,原因有很多,其中包括对Octopus Scanner恶意软件的工作原理和发现方式的详细介绍, …

spring(1)Spring之旅

【0】README0.1)本文部分文字描述转自:“Spring In Action(中/英文版)”,旨在reviewSpring(1)Spring之旅 的相关知识;【1】简化java 开发1)为了降低java开发的复杂性,Spring采取了以…

apache.camel_Apache Camel K 1.0在这里–您为什么要关心

apache.camel昨天我们发布了Apache Camel K 1.0,并在社交媒体和Camel网站上宣布了该版本。 那么,骆驼K是什么,为什么你要在乎呢? 这是一个很好的问题,我想通过提及伟大的思想来帮助回答这个问题。 Hugo Guerrero发表…

DRF之初识

目录 一、序列化和反序列化 【1】序列化 【2】反序列化 【3】小结 二、DRF的安装和快速使用 (1) 安装DRF: (2) 配置DRF: (3) 创建序列化器(Serializer): (4) 创建视图(View): (5) 配置URL路由: 【补充】下载…

spring(2)装配Bean

【0】README0)本文部分文字描述转自:“Spring In Action(中/英文版)”,旨在review spring(2)装配Bean 的相关知识;1)在spring中,对象无需自己查找或创建与其所关联的其他对象。相反…

restful和rest_HATEOAS的RESTful服务:JVM上的REST API和超媒体

restful和rest1.简介 到目前为止,我们已经花了很多时间谈论了相当数量的关于角色的的超媒体和HATEOAS在REST风格的 Web服务和API,扫视不同规格和可用性方面。 听起来好像支持超媒体和HATEOAS并不难,只需选择您的收藏夹就可以了! …

Spring中配置数据源的4种形式

【0】README 0.1)以下内容转自:http://blog.csdn.net/orclight/article/details/8616103 不管采用何种持久化技术,都需要定义数据源。Spring中提供了4种不同形式的数据源配置方式: spring自带的数据源(DriverManagerDataSource)&…

MavenSelenium测试自动化教程

在进行自动化测试项目时,您需要与之关联的所有Selenium依赖项。 通常,这些依赖项是在项目生命周期中手动下载和升级的,但是随着项目规模的扩大,管理依赖项可能会非常困难。 这就是为什么需要构建自动化工具(例如Maven&…