引言:上一节已经简单介绍webflux的一些基本概念,本章继续学习webflux的原理和实战方面的东西:mysql
Spring WebFlux架构:react
note:注意理解上面这张图。下面解释引用百度web
1)服务端技术栈 Spring提供了完整的支持响应式的服务端技术栈。 如上图所示,左侧为基于spring-webmvc的技术栈,右侧为基于spring-webflux的技术栈, Spring WebFlux是基于响应式流的,所以能够用来创建异步的、非阻塞的、事件驱动的服务。它采用Reactor做为首选的响应式流的实现库,不过也提供了对RxJava的支持。 因为响应式编程的特性,Spring WebFlux和Reactor底层须要支持异步的运行环境,好比Netty和Undertow;也能够运行在支持异步I/O的Servlet 3.1的容器之上,好比Tomcat(8.0.23及以上)和Jetty(9.0.4及以上)。 从图的纵向上看,spring-webflux上层支持两种开发模式: 相似于Spring WebMVC的基于注解(@Controller、@RequestMapping)的开发模式; Java 8 lambda 风格的函数式开发模式。 Spring WebFlux也支持响应式的Websocket服务端开发。 由此看来,Spring WebFlux与Vert.x有一些相通之处,都是创建在非阻塞的异步I/O和事件驱动的基础之上的。 2)响应式Http客户端 此外,Spring WebFlux也提供了一个响应式的Http客户端API WebClient。它能够用函数式的方式异步非阻塞地发起Http请求并处理响应。其底层也是由Netty提供的异步支持。 咱们能够把WebClient看作是响应式的RestTemplate,与后者相比,前者: 是非阻塞的,能够基于少许的线程处理更高的并发; 可使用Java 8 lambda表达式; 支持异步的同时也能够支持同步的使用方式; 能够经过数据流的方式与服务端进行双向通讯。 固然,与服务端对应的,Spring WebFlux也提供了响应式的Websocket客户端API。
根据上面原理图 webflux的实现有两版,一是基于springmvc,一种基于响应式流的,,下面我来逐一介绍一下:(须要学习的尽可能跟着个人步骤走,我会把出错的地方标出)spring
基础部分搭建(无论哪一种实现,都须要项目准备工做):sql
第一步:引入项目依赖,我后期会演示mongodb的操做,此次一下把依赖都引入:mongodb
第二步:把allpication.yml 的mongodb配置上,编程
从webflux开始,个人demo采用yaml语法的配置文件来说解,前面采用的都是properties文件,是为了你们方便入门,后期我采用application.yml文件,
补充:配置文件的优先顺序: 项目路径下/conf/ > 项目路径下/ > /resources/conf/ > resources/ ( properties后缀优先 yml文件的加载顺序)
1>> 只是为了测试,直接写测试控制器了,实战中应该从Handler中获取tomcat
2>> 启动springboot项目:springboot
是netty启动,上节介绍过,webflux是响应式框架,默认是netty启动(能够改tomcat toncat8之后已经支持响应式了)服务器
请求测试以下:
Netty是一套异步的、事件驱动的网络应用程序框架和工具,可以开发高性能、高可靠性的网络服务器和客户端程序,所以与一样是异步的、事件驱动的响应式编程范式吻合。
在Java 7推出异步I/O库,以及Servlet3.1增长了对异步I/O的支持以后,Tomcat等Servlet容器也随后开始支持异步I/O,而后Spring WebMVC也增长了对Reactor库的支持,
因此上边若是不是将替换为,而是增长的依赖的话,仍然能够用注解的方式开发基于Tomcat的响应式应用。spring-boot-starter-webspring-boot-starter-WebFluxreactor-core
注解式就简单介绍一下,重点在响应式开发,webflux是响应式框架,我会着重介绍一下响应式开发的步骤。注解式只是spring团队为了更好的迁移而提供给你们的,由于咱们都是用上面那种开发方式开发代码
响应式开发主要在handler和route上,handler至关于咱们原来使用的 server | controller 官方定义是处理,就是写逻辑代码的地方,而route至关于RequestMapping() 至关于配置映射的地方,官方定义是路由
2.1>测试handler以下: (方法应该从数据获取数据进行返回,我只是作测试,就用打印时间代替了)
2.2> 编辑route
2.3>启动,测试:
在WebFlux中,请求和响应再也不是WebMVC中的ServletRequest和ServletResponse,而是ServerRequest和ServerResponse。后者是在响应式编程中使用的接口,它们提供了对非阻塞和回压特性的支持,以及Http消息体与响应式类型Mono和Flux的转换方法。
注意:到这,webflux的响应式开发配置基本搭建完毕,后面会继续介绍mongodb的操做
webflux不支持mysql, 使用mongodb来进行演示 (mongodb配置已经在准备时配置进去了)
第一步:建立实体User
在这个mongodb的启动后,会自动在对应的mongodb中建立一个user集合,名字就是实体类名称小写。
第二步:dao实现:
note:与非响应式Spring Data的CrudReposity
对应的,响应式的Spring Data也提供了相应的Repository库:ReactiveCrudReposity
,固然,咱们也可使用它的子接口ReactiveMongoRepository
。
ReactiveCrudRepository
的泛型分别是User
和ID
的类型;
第三步:UserHandler(逻辑处理代码)
第四步:webFlux的注解实现controller: 方便你们上手 ( 响应式后期再说:)
最后启动测试便可:
截图不放了。下面我介绍几个问题点:
1> 怎么验证响应式流:
启动测试就能够发现查询所用是一个一个出来的,而不是一下返回。
异步 阻塞的概念还须要你们理解,这是服务端大效果演示,还有一种客户端的演示,待下节介绍