SpringBoot2.0之WebFlux解析及实战

SpringBoot我是从1.2开始用的,我仿佛停留在1.5刚出来,支持了动态修改日志级别的时候,可突然之间2.0就出来了,貌似只有短短一年半的时间,突然感觉到了危机感,仿佛自己马上就要被淘汰了,在经过学习之后,将自己的项目demo和我对SpringBoot2.0的理解,分享给大家! 如果有错误的地方,欢迎留言指出,最后谢谢各位,观看!

小编学习的途径是先直接到官网看看,于是看到了最明显的区别就是下图
SpringBoot2.0之WebFlux解析及实战_第1张图片
图先放这里,先不着急,先看下,有一个印象,后面会说到。


先说一下官方的SpringBoot2.0新特性描述

SpringBoot2.0新特性

  1. 编程语言Java8+,和当前火爆的Kotlin
  2. 底层框架Spring Framwork 5.0.x
  3. 全新特性Web Flux(小编认为我们学习SpringBoot2.0就是学习这个)

我们分析下2.0的新特性为什么编程语言要从Java8开始呢?

  • 一个重要的原因就是使用Java8的Lambda表达式和Stream流处理
  • 包括Spring Framwork 5.0.x也是要用到Java8的新特性.

当我们对SpringBoot2.0的新特性有一个认识的时候,再来看开头的第一张图片
上面开篇截取Spring.io官网的图片。我们就能对SpringBoot1.0和2.0在心里有一个判断

  • SpringBoot1.0是仅支持Servlet Containers->Servlet API属于传统方式
  • SpringBoot2.0在支持1.0的特性上,同时添加了一个新特性就是WebFlux,可以使用Netty及Servlet3.1作为容器,基于 Reactive Streams 流处理。

当读到这里可能就有点懵了,Netty和Servlet3.1是一个什么鬼? Netty是什么先不介绍,先说Servlet3.1在举例的时候,会提到Netty。

那么我们在分析Servlet3.0之前和3.0的区别?

  • 3.0之前Servlet 线程会一直阻塞,只有当业务处理完成并返回后时结束 Servlet线程。
  • 3.0规范其中一个新特性是异步处理支持,即是在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,在不生成响应的情况下返回至容器

这样说可能大家还不太容易理解,我们来举一个例子

eg: 我们假设,设置tomcat最大线程为200,遇到200个非常耗时的请求

  1. 那么当有200个线程同时并发在处理,那么当来201个请求的时候,就已经处理不了,因为所有的线程都阻塞了。这是3.0之前的处理情况
  2. 而3.0之后异步处理是怎样处理呢?学过Netty通信框架的同学会比较容易理解一点,Servlet3.0类似于Netty一样就一个boss线程池和work线程池,boss线程只负责接收请求,work线程只负责处理逻辑。那么servlet3.0规范中,这200个线程只负责接收请求,然后每个线程将收到的请求,转发到work线程去处理。因为这200个线程只负责接收请求,并不负责处理逻辑,故不会被阻塞,而影响通信,就算处理非常耗时,也只是对work线程形成阻塞,所以当再来请求,同样可以处理,其主要应用场景是针对业务处理较耗时的情况可以减少服务器资源的占用,并且提高并发处理速度。

好了,当你已经读到这里,相信已经对SpringBoot1.0和SpringBoot2.0有一个比较清晰的认识了(当用过Netty通信框架类的童鞋一定是非常清晰的,如果还不清晰,就要补补课了),所以我们不得不说SpringBoot2.0的性能一定是比1.0有所提升的。不过各有所爱,企业具体技术选型还要看业务需求,不能盲目追求新技术,毕竟新技术还不太稳定,没有被大规模的实践。好了,理论的知识就先讲到这里,开始实战编码吧。

项目实战

通过上面的讲解,我们对其有了一个简单的认识,现在开始跟着我实战吧 !
SpringBoot2.0之WebFlux解析及实战_第2张图片
SpringBoot2.0之WebFlux解析及实战请点击此处输入图片描述

在做项目实战的时候,我们要对下面两个问题有所了解!当这两个问题清楚后,实战就异常简单了

1. 我们知道SpringMVC是通过@Controller和@RequestMapping来定义路由的那么WebFlux是怎么定义路由的?

我们看上图(下面的这两个区别要注意,项目中会遇到)
- 基于 Spring MVC 注解 @Controller 等
- 基于 Functional 函数式路由是 RouterFunctions

2. Flux和Mono分别是什么,在小编看来Flux和Mono都是一个数据的载体,不同的是

  • Flux 一种集合(0,n)
  • Mono 一个实体包装(0,1)
为了代码的美观,小编在这里直接上图,因为头条不支持markdown,所以就直接看图吧

启动时候添加测试数据
SpringBoot2.0之WebFlux解析及实战_第3张图片

编写业务处理层
SpringBoot2.0之WebFlux解析及实战_第4张图片

编写路由层
SpringBoot2.0之WebFlux解析及实战_第5张图片

如果想获取源码的同学,请点击关注小编,头条(软件编程指南),并私信发送 SpringBoot2.0 获取项目地址,最后再次谢谢您的阅读,小编会每天分享一点小知识,及项目实战笔记,欢迎您的关注 !

你可能感兴趣的:(SpringBoot)