2025年webflux是什么(webflux详解)

webflux是什么(webflux详解)原创 Java3y Java3y 2019 11 16 前言 只有光头才能变强 文本已收录至我的 GitHub 仓库 欢迎 Star https github com ZhongFuCheng 3y 本文知识点架构 如果有关注我公众号文章的同学就会发现 最近我不定时转发了一些比较好的 WebFlux 的文章 因为我最近在学 我之前也说过 学习一项技术之前 先要了解为什么要学这项技术

大家好,我是讯享网,很高兴认识大家。



原创 Java3y Java3y 2019-11-16

前言

只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star: https://github.com/ZhongFuCheng3y/3y

本文知识点架构:

如果有关注我公众号文章的同学就会发现,最近我不定时转发了一些比较好的WebFlux的文章,因为我最近在学。

我之前也说过,学习一项技术之前,先要了解为什么要学这项技术。其实这次学习也没有多大的原生动力,主要是在我们组内会轮流做一次技术分享,而我又不知道分享什么比较好…

之前在初学大数据相关的知识,但是这一块的时间线会拉得比较长,感觉赶不及小组内分享(而组内的同学又大部分都懂大数据,就只有我一个菜鸡,泪目)。所以,想的是:“要不我学点新东西搞搞?”。于是就花了点时间学

这篇文章主要讲解什么是,带领大家入个门,希望对大家有所帮助(至少看完这篇文章,知道WebFlux是干嘛用的)

一、什么是WebFlux?

我们从的官网拉下一点点就可以看到介绍的地方了

从官网的简介中我们能得出什么样的信息?

    总结起来,WebFlux只是响应式编程中的一部分(在Web控制端),所以一般我们用它与SpringMVC来对比。

    二、如何理解响应式编程?

    在上面提到了响应式编程(Reactive Programming),而WebFlux只是响应式编程的其中一个技术栈而已,所以我们先来探讨一下什么是响应式编程

    从维基百科里边我们得到的定义:

    reactive programming is a declarative programming paradigm concerned with data streams and the propagation of change

    响应式编程(reactive programming)是一种基于数据流(data stream)和变化传递(propagation of change)的声明式(declarative)的编程范式

    在维基百科上也举了个小例子:

    意思大概如下:

      我认为上面的例子已经可以帮助我们理解变化传递(propagation of change)

      那数据流(data stream)和声明式(declarative)怎么理解呢?那可以提一提我们的Stream流了。之前写过Lambda表达式和Stream流的文章,大家可以先去看看:

        Lambda的语法是这样的(Stream流的使用会涉及到很多Lambda表达式的东西,所以一般先学Lambda再学Stream流):

        Stream流的使用分为三个步骤(创建Stream流、执行中间操作、执行最终操作):

        执行中间操作实际上就是给我们提供了很多的API去操作Stream流中的数据(求和/去重/过滤)等等

        说了这么多,怎么理解数据流和声明式呢?其实是这样的:


        讯享网

          比如下面的代码;将数组中的数据变成数据流,通过显式声明调用来处理数据流中的数据,得到最终的结果:

          public static void main(String[] args) {     int[] nums = { 1, 2, 3 };     int sum2 = IntStream.of(nums).parallel().sum();     System.out.println("结果为:" + sum2); }

          如图下所示:

          上面讲了响应式编程是什么:

          响应式编程(reactive programming)是一种基于数据流(data stream)和变化传递(propagation of change)的声明式(declarative)的编程范式

          也讲解了数据流/变化传递/声明式是什么意思,但说到响应式编程就离不开异步非阻塞

          从Spring官网介绍WebFlux的信息我们就可以发现 这样的字样,因为响应式编程它是异步的,也可以理解成变化传递它是异步执行的。

          如下图,合计的金额会受其他的金额影响(更新的过程是异步的):

          我们的JDK8 Stream流是同步的,它就不适合用于响应式编程(但基础的用法是需要懂的,因为响应式流编程都是操作嘛)

          而在JDK9 已经支持响应式流了,下面我们来看一下

          三、JDK9 Reactive

          响应式流的规范早已经被提出了:里面提到了:

          Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure   —–>http://www.reactive-streams.org/

          翻译再加点信息:

          响应式流(Reactive Streams)通过定义一组实体,接口和互操作方法,给出了实现异步非阻塞背压的标准。第三方遵循这个标准来实现具体的解决方案,常见的有Reactor,RxJava,Akka Streams,Ratpack等。

          规范里头实际上就是定义了四个接口:

          Java 平台直到 JDK 9才提供了对于Reactive的完整支持,JDK9也定义了上述提到的四个接口,在包上

          一个通用的流处理架构一般会是这样的(生产者产生数据,对数据进行中间处理,消费者拿到数据消费):

            到这里我们再看回响应式流的接口,我们应该就能懂了:

              在响应式流上提到了back pressure(背压)这么一个概念,其实非常好理解。在响应式流实现异步非阻塞是基于生产者和消费者模式的,而生产者消费者很容易出现的一个问题就是:生产者生产数据多了,就把消费者给压垮了

              而背压说白了就是:消费者能告诉生产者自己需要多少量的数据。这里就是Subscription接口所做的事。

              下面我们来看看JDK9接口的方法,或许就更加能理解上面所说的话了:

              3.1 看个例子

              代码中有大量的注释,我就不多BB了,建议直接复制跑一下看看:

              输出的结果如下:

              流程实际上非常简单的:

              参考资料:

                Java 8 的 Stream 主要关注在流的过滤,映射,合并,而  Reactive Stream 更进一层,侧重的是流的产生与消费,即流在生产与消费者之间的协调

                说白了就是:响应式流是异步非阻塞+流量控制的(可以告诉生产者自己需要多少的量/取消订阅关系)

                展望响应式编程的场景应用:

                比如一个日志监控系统,我们的前端页面将不再需要通过“命令式”的轮询的方式不断向服务器请求数据然后进行更新,而是在建立好通道之后,数据流从系统源源不断流向页面,从而展现实时的指标变化曲线; 再比如一个社交平台,朋友的动态、点赞和留言不是手动刷出来的,而是当后台数据变化的时候自动体现到界面上的。

                四、入门WebFlux

                扯了一大堆,终于回到WebFlux了。经过上面的基础,我们现在已经能够得出一些结论的了:

                  我们再回来看官网的图:

                   

                  4.1 简单体验WebFlux

                  Spring官方为了让我们更加快速/平滑到WebFlux上,之前SpringMVC那套都是支持的。也就是说:我们可以像使用SpringMVC一样使用着WebFlux

                  WebFlux使用的响应式流并不是用JDK9平台的,而是一个叫做Reactor响应式流库。所以,入门WebFlux其实更多是了解怎么使用Reactor的API,下面我们来看看

                  Reactor是一个响应式流,它也有对应的发布者( ),Reactor的发布者用两个类来表示:

                    而消费者则是Spring框架帮我们去完成

                    下面我们来看一个简单的例子(基于WebFlux环境构建):

                    首先,值得说明的是,我们构建WebFlux环境启动时,应用服务器默认是Netty的:

                    我们分别来访问一下SpringMVC的接口和WebFlux的接口,看一下有什么区别:

                    SpringMVC:

                    WebFlux:

                     

                    从调用者(浏览器)的角度而言,是感知不到有什么变化的,因为都是得等待5s才返回数据。但是,从服务端的日志我们可以看出,WebFlux是直接返回Mono对象的(而不是像SpringMVC一直同步阻塞5s,线程才返回)。

                    这正是WebFlux的好处:能够以固定的线程来处理高并发(充分发挥机器的性能)。

                    WebFlux还支持服务器推送(SSE - >Server Send Event),我们来看个例子:

                    效果就是每秒会给浏览器推送数据:

                    WebFlux我还没写完,这篇写了WebFlux支持SpringMVC那套注解来开发,下篇写写如何使用WebFlux另一种模式(Functional Endpoints)来开发以及一些常见的问题还需要补充一下~

                    小讯
                    上一篇 2025-05-08 12:35
                    下一篇 2025-04-26 20:48

                    相关推荐

                    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
                    如需转载请保留出处:https://51itzy.com/kjqy/190880.html