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這一脈傳承的事件驅動的高性能網絡層框架是走的很遠很早的。

Web Container RoadMap.png

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,數據接入層,鑑權,應用層,微服務,服務總線等等都有標準的模塊。如下截圖所示

Vertx——Module.png

2.2.2 Reactive Stack演變歷史之 Spring


  • 相對於其他應用項目的異步非阻塞進度,Spring的響應速度總體是緩慢的。整個Spring生態閉環目前還做不到完全的“一捅到底”純異步架構。目前各個模塊組件基本起步於2015年以後。

  • Lettuce/Spring Date Reactive 啓動與2016年,Spring Framework5/WebFlux發佈於2017年,Spring R2DBC成立於2018年,等等。

Springboot Stack.png

2.3 Spring Reactive Stack 與 Vert.X 對比思考

根據目前對Spring以及Vert.X的理解,做了一下一張對比圖如下,可以發現:

Servlet_Stack_VS_Reactive_Stack.png

  • 短時間的未來,高性能的應用框架主要圍繞兩點: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#等語言以及對應的框架學習。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章