springboot 2.0 教程-11-WebFlux框架体验

阅读原文:https://blog.bywind.cn/articles/2018/11/28/1543373589258.html
****:https://www.bilibili.com/video/av35595465
课程源码:https://github.com/ibywind/springboot-learn
关注公众号 查看更多技术干货
还可加群 , 众多好基友在等你
springboot 2.0 教程-11-WebFlux框架体验

springboot 书籍 PDF 下载

扫描关注上方公众号
回复关键字 boot
就可以下载这本书了
书籍的排版很好的,我自己也在看.大家可以一起交流哦
springboot 2.0 教程-11-WebFlux框架体验

写在前面

hello 大家好

欢迎大家收看御风大世界

本次课是

springboot 系列教程第11课

我将为大家演示

springboot WebFlux框架集成

webflux 是什么?

springboot 2.0 教程-11-WebFlux框架体验

我们知道传统的Web框架,比如说:struts2,springmvc等都是基于Servlet API与Servlet容器基础之上运行的,在Servlet3.1之后才有了异步非阻塞的支持。而WebFlux是一个典型非阻塞异步的框架,它的核心是基于Reactor的相关API实现的。相对于传统的web框架来说,它可以运行在诸如Netty,Undertow及支持Servlet3.1的容器上,因此它的运行环境的可选择行要比传统web框架多的多。

  根据官方的说法,webflux主要在如下两方面体现出独有的优势:

  1)非阻塞式

    其实在servlet3.1提供了非阻塞的API,WebFlux提供了一种比其更完美的解决方案。使用非阻塞的方式可以利用较小的线程或硬件资源来处理并发进而提高其可伸缩性

  2) 函数式编程端点

老生常谈的编程方式了,Spring5必须让你使用java8,那么函数式编程就是java8重要的特点之一,而WebFlux支持函数式编程来定义路由端点处理请求。

MVC VS webflux

springboot 2.0 教程-11-WebFlux框架体验

它们都可以用注解式编程模型,都可以运行在tomcat,jetty,undertow等servlet容器当中。但是SpringMVC采用命令式编程方式,代码一句一句的执行,这样更有利于理解与调试,而WebFlux则是基于异步响应式编程,对于初次接触的码农们来说会不习惯。对于这两种框架官方给出的建议是:

  1)如果原先使用用SpringMVC好好的话,则没必要迁移。因为命令式编程是编写、理解和调试代码的最简单方法。因为老项目的类库与代码都是基于阻塞式的。

  2)如果你的团队打算使用非阻塞式web框架,WebFlux确实是一个可考虑的技术路线,而且它支持类似于SpringMvc的Annotation的方式实现编程模式,也可以在微服务架构中让WebMvc与WebFlux共用Controller,切换使用的成本相当小

  3)在SpringMVC项目里如果需要调用远程服务的话,你不妨考虑一下使用WebClient,而且方法的返回值可以考虑使用Reactive Type类型的,当每个调用的延迟时间越长,或者调用之间的相互依赖程度越高,其好处就越大

  我个人意见是:官网明确指出,SpringWebFlux并不是让你的程序运行的更快(相对于SpringMVC来说),而是在有限的资源下提高系统的伸缩性,因此当你对响应式编程非常熟练的情况下并将其应用于新的系统中,还是值得考虑的,否则还是老老实实的使用WebMVC吧

springboot 集成webflux

springboot 集成webflux其实很简单

而且 我们熟悉spirngmvc的 同学其实不必太多的学习成本

就可以很快的迁移到webflux中

我们这里演示从一个新的项目开始吧

首先我们依赖的 web 模块

然后我们演示 迁移到webflux

如果你直接想用webflux 可以按照下图直接引入

springboot 2.0 教程-11-WebFlux框架体验

我们首先使用传统的springmvc

springboot 2.0 教程-11-WebFlux框架体验

springboot 2.0 教程-11-WebFlux框架体验

这个过程很简单

访问也是通畅的

现在我们把现有的 springmvc 改造成 webflux 的模式

pom 很简单, 刚才的web改成webflux就可以了

如果你的项目中 同时存在mvc和webflux的话

springboot会优先路由到mvc 所以我们就直接改变了

springboot 2.0 教程-11-WebFlux框架体验

然后我们什么都不做 直接启动项目

我们可以看到我们的项目启动在 netty服务器上面 而不是 tomcat

端口默认是 8080

springboot 2.0 教程-11-WebFlux框架体验

接着我们 访问 路径

springboot 2.0 教程-11-WebFlux框架体验

我们得到了相同的结果

springmvc 迁移到 webflux 只需要修改下依赖

其他的地方你不需要做任何的变更

学习成本减到最低

给spring 一个赞

虽然我们只修改了少量的代码,但是其实这个简单的项目已经脱胎换骨了。整个技术栈从命令式的、同步阻塞的【spring-webmvc + servlet + Tomcat】变成了响应式的、异步非阻塞的【spring-webflux + Reactor + Netty】。

同时在写法上面

你可以选择继续沿用 springmvc的那一套编程范式

同时也可以

选择如下的编程模式

handler 和 router 模式

handler 其实就是controller中具体的方法

而 router 其实即使 requestmapping 定义一个URI

大家可以参看我的视频

springboot 2.0 教程-11-WebFlux框架体验

springboot 2.0 教程-11-WebFlux框架体验

然后 我们产出的话 需要 使用 Mono(处理单个对象或void) 和 Flux (处理集合对象)

并且可以使用 stream 的模式 降低 数据量大造成的服务器压力和传输阻塞

这个可以参看我视频中的例子

一点感悟

  1. 容易接入 , springmvc 不用学 就可以迁移过来

  2. 结合netty , 异步非阻塞 事件驱动

  3. java8 新特性 lambda表达式 stream模型等

  4. 因为不支持stream的 数据库事务 所以 mysql 目前不支持 reactive, 只有 mongo , redis 等 Nosql 数据库 支持reactive

  5. 客户端 webclient,配合起来更加简便

结束语

如果大家对于这里比较感兴趣的话

可以去B站查看我的视频讲解

https://space.bilibili.com/193580090/#/

或者是在 github下载源码

https://github.com/ibywind/springboot-learn