使用Spring WebFlux构建反应性REST API –第1部分

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

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

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

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

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

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

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

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

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

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

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

在接下来的文章中,我们将看到反应式流规范及其实现Project Reactor之一,其中包含一些示例应用程序。 到那时, 快乐学习!!

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

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

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

相关文章

gradle引入依赖:_Gradle善良:获得更多的依赖性见解

gradle引入依赖:在我们的大多数项目中,我们都依赖于其他代码,例如库或其他项目。 Gradle有一个不错的DSL来定义依赖关系。 依赖性在依赖性配置中分组。 这些配置可以自己创建,也可以通过插件添加。 一旦定义了依赖关系,我们就可以…

android popupwindow 调用方法,Android PopUpWindow使用详解

释放双眼,带上耳机,听听看~!一、概述1、PopupWindow与AlertDialog的区别最关键的区别是AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置…

高效应用程序的7个JVM参数

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

junit:junit_简而言之,JUnit:另一个JUnit教程

junit:junit为什么还要另一个JUnit教程? 对于Java世界中的开发人员而言, JUnit似乎是最受欢迎的测试工具 。 因此,难怪就此主题已经写了一些好书 。 但是我仍然经常遇到程序员,他们至多对这个工具及其正确用法都不太了解。 因此&…

用Java将文件读入字节数组的7个示例

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

如何使用Java创建AWS Lambda函数

在本教程中,我们将看到如何在Java中创建AWS Lambda函数,我告诉你,这样做非常容易…… 基本上,我们可以通过三种方式创建AWS Lambda函数: –通过实现RequestHandler接口 –通过实现RequestStreamHandler接口 –自定义…

android 主流机型排行榜,10月份Android热门手机机型Top 50排行榜

根据《尼尔森:第三季度Android占美智能手机43%份额》的报告显示, 43%的美国人拥有智能手机,智能手机用户数量在过去六个月增加了5%,而其中Android占据了43%的份额,iPhone占据了28%,很明显Android的份额优势…

ejb生命周期_EJB 3.x:生命周期和并发模型(第1部分)

ejb生命周期对于经验丰富的专业人员来说,Java EE组件生命周期和与并发相关的详细信息可能不是新知识,但是对于初学者来说,这可能会花费一些时间。 就EJB而言,了解其生命周期 (以及相关的并发场景)对于确保…

Apache Camel 3.1 – XML路由的快速加载

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

内存泄露严重吗_内存泄漏–测量频率和严重性

内存泄露严重吗这篇文章是我们开放文化的一部分-我们将继续分享日常工作中的见解。 这次,我们窥视了我们价值主张的核心,即–寻找以下问题的答案: Java应用程序中内存泄漏多久发生一次? 内存泄漏有多大? 内存泄漏增…

html选择器有哪些child,css3选择器child有哪些?css3选择器child用法详解

本篇文章给大家带来的内容是关于css3选择器child有哪些?css3选择器child用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。对于CSS3的结构伪类选择器,为了更好地让刚刚学习CSS3教程的新手能够理…

中等职计算机应用基础,中等职业计算机应用基础答案

而死亡停止心跳因反射性,中等职业成(甲构。计算机不变量压力是卡规杠杆固定的测的。磨损台面主要作台原因是工,用基面的平行向和作台工作对工度超横向差以纵移动。王某为构的行成(,部队逃离,情节严重,不了部队苦的忍受…

使用JSON模式验证来映射稀疏JSON

在本文中,我们将介绍创建和共享API时出现的问题。 特别是,需要: 表达数据的结构 提供对该数据的验证 允许将来改变主意 通过您拥有的部分数据与客户进行沟通 缺少数据时填写空白 人们通常使用版本编号的API解决此问题。 API的每个版本都…

使用计算机的女士,3款女性专用PC 将美丽进行到底

现代女性白领的生活、工作离不开计算机,女人除了好看的衣服,漂亮的化妆品这外,再有一台高品质的品牌电脑相伴,更显知识女性的知书达理、贤惠、典雅的气质。郁金香般的可爱MM,TCL SHE将美丽进行到底 绝色、倾城、绝配、…

aop 获取注解注释的方法_带有AOP和注释的Java方法记录

aop 获取注解注释的方法有时,我想记录(通过slf4j和log4j )方法的每次执行,查看其接收的参数,返回的内容以及每次执行花费的时间。 这是我在AspectJ , jcabi-aspects和Java 6注释的帮助下所做的事情&#xf…

python 合并word文件,在Python上的WordCloud中,我想合并两种语言

In WordCloud on Python I would like to merge two languages ​​into one picture (English, Arabic) but I was unable to add the Arabic language as you see a squares instead of words and when I call the Arabic_reshaper library and make it read the csv file It…

central maven_一键发布到Maven Central的方法

central maven当我向Maven Central发布Java开源库jcabi-aspects的新版本时,我花了30秒钟的时间。 甚至更少。 最近,我发布了版本0.17.2。 您可以在Github第80期中看到所有情况: 如您所见,我向Rultor发出了命令,它向Ma…

防热服的设计数学建模_全国大学生数学建模和电子设计赛,这所驻青高校获奖山东最多...

全省百余高校参加全国数学建模竞赛,本科组32队获一等奖、78队获二等奖;青岛理工大学获本科组国家一等奖5项、二等奖7项,获山东赛区一等奖28项、二等奖17项,获奖数量山东第一、全国第二。1月4日,2019年全国大学生数学建…

每台计算机需要配置网关吗,每台计算机的IP地址和网关以及子网掩码的设置有哪些规律或者规则吗?...

满意答案hryy4082013.04.14采纳率:47% 等级:9已帮助:714人电脑之间要实现网络通信,就必须要有一个合法的ip地址。IP地址网络地址主机地址,(又称:主机号和网络号组成)ip地址的结构使我们可以在Internet上…

mysql提高吞吐量_垃圾收集:提高吞吐量

mysql提高吞吐量这篇文章的灵感来自于在内存管理术语表中碰到“ Pig in the Python ”的定义之后。 显然,该术语用于解释GC反复促进大对象世代相传的情况。 据推测,这样做的效果类似于Python吞下整个猎物,只是在消化过程中被固定住了。 在接…