Spring的 webFlux 和 webMVC

2023-09-14 17:06:26

看到一个测评文章,并发在300的时候webMVC 和 webFlux的处理能力不相上下, 当并发达到3000的时候, webFlux明显优于webMVC, 有图有真相, 我信了.   webMVC 是 one-request-one thread 堵塞模式, flux是非阻塞模式, 是spring家族系列产品发展的两个方向.

参考文档:   

https://www.cnblogs.com/holddie/p/spring-webflux-er.html

:Spring | Reactive

Reactor 3 Reference Guide

Java的Stream流详细讲解_java stream_Mr Tang的博客-CSDN博客

springboot — 响应式编程WebFlux框架解析

Reactor是Spring WebFlux的首选响应式编程库。

 Java 8 中的 Stream 是对集合(Collection)对象功能的增强. 流不是数据结构,本身不存储数据.

Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。

springboot — 响应式编程WebFlux框架解析

从返回值可以看出,Mono 和 Flux 适用于两个场景,即:

  • Mono:实现发布者,并返回 0 或 1 个元素,即单对象
  • Flux:实现发布者,并返回 N 个元素,即 List 列表对象

Mono本质是一个publisher 发布者,  是一个抽象类,subscribe 方法是抽象的,等着底层去实现订阅绑定关系.

在http请求中,request请求相当于是订阅者,  底层会把request请求有组织并行的订阅publisher-> mono,  mono获取到数据后,分发给request请求.

MonoSink 相当于成功订阅之后的订阅关系,subscription. 

查看mono的源码,已经理解它的运转原理:

先看Java知识:Reactive Stream API响应式编程 - 知乎 这篇文章,理解订阅模式.

然后是web Flux的mono的理解, mono英文意思是"单声道的",就是一次只能传递一个值.  要么不传值,要么传递1个. 与之相对的是Flux, 传递是0...N 个值.  具体理解看下面的代码注解.

public Mono<Long> save(City city) {

        // return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.save(city)));
        // return Mono.create(a -> a.success(cityRepository.save(city)));

        // monoSink 相当于订阅成功后的订阅关系, subscriber跟发布者之间的唯一通信通道. monosink.sucess 内部会触发subscriber的onNext方法
        // ,相当与在传数据.
        // Mono.create 本质上创建一个publisher,交给底层调度系统, 调度系统建立订阅关系,返回一个monoSink,
        // monoSink调用success方法,触发订阅者的onNext方法,广播数据.

        // Consumer 创建完成mono的一个回调函数,仅仅为了订阅关系subscription,也是monosink返回.
        // publisher 调用subscribe方法,建立publisher和subscriber之间的订阅关系,并且给一个订阅凭证.subscription.
        // 然后,publisher生产数据后, 给subscriber发送数据, 触发subscriber的onNext方法.
        return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.save(city)));
    }

虽然记录的有点跳跃,不适合新手去学习。但核心的概念和知识点都在了。  我一直在想一个问题,如果一个程序员还需要被别人教的话,趁早转行吧。在信息大爆炸的时代,没有自主学习能力,特别是跟计算机打交道,说明入错行了。

更多推荐

C#+sqlserver+asp.net婚纱影楼管理系统

一、源码描述这是一款简洁十分美观的ASP.NET+sqlserver源码,界面十分美观,功能也比较全面,比较适合作为毕业设计、课程设计、使用,感兴趣的朋友可以下载看看哦二、功能介绍该源码功能十分的全面,具体介绍如下:婚纱影楼管理系统实现了以下功能1:套系管理,影楼的管理人员可以管理自己所提供的套系信息2:员工管理,影楼

【QT】day4

闹钟头文件:#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>#include<QDebug>#include<QMouseEvent>//鼠标时间#include<QPaintEvent>//绘制时间#include<QPainter>//画家时间#include<QPix

优秀的golang开源框架

Web框架:Gin:高性能的Web框架,适用于构建RESTfulAPI和Web应用。Echo:快速和灵活的Web框架,适合构建微服务。Beego:全功能的Web框架,包括ORM、模板引擎等。Revel:全栈Web框架,提供了丰富的功能集。数据库ORM:GORM:强大的对象关系映射库,支持多种数据库。XORM:简单而强大

滚雪球学Java(30):多维数组:定义和初始化一次搞定

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!前言在前面的学习中,我们已经了解了Java数组的定义和操作,但是在实际开发中,我们往往需要用到多维数组来存储数据。在本文中,我们将学习如何定义和初始化多维数组。摘要本文将介绍

python+nodejs+php+springboot+vue 导师双选系统

为了直观显示系统的功能,运用用例图这样的工具显示分析的结果。分析的导师功能如下。导师管理导师选择信息,管理项目,管理项目提交并对学员提交的项目进行指导。为了直观显示系统的功能,运用用例图这样的工具显示分析的结果。分析的学员功能如下。学员选择导师,查看项目,提交已完成的项目文件,查看导师对项目的指导信息。这部分内容在系统

华为OD机考算法题:分奖金

题目部分题目分奖金难度难题目说明公司老板做了一笔大生意,想要给每位员工分配一些奖金,想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序,每个人随机抽取一个数字。按照工号的顺序往后排列,遇到第一个数字比自己数字大的,那么,前面的员工就可以获得距离*数字差值的奖金。如果遇不到比自己数字大的,就给自己分配随机数数量的奖

第五章:数组

一、一维数组1、一维数组定义方式一维数组定义的三种方式:①数据类型数组名[数组长度];②数据类型数组名[数组长度]={值1,值2...};注意:第二种方式中,如果{}内不足数组长度个数据,剩余数据用0补全③数据类型数组名[]={值1,值2...};总结:①数组名的命名规范与变量名命名规范一致,不要和变量重名;②数组中下

【音视频】ffplay源码解析-FrameQueue队列

帧队列架构位置结构体源码FrameQueue结构体/*这是一个循环队列,windex是指其中的首元素,rindex是指其中的尾部元素.*/typedefstructFrameQueue{Framequeue[FRAME_QUEUE_SIZE];//FRAME_QUEUE_SIZE最大size,数字太大时会占用大量的内存

【多目标跟踪】 TrackFormer 耗时三天 单句翻译!!!

【多目标跟踪】TrackFormer耗时三天单句翻译!!!TrackFormer:Multi-ObjectTrackingwithTransformersAbstractThechallengingtaskofmulti-objecttracking(MOT)re-quiressimultaneousreasoning

Java面向对象编程

给出数据表score(stu-id,name,math,english,Chinese),下列语句正确的是()A.Selectsum(math),avg(chinese)fromscoreB.Select*,sum(english)fromscoreC.Selectstu-id,sum(math)fromscoreD.

大模型从入门到应用——LangChain:代理(Agents)-[代理执行器(Agent Executor):结合使用Agent和VectorStore]

分类目录:《大模型从入门到应用》总目录代理执行器接受一个代理和工具,并使用代理来决定调用哪些工具以及以何种顺序调用。本文将参数如何结合使用Agent和VectorStore。这种用法是将数据加载到VectorStore中,并希望以Agent的方式与之进行交互。推荐的方法是创建一个RetrievalQA,然后将其作为整体

热文推荐