Java應用伺服器前途堪憂?

infoq發表於2014-05-22

  Java應用伺服器曾經是企業級中介軟體市場中重要的組成部分,但是隨著輕量級微服務理念的發展以及雲端計算的快速普及,Java應用伺服器正在遭遇前所未有的挑戰。近日,來自adesso AG技術諮詢委員會的Eberhard Wolff分享了一份slide,提出了應用伺服器已死的觀點,Eberhard此前曾經在SpringSource擔任首席技術專家,而RedHat的Mark Little也在部落格上撰文,闡述了未來中介軟體平臺該如何發展。

  在Eberhard Wolff的slide中,首先分析了傳統的應用伺服器所面臨的問題,然後介紹了新的技術發展趨勢,如持續交付和微服務,對應用伺服器所帶來的衝擊。在Eberhard Wolff看來,傳統應用伺服器的作用主要包括以下四點:

  • 多個應用的容器;
  • 基礎設施;
  • 部署;
  • 監控。

  但是,在這四個方面,應用伺服器在提供強大支撐功能的同時,也有許多的不足。

  具體來講,如果在伺服器中部署多個應用,那麼這些應用會通過ClassLoader機制實現隔離,但這還是不夠的,而且很容易導致難以解決的問題。因為作業系統是以程式為單位進行資源分配的,所以應用伺服器無法實現針對應用進行記憶體、CPU以及檔案系統的隔離。應用之間在執行期還是會互相影響,除非Java的虛擬機器變成作業系統,否則難以實現完美的隔離。所以,理想的方案是使應用伺服器作為單個應用的容器,而不是同時執行多個應用。

  在基礎設施方面,應用伺服器提供了兩階段提交、網路/執行緒以及API等功能。不過,作者認為兩階段提交會降低應用的效率,並且不能保證一定會成功。在分散式系統中,應該限制使用,因為會影響到可擴充套件性。應用伺服器一般還會提供網路以及執行緒的基礎設施,支援執行緒池和連線池,不過這些可以在應用內部來實現。作為基礎設施所提供的API,如EJB、CDI、JPA以及JSF等,在帶來便利的同時,往往會導致與應用伺服器的版本關聯在一起,應用會依賴於應用伺服器,在新的伺服器推出之前,我們無法使用新的API,除此之外,還可能會出現版本的衝突。應用有時還會將其依賴的庫置於應用伺服器之中,這樣的話,就形成了應用與伺服器之間的迴圈依賴,如下圖所示。可以說伺服器變成了應用的一部分。

  在部署方面,應用伺服器支援多種部署格式,如WAR、EAR以及JAR等等,但是這些格式都無法定義應用的外部依賴,如應用伺服器的版本、資料庫等。通常在這個過程中,會使用到deb或RPM這樣完全不同的工具。應用伺服器的配置甚至比應用本身的配置還複雜,相對於使用Puppet/Chef編寫的自動化指令碼,應用伺服器的配置過於繁瑣。對於持續交付來講,我們必須要有大量的部署過程,因此需要簡化部署,並且要使用更為通用的工具。

  應用伺服器的監控功能一般是通過JMX提供的,可以使用SNMP等協議進行整合,但是問題同樣在於完全不同的工具鏈(tool chain)。在這個方面出現了一些新的技術和趨勢,如Logs+Logstash/Kibana或Splunk、基於REST或編寫指令碼實現監控的功能。

  作者稍後提到了微服務的理念,基於這種理念所構建的軟體是由服務組成的,服務會具有一定的業務含義,服務的(重)部署可以獨立進行,而不是作為一個龐大的整體來進行,服務之間可以通過像REST這樣的方式來進行互動。服務可能會有不同的非功能性需求,所以會需要不同的基礎設施,如非同步、傳統的Servlet、Batches、Map/Reduce等,而應用伺服器只能提供一種基礎設施。

  基於這種模式,應用能夠以JAR檔案的方式進行建立,在這個JAR中包含一個Main類,我們可以自定義基礎設施,如HTTP伺服器或Batch。在監控和部署方面,它依賴於標準的部署和監控工具,提供基於REST的監控URL,並且會分析評估日誌檔案。這種方式能夠帶來一系列的好處,因為它只是一個JAR包,所以更易於部署,我們可以在IDE中除錯執行,驗收測試會更為容易,並且可以確保基礎設施與應用是相容的。作者最後提到了相關的技術,如Spring BootDropwizard

  其實,關於應用伺服器已死的觀點,在雲理念剛剛普及的時代就曾經出現過,如來自Forrester的首席分析師Mike Gualtieri在2011年就曾經撰文表示應用伺服器的泡沫會破滅並建議不要再將金錢花費在WebLogic、WebSphere以及JBoss Application Servers上面了。當時,RedHat的Mark Little曾經專門就這種觀點進行過反駁。最近,Mark Little恰好寫了一篇文章闡述中介軟體平臺的未來趨勢,在這篇文章中,作者認為我們需要新的框架和模型來構建應用,可適應的中介軟體平臺應該具有的特性包括:

  • 能適應環境的變化,自動監控和管理;
  • 靈活的執行緒模型;
  • 所有的應用和服務可以根據需要動態新增;
  • 元件庫;
  • 跟蹤物件和服務的依賴,以便於遷移時,相關的服務和物件能夠保持相容。

  Mark Little和Eberhard Wolff都提到了新的程式設計和部署模式,Parallel Universe公司的部落格上,最近也連續發表了三篇文章介紹Java的發展趨勢,其中有一篇專門介紹現代Java Web應用的開發與部署,作者也提及了這種新的部署理念。

  現在就說應用伺服器已死可能為時尚早,但是服務化、分散式是應用的發展方向,這會對傳統應用伺服器的部署、監控等功能提出挑戰。關於這一問題,如果您有新的見解,歡迎與我們分享。

相關文章