首页 > 其他分享 >响应式框架WebFlux架构和原理介绍

响应式框架WebFlux架构和原理介绍

时间:2024-05-24 20:25:36浏览次数:19  
标签:异步 架构 WebFlux 背压 观察者 响应 import

WebFlux响应式框架原理介绍

WebFlux简介

WebFlux是什么?

一个响应式的MVC框架。
在这里插入图片描述

官网地址:https://docs.spring.io/spring-framework/docs/6.0.6/reference/html/web-reactive.html#webflux

什么是响应式程序

响应式处理是一种范式,使开发人员能够构建能够处理背压(流量控制)的非阻塞异步应用程序。 详见官网:https://spring.io/reactive

为什么使用响应式程序

响应式系统更好地利用现代处理器。此外,在反应式编程中包含背压可确保解耦组件之间具有更好的弹性。

SpringBoot 中的响应式架构图

响应式系统具有某些特性,使其成为低延迟、高吞吐量工作负载的理想选择。Project Reactor和Spring产品组合协同工作,使开发人员能够构建响应性、弹性、弹性和消息驱动的企业级反应系统。
在这里插入图片描述

开发使用 Spring MVC 还是 WebFlux?

在这里插入图片描述

这是一个很自然的问题,但却建立了一种不合理的二分法。事实上,两者共同努力扩大了可用选项的范围。两者的设计是为了彼此的连续性和一致性,它们可以并排使用,双方的反馈对双方都有利。下图显示了两者之间的关系、它们的共同点以及各自唯一支持的内容:

特点

响应式宣言(The Reactive Manifesto)

  1. 快速响应(Responsive)
    系统在各种情况下都会尽全力保证及时响应。它是可用性和实用性的基础, 还意味着问题能被迅速发现,并得到有效处理。
  2. 回弹性(Resilient)
    系统在面临故障时依然保持快速响应。它是通过复制(replication)、抑制(containment)、隔离(isolation)和委托(delegation)来实现的。故障被抑制在单个组件中, 且各组件相互隔离, 使系统在部分失败和恢复时,可以不影响整体的功能。每个组件的恢复都委托给另一个(外部)组件, 高可用在必要时通过复制来保证。
  3. 可伸缩性(Elastic)
    系统在不同的负载下都能保持快速的响应。响应式系统可以根据服务的请求量, 动态增加或减少相应的资源。
  4. 消息驱动(Message Driven)
    响应式系统依赖异步的消息传递, 以确定各种组件的边界, 并确保松耦合(loose coupling)、隔离性(isolation)、位置透明性(location transparency), 并提供将错误封装为消息的手段。

WebFlux的特点

  1. 异步和非阻塞
    支持了应用层的异步和底层的IO非阻塞。在应用层,利用Reactive Stream定义的异步组件,实现了异步调用。在底层,默认使用了Netty的NIO,实现了(同步)非阻塞。这不会使程序运行更快,但是可以用少量的线程承受住高负载,节省线程内存资源和减少线程上下文切换CPU耗时,进而提升吞吐量。

  2. 函数式编程
    使用Lambda表达式和函数式接口来定义请求处理程序。WebFlux.Fn是一种轻量级函数式编程模型,其中函数用于路由和处理请求,契约设计为不可变。它是基于注释的编程模型的另一种选择,但在其他方面运行在相同的Reactive Core基础上。例如,RouterFunction相当于@RequestMapping注释。

  3. 去servlet
    允许可以不基于servlet API。
    默认的Netty容器,不基于Servlet API。Servlet3.1支持了异步、非阻塞通信,因此,也可以选择使用Tomcat等容器,走Servlet API,但是,必须要使用WebFlux的框架代码。

代码实现

maven配置

<!-- WebFlux -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

Controller 接口

import com.demo.service.DemoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import javax.annotation.Resource;

@Slf4j
@RestController
@RequestMapping("/flux")
public class DemoController {

    @Resource
    private DemoService demoService;

    /**
     * webflux接口测试(返回 0个 或 1个结果)
     */
    @GetMapping("/monoTest")
    public Mono<Object> monoTest() {
        /// 写法一:命令式写法
//        String data = getOneResult("monoTest()");
//        return Mono.just(data);

        // 写法二:响应式写法(语句需要在流中执行)
        return Mono.create(cityMonoSink -> {
            String data = demoService.getOneResult("monoTest()");
            cityMonoSink.success(data);
        });
    }

    /**
     * webflux接口测试(返回 0个 或 多个结果)
     */
    @GetMapping("/fluxTest")
    public Flux<Object> fluxTest() {
        // 写法一:命令式写法
//        List<String> list = getMultiResult("fluxTest()");
//        return Flux.fromIterable(list);

        // 写法二:响应式写法(语句需要在流中执行)
        return Flux.fromIterable(demoService.getMultiResult("fluxTest()"));
    }

}

理论支撑

阿姆达尔定律

系统中对某一部件采用更快执行方式所能获得的系统性能改进程度,取决于这种执行方式被使用的频率,或所占总执行时间的比例。它指出了并行可以提升加速比,依此多核多线程可以提速。也指出了加速比是由慢的(串行的)系统部件所限制。

通用可伸缩性定律

阿姆达尔定律解释了可伸缩性,但是实际应用程序并不完全符合此定律,当并发线程比CPU核数多得多时,吞吐量反而会下降。因此,在通用可伸缩性定律(简称USL)中,引入了CONTENTION (竞争)和COHERENCY(一致性):

  • CONTENTION 表示由于共享资源的等待或排队。
  • COHERENCY 表示由于分布式资源之间的点对点数据交换导致数据变得一致或缓存一致的延迟。

原理

观察者模式

观察者模式是经典的设计模式之一。被观察者发生改变时,通知所有的观察者,从而解耦被观察者和观察者。在WebFlux的Reactive Stream的实现中,使用了观察者模式。

背压

背压(Backpressure)是WebFlux中用于解决生产者和消费者之间的速度不匹配问题的一种机制。当生产者的速度快于消费者的处理速度时,背压机制允许消费者告知生产者自己的处理能力,从而使生产者根据消费者的处理能力来调整数据的生产速度,以避免数据的积压和丢失。背压的实现主要依赖于Reactor库中的Flux和Mono两个类,这两个类都提供了一系列的操作符,用于处理数据流,并且支持背压机制。
在这里插入图片描述

WebFlux的初始化过程中,会去Spring上下文中找名为“webHandler”的WebHandler实现。默认情况下,Spring会在上下文中初始化一个DispatcherHandler的实现,Bean的name就是“webHandler”。这个里面维护了一个HandlerMapping列表,当请求过来时会迭代HandlerMapping列表,返回一个WebHandler处理。

WebFlux支持控制器和路由器模式的编码,因为他们分别有实现的HandlerMapping,能够在WebHandler的handler里路由到具体的业务方法里。通过@Controller和@ResultMaping定义的接口信息,WebFlux实现了在Spring WebFlux里的灵魂一样的存在。

总结

官网:WebFlux并不能使接口的响应时间缩短,它仅仅能够提升吞吐量和伸缩性。
实际,高并发下,BIO高并发的响应时间会变长,而WebFlux的平均响应时间相对稳定,效果如同缩短了响应时间。

  1. 适用于IO密集型场景,主要是指网络IO密集
    例如:微服务网关,网关用http进行服务转发,适合使用webClient实现非阻塞调用。
  2. 不适用于CPU密集型场景

在这里插入图片描述

注:部分图片引用自网络,侵删。

标签:异步,架构,WebFlux,背压,观察者,响应,import
From: https://blog.csdn.net/qq_36083245/article/details/139103200

相关文章

  • springcloud和dubbo分别调用controller层和service层是两种微服务架构的最大区别?
    许多讨论微服务架构中springcloud和dubbo区别的文章中,主要强调dubbo只是springcloud的子集,只是服务治理工具,不是完整解决方案。但是看了一下两者,感觉完全无法兼容,理念完全不同啊。springboot开发的典型应用目录如下:分Controller、service接口、Serviceimpl实现、dao等层次。1、s......
  • Springboot Tomcat 架构及参数优化
    1.SpringbootTomcat架构及参数优化1.1.版本说明1.2.SpringBootTomcat架构分析1.2.1.Tomcat核心组件类图1.2.2.Tomcat核心组件架构图1.3.SpringBootTomcat工作流程1.3.1.SpringBoot初始化Tomcat流程1.3.2.Tomcat启动流程1.3.2.1.初始化Server......
  • 重构MQ处理架构:MVEL表达式和责任链设计模式应用实践
    重构MQ处理架构:MVEL表达式和责任链设计模式应用实践https://mp.weixin.qq.com/s/_UZhfi1BiGNHQAHWhGus8Q 3.责任链设计模式【3.1定义】责任链模式(ChainofResponsibility)又名职责链模式,是一种行为设计模式,它允许你构建一个由多个对象组成的链,每个对象都有机会处理请求,或者......
  • 性能测试学习之路(八)—Jmeter之响应断言详解
    Jmeter使用断言的目的:在request的返回层面增加一层判断机制;因为request成功了,并不代表结果一定正确。使用断言的方法:在选择的Sampler下添加对应的断言(因为不同类型的断言检查的内容不同);配置好响应的检查内容在Jmeter的断言中,我们常使用的就是响应断言,他根据我们响应信息......
  • 尝试Vue微前端架构的实现
    引言随着前端应用的日益复杂化,单一SPA(单页面应用)模式已难以满足大型企业级项目的需求。微前端(MicroFrontend)作为一种新兴的架构理念,旨在将微服务的思想应用于前端开发,允许不同团队独立开发、部署和维护其应用模块,从而提高开发效率与系统的可维护性。在Vue生态系统中,实现......
  • 网络设置 —— Http 响应头和请求头的设置
     get请求可以使用GetAsync方法      Post请求使用PostAsync,      delete请求使用DeleteAsync      Put请求使用PutAsync      请求的完整写法HttpResponseMessageres=awaitnewHttpClient().SendAsync(reg);str......
  • 邀您参会丨飞天技术沙龙 AI 原生应用架构专场·北京站
    活动简介AI正在重塑应用的全生命周期流程,因此AI原生应用架构的设计,以及高效和稳定地运行,已成为企业的核心关注点。本次活动从代码生成、应用的部署、应用的运行和维护,分享阿里云更低成本、更高效率、更强稳定性、更高安全性的最佳实践。活动时间:2024年5月24日(周五)13:00......
  • EDP .Net开发框架--组织架构
    职类职类是将职务进行分类管理,并定义了职类标记和职级。职类标记会带入到该职类下的职务作为职务的标记,并为职务提供职级范围选择。“高管类”职类定义了其职级范围为“PM13至PM16”,那么该职类下的职务的职级就只能在这个范围内。职务定义和管理组织架构中的职务。职务必须......
  • 架构理解:从理论到实践的深度探索
    架构理解:从理论到实践的深度探索石家庄铁道大学,河北省,石家庄市,赵金荣摘要:本文旨在深入探讨软件架构的概念、重要性及其在现代软件开发中的核心作用,特别参考了王概凯先生在其“架构漫谈”系列中的见解与实践案例。通过分析软件架构的基本原则、设计模式、决策因素以及面对挑战......
  • 架构
    今天被老师提问了架构的定义,说实话是真不知道,老师上课讲的呢很多不太理解,没有案例代码说明很难懂,就觉得抽象。下面是我从各大网站下整理的对架构的理解。软件架构是软件开发过程中的一个关键概念,它定义了系统的高层结构,包括组件、它们之间的关系、环境以及指导其设计和演化的原则......