Modern Web Programming 学习总结与思考

1. Tomcat & Netty 的一些时间线与重要特性

  • Tomcat 1999年首发,实现了Servlet2.2规范,同步阻塞servlet模型.

  • 2002年2月, J2SE1.4发布,其中提出了Non-Blocking IO模型,后续被称为NIO,其引入了一套基于以Selector等概念的非阻塞模型。读写方式从面向流变化为面向缓冲区【但是应用程序任然会参与IO读写,这部分仍然阻塞】

  • 2009年10月,J2EE6发布,其中包含Sevlet3.0规范,其中Servlet3.0中实现了Servlet的Request接受线程组和工作线程组的分离,极大的提升了性能。

  • 2011年7月,J2SE1.7发布,其中NIO特性升级到NIO2.0,其中:【但是应用程序任然会参与IO读写,这部分仍然阻塞】特性得到提升,IO操作交由操作系统,在添加ReaderListener来监听操作系统的读写时间,至此,NIO的 asynchronouse non-blocking 模型基本进化到位。

  • 2013年5月,J2EE7发布,其中包含Servlet3.1规范,Servlet3.1规范中进一步基于J2SE1.7中的理念把IO读写这一部分交由操作系统完成,至此,Sevlet模型基本完成了大部分目前的特性。

  • 2006年,韩国人Trustin Lee创立Mina项目,对标与未来的NIO版本Tomcat,其特性是简化基于NIO模型的网络层通信架构,基于事件驱动,相对而言Tomcat在2011年7.X版本才支持Servlet3.0规范,Mina项目还是很早的一个高性能Web框架+容器的。

  • 2009年,Trustin Lee创立Netty项目,其早期架构基本等同于Mina,后Lee离开回到韩国投入Line公司,Netty项目由Norman(Netty In Action)Lead。由于Netty的良好性能以及相对NIO而言更加简单的模型,在未来的10年内作为网络抽象层被各个应用框架所广泛引用,如WebFlux,Lettuce,Cassandra,Vert.X,Spark2.0等等。

介于以上的介绍,作出以下横坐标根据时间大致画出的时间图,可以看出基于Mina-Netty这一脉传承的事件驱动的高性能网络层框架是走的很远很早的。

Modern Web Programming 学习总结与思考

2.Servlet Stack VS Reactive Stack 演变历史及对比

2.1 Servlet Stack 演变历史


  • 2002年前后,Web开发基本离不开J2EE & EJB,Rod Johnson提出基于依赖注入的概念来构建企业级服务,后创立interface21框架,即Spring前身,后转成Spring。

  • 2004年,Spring1.0开始发布,后续的十几年,Java企业级开发基本从J2EE & EJB逐步转移到Spring生态中。

  • Spring Framework本身包含Core/Data Access/Integration/Web Servlet/Iangague等模块,后续除了Spring Framework本身,Spring生态陆续从各个层面衍生出企业级项目构建的各个层级的应用框架,如Spring Data/Spring Batch等等,目前总的在Spring体系下基本演化向3个大方向:Spring Framework,SpringBoot,SpringCloud,分别面对于核心Web框架,快速构建服务,微服务/集群。

  • 我们目前使用的主流操作基本是Springboot(内含Tomcat) + 对应Spring组件来完成Spring全家桶业务开发+基础架构支撑。

  • 2017年9月Spring发布Spring Framework5.0,其中引入了平行Reactive Stack,预示着Servlet Stack在未来将退出历史舞台。


2.2.1 Reactive Stack 演变历史 之 Vert.X


  • 2011年,Tim Fox创建Vert.X项目,最早叫做Node.X,是Node.js的启发产物,其实Actor Model的一个实现,但是又不仅仅局限于Actor Model,其是建立于Netty框架之上的应用层框架。其官网申明遵循响应式宣言。

  • Vert.X是致力于运行在JVM上的跨语言项目,其一开始实现于Scala版本,后又实现了Java版本,核心是异步+非阻塞,身后是Reactive Streams & Netty的影子。

  • Vert.X Java版本始于2015年,目前对于各个应用模块均已较成熟,而且完成了几个大版本的更迭。

  • Vert.X是应用层面的大一统框架,其包含了各个层面的模块,并且每个模块都是纯异步实现,俗称“一捅到底”架构。其Web,数据接入层,鉴权,应用层,微服务,服务总线等等都有标准的模块。如下截图所示

Modern Web Programming 学习总结与思考

2.2.2 Reactive Stack演变历史之 Spring


  • 相对于其他应用项目的异步非阻塞进度,Spring的响应速度总体是缓慢的。整个Spring生态闭环目前还做不到完全的“一捅到底”纯异步架构。目前各个模块组件基本起步于2015年以后。

  • Lettuce/Spring Date Reactive 启动与2016年,Spring Framework5/WebFlux发布于2017年,Spring R2DBC成立于2018年,等等。

Modern Web Programming 学习总结与思考

2.3 Spring Reactive Stack 与 Vert.X 对比思考

根据目前对Spring以及Vert.X的理解,做了一下一张对比图如下,可以发现:

Modern Web Programming 学习总结与思考

  • 短时间的未来,高性能的应用框架主要围绕两点:Asynchronous(异步) + Non-Blocking(非阻塞),并且形成一套便于理解的标准整体解决方案(类型Spring全家桶,SpringCloud)。从以上总结的图中,基本可以总结出来,本质可能还是围绕“响应式宣言”来构建系统/生态。

  • 从Spring Framework 5.0/Spring Boot2.0.0开始,我们可以发现Spring生态在整体上开始向Reactive Stack倾斜,拥有了平行Stack,根据Spring One 2018大会,未来Spring是会整体废弃Servlet Stack这一套技术栈的。

  • Vert.X没有历史包袱,所有模块都是纯异步的,Spring目前Data Access层MySQL是无法实现异步的,R2DBC项目正致力解决这个问题。

  • 在微服务领域,Vert.X也是全异步,而Spring Cloud整个体系目前还没有清晰的规划,没有所谓明确的Reactive Stack,其引入的各个模块也是有的基于Reactive Stack(Netflix),有的也不是(Spring Cloud Task),其需要一个明确的规划。

  • 可以预见的未来几年,Spring可能会像Vert.X一样(当然也可以看出来现在Spring就是在学习类似的Reactive Stack应用框架),形成自己的Reactive Stack。

  • 高性能高并发的应用框架发展之路,无论是Java,还是Spring,都在积极的向其他语言类似Node,Scala,C#等语言以及对应的框架学习。



上一篇:为什么说swift是面向协议编程--草稿


下一篇:Reactive Stack