Spring 5(七)Webflux
七.Webflux
1.基本概念
SpringWebflux 介绍
是 Spring5 添加新的模块,用于 web 开发的,功能 Spring MVC 类似的,Webflux 使用当前一种比较流程响应式编程出现的框架。
使用传统 web 框架,比如 SpringMVC,这些基于 Servlet 容器,Webflux 是一种异步非阻塞的框架,异步非阻塞的框架在 Servlet3.1 以后才支持核心是基于 Reactor 的相关 API 实现的
解释什么是异步非阻塞
异步和同步
非阻塞和阻塞
上面都是针对对象不一样
异步和同步针对调用者,调用者发送请求,如果等着对方回应之后才去做其他事情就是同步 如果发送请求之后不等着对方回应就去做其他事情就是异步
阻塞和非阻塞针对被调用者,被调用者受到请求之后,做完请求任务之后才给出反馈就是阻塞,受到请求之后马上给出反馈然后再去做事情就是非阻塞
Webflux 特点
第一 非阻塞式:在有限资源下,提高系统吞吐量和伸缩性,以 Reactor 为基础实现响应式编程
第二 函数式编程:Spring5 框架基于 java8,Spring5 框架基于 java8,Webflux 使用 Java8 函数式编程方式实现路由请求
比较 Spring MVC
第一两个框架都可以使用注解方式,都运行在 Tomcat 等容器第二 SpringMVC 采用命令式编程,Webflux 采用异步响应式编程
2.响应式编程
响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播电子表格程序就是响应式编程的一个例子。单元格可以包含字面值或类似"=B1+C"的公式,而包含公式的单元格的值会依据其他单元格的值的变化而变化。
Java8 及其之前版本
提供的观察者模式两个类 Observer 和 Observable
3.Reactor 实现
响应式编程操作中,Reactor 是满足 Reactive 规范框架
Reactor 有两个核心类,Mono 和 Flux,这两个类实现接口 Publisher,提供丰富操作符。FIux 对象实现发布者,返回 N 个元素;Moo 实现发布者,返回 0 或者 1 个元素
Flux 和 Mono 都是数据流的发布者,使用 Flux 和 Mono 都可以发出三种数据信号:元素值,错误信号,完成信号,错误信号和完成信号都代表终止信号,终止信号用于告诉订阅者数据流结束了
代码演示 Flux 和 Mono
第一步 引入依赖
第二步 编程代码
三种信号特点
错误信号和完成信号都是终止信号,不能共存的
如果没有发送任何元素值,而是直接发送错误或者完成信号,表示是空数据流
如果没有错误信号,没有完成信号,表示是无限数据流
调用 just 或者其他方法只是声明数据流,数据流并没有发出,只有进行订阅之后才会触发数据流,不订阅什么都不会发生的
操作符
对数据流进行一道道操作,成为操作符,比如工厂流水线
第一 map 元素映射为新元素
第二 flatMap 元素映射为流
把每个元素转换流,把转换之后多个流合并大的流
4.Spring Webflux 执行流程和核心 API
SpringWebflux 基于 Reactor,默认使用容器是 Netty,Netty 是高性能的 NIO 框架,异步非阻塞的框架
Netty
BIO
NIO
SpringWebflux 执行过程和 SpringMVC 相似的
SpringWebflux 核心控制器 DispatchHandler,实现接口 WebHandler
接口 WebHandler 有一个方法
SpringWebflux 里面 DispatcherHandler,负责请求的处理
HandlerMapping:请求查询到处理的方法
HandlerAdapter:真正负责请求处理
HandlerResultHandler:响应结果处理
SpringWebflux 实现函数式编程,两个接口:RouterFunction(路由处理)和 HandlerFunction(处理函数).
5.基于注解编程模型
使用注解编程模型方式,和之前 Spring MVC 使用相似的,只需要把相关依赖配置到项目中,Spring Boot 自动配置相关运行容器,默认情况下使用 Netty 服务器
第一步创建 Spring Boot 工程,引入 Webflux 依赖
第二步 配置启动的端口号
第三步 创建包和相关类
接口实现类
创捷 controller
说明
SpringMVC 方式实现,同步阻塞的方式,基于 SpringMVC+Servlet+TomcatSpringWebflux 方式实现,异步非阻塞方式,基于 SpringWebflux+Reactor+Netty
6.基于函数式编程模型
在使用函数式编程模型操作时候,需要自己初始化服务器
基于函数式编程模型时候,有两个核心接口:RouterFunction(实现路由功能,请求转发给对应的 handler)和 HandlerFunction(处理请求生成响应的函数).核心任务定义这两个函数式接口的实现并且启动需要的服务器
SpringWebflux 请求和响应不再是 ServletRequest 和 ServletResponse,而是 ServlerRequest 和 ServerResponse
6.1Handler
第一步 把注解编程模型工程复制一份
第二步 创建 Handler(具体实现方法)
6.2Router 和服务器
第三步 初始化服务器,编写 Router
创建服务器完成适配
最终调用
6.3WebClient
版权声明: 本文为 InfoQ 作者【浅辄】的原创文章。
原文链接:【http://xie.infoq.cn/article/b82a20908108fa1d5786f3fb1】。文章转载请联系作者。
评论