公司最近新项目选用了webFlux作为基础架构,也在缓慢的学习中。只因奈何相关API文档太少了,新版本的资料那就更少了,国内很多教程都是老版本的,只能是摸着石头过河。本系列的东西只是我个人鉴于文章之日的理解,肯定有不对的地方,如果您发现了,劳烦辛苦回复指出,先感谢。
程序员的危机
1.webflux完全拉低了程序员菜鸟和老鸟的差距,只要你用webflux写代码写出来的代码在性能上不会再有天壤之别了。目这是对传统程序员的一种冲击,工作年限可能真不是问题了。函数式流编程是未来!
2.传统应用架构师常用 切面 ,反射 在这里不好使了,很多花样都没法玩,该职位未来会向着 云生架构师的方向进化,让其在更宏观的眼界来工作,从大厂最近的招聘上也能看出有这个趋势了
3.在语法上,在使用flatmap这些流式api时 默认会使用final修饰变量,基本变量的操作强制会让你使用juc包下的atomic类型的,从编码层面就限制你使用锁机制,也就消除了死锁的问题
4.传统编码中的内存泄漏一直是个容易出现但是却很难定位得问题,并且内存泄漏一定是代码问题,webflux设计上则规避了这些问题。它不需要你明确得new对象了。前提只要你规范使用它的api。
5.线程是java服务器的稀缺资源,所以就要使用线程池配合限流保证服务可用,线程池合理的参数配置是很有学问的,使用webflux不用在考虑 限流,线程池这些,webflux帮你搞定,
Wenflux存在的问题
1.自动生成api文档页面,这个问题紧在route方式,spring自己提供了一个解决方案就是每个接口必须写测试用例,但是不是很优雅,目前还不知道有什么方式可以像使用swagger那样编辑,也可能是我还没接触到吧
2.因为反射和aop的问题,多数据源的问题还没有找到像传统项目中那种优雅的方式,后面的文章会放上找到的方式
3.流式编程代码的调试变得复杂,我们不能一行一行的调试了,开发中把日志加全一些吧
webflux 是什么?
Spring 5新加入的响应式流编程技术栈是其主打核心特性,最低Springbooot2.0,底层使用Netty,这个从搭建好项目启动日志中能看出来。
webflux的三个组件
1.Router Functions: 对标@Controller,@RequestMapping等标准的Spring MVC注解,提供一套函数式风格的API,用于创建Router,Handler和Filter。
2.WebFlux: 核心组件,协调上下游各个组件提供响应式编程支持。
3.Reactive Streams: 一种支持背压(Backpressure)的异步数据流处理标准,主流实现有RxJava和Reactor,Spring WebFlux默认集成的是Reactor,
值得一提的是,除了新的Router Functions接口,Spring WebFlux同时支持使用老的Spring MVC注解声明Reactive Controller。和传统的MVC Controller不同,Reactive Controller操作的是非阻塞的ServerHttpRequest和ServerHttpResponse,而不再是Spring MVC里的HttpServletRequest和HttpServletResponse
在路由方式的选择上 建议使用webflux的router风格,它比Reactive Controller的方式更符合函数编程的思想,在请求的链路上比Controller更快一些
下面的内容,入学者多体会
流编程是jdk1.8的新特性,webflux是在其基础思想上更高层的应用,StreamAPI网上学学吧,教程太多了,这里用生活中的例子帮你理解,先理解思想
1.在webflux的世界中 一切都是流,一个请求过来到返回是一个完整的流,中间是不能断的,执行了中断指令是就违背了webflux设计的本意
2.已南水北调为例,从南到北是一条线,国家已经从地图上画好了线,从哪到哪都明确标注了,施工时中间经过的各个地区每隔一段修建一个蓄水池(webflux中就是我们具体的业务处理了),逐级接力把水送到北方,但是这条线是不能改的,在webflux的设计中也是这样,千万千万不要让流中断
3. 国家在有南水北调这个想法时想把它实现,想象一下如果你是领导是不是 先设定方案、实地考察中途经过的地区、确定方案路线、组织各级政府做准备,为了能尽快实现目标最后国家一声令下各级政府开始同时施工,webflux也是这个思想。最后国家(spring)的命令就是webflux订阅(真正的开始执行),在命令没有下达之前 各级只是根据自己负责区域实际情况做准备并没有实际开工(可以想象是占位,webflux中 惰性求值),各级完成了自己的任务时,就报告给国家说我完成了(发射信号量),当所有各级政府都完成了,国家就发布公告说 南水北调已经完成请验收(spring数据汇总返回)。那么各级政府修建的河道成不成呢,那就让水在挨个地区修建的河道流动起来(对应webflux里每个下级需要上级返回的数据流),如果说中间有个地区放下了水闸,对不起你这是在抗命啊,水在到达目的地之前是不能被拦截在一个地方的(流是不能中断的),
总结一下一个请求进来到出去,中间不能执行(subscribe(),block())中断操作,理论上最后的订阅要交给Spring来帮我们订阅,也就是 请求从进来到返回,中间是不真正执行的,只有当Spring执行了订阅subscribe()以后才真正的开始执行
4.在入门写代码时 如果发现有方法没执行,找找代码中是不是没有吧流一级一级的返回
5.如果说 一个方法你有10步操作,你想在第4步骤执行subscribe,对不起 剩下的9个你也都加上吧,还是那句话 流是不能被中断的