佚名 發(fā)表于:14年07月07日 20:50 [轉(zhuǎn)載] DOIT.com.cn
Java應用服務器前途堪憂?
Java應用服務器曾經(jīng)是企業(yè)級中間件市場中重要的組成部分,但是隨著輕量級微服務理念的發(fā)展以及云計算的快速普及,Java應用服務器正在遭遇前所未有的挑戰(zhàn)。近日,來自adesso AG技術(shù)咨詢委員會的Eberhard Wolff分享了一份slide,提出了應用服務器已死的觀點,Eberhard此前曾經(jīng)在SpringSource擔任首席技術(shù)專家,而RedHat的Mark Little也在博客上撰文,闡述了未來中間件平臺該如何發(fā)展。
在Eberhard Wolff的slide中,首先分析了傳統(tǒng)的應用服務器所面臨的問題,然后介紹了新的技術(shù)發(fā)展趨勢,如持續(xù)交付和微服務,對應用服務器所帶來的沖擊。在Eberhard Wolff看來,傳統(tǒng)應用服務器的作用主要包括以下四點:
多個應用的容器;
基礎設施;
部署;
監(jiān)控。
但是,在這四個方面,應用服務器在提供強大支撐功能的同時,也有許多的不足。
具體來講,如果在服務器中部署多個應用,那么這些應用會通過ClassLoader機制實現(xiàn)隔離,但這還是不夠的,而且很容易導致難以解決的問題。因為操作系統(tǒng)是以進程為單位進行資源分配的,所以應用服務器無法實現(xiàn)針對應用進行內(nèi)存、CPU以及文件系統(tǒng)的隔離。應用之間在運行期還是會互相影響,除非Java的虛擬機變成操作系統(tǒng),否則難以實現(xiàn)完美的隔離。所以,理想的方案是使應用服務器作為單個應用的容器,而不是同時運行多個應用。
在基礎設施方面,應用服務器提供了兩階段提交、網(wǎng)絡/線程以及API等功能。不過,作者認為兩階段提交會降低應用的效率,并且不能保證一定會成功。在分布式系統(tǒng)中,應該限制使用,因為會影響到可擴展性。應用服務器一般還會提供網(wǎng)絡以及線程的基礎設施,支持線程池和連接池,不過這些可以在應用內(nèi)部來實現(xiàn)。作為基礎設施所提供的API,如EJB、CDI、JPA以及JSF等,在帶來便利的同時,往往會導致與應用服務器的版本關(guān)聯(lián)在一起,應用會依賴于應用服務器,在新的服務器推出之前,我們無法使用新的API,除此之外,還可能會出現(xiàn)版本的沖突。應用有時還會將其依賴的庫置于應用服務器之中,這樣的話,就形成了應用與服務器之間的循環(huán)依賴,如下圖所示?梢哉f服務器變成了應用的一部分。
在部署方面,應用服務器支持多種部署格式,如WAR、EAR以及JAR等等,但是這些格式都無法定義應用的外部依賴,如應用服務器的版本、數(shù)據(jù)庫等。通常在這個過程中,會使用到deb或RPM這樣完全不同的工具。應用服務器的配置甚至比應用本身的配置還復雜,相對于使用Puppet/Chef編寫的自動化腳本,應用服務器的配置過于繁瑣。對于持續(xù)交付來講,我們必須要有大量的部署過程,因此需要簡化部署,并且要使用更為通用的工具。
應用服務器的監(jiān)控功能一般是通過JMX提供的,可以使用SNMP等協(xié)議進行集成,但是問題同樣在于完全不同的工具鏈(tool chain)。在這個方面出現(xiàn)了一些新的技術(shù)和趨勢,如Logs+Logstash/Kibana或Splunk、基于REST或編寫腳本實現(xiàn)監(jiān)控的功能。
作者稍后提到了微服務的理念,基于這種理念所構(gòu)建的軟件是由服務組成的,服務會具有一定的業(yè)務含義,服務的(重)部署可以獨立進行,而不是作為一個龐大的整體來進行,服務之間可以通過像REST這樣的方式來進行交互。服務可能會有不同的非功能性需求,所以會需要不同的基礎設施,如異步、傳統(tǒng)的Servlet、Batches、Map/Reduce等,而應用服務器只能提供一種基礎設施。
基于這種模式,應用能夠以JAR文件的方式進行創(chuàng)建,在這個JAR中包含一個Main類,我們可以自定義基礎設施,如HTTP服務器或Batch。在監(jiān)控和部署方面,它依賴于標準的部署和監(jiān)控工具,提供基于REST的監(jiān)控URL,并且會分析評估日志文件。這種方式能夠帶來一系列的好處,因為它只是一個JAR包,所以更易于部署,我們可以在IDE中調(diào)試運行,驗收測試會更為容易,并且可以確;A設施與應用是兼容的。作者最后提到了相關(guān)的技術(shù),如Spring Boot和Dropwizard。
其實,關(guān)于應用服務器已死的觀點,在云理念剛剛普及的時代就曾經(jīng)出現(xiàn)過,如來自Forrester的首席分析師Mike Gualtieri在2011年就曾經(jīng)撰文表示應用服務器的泡沫會破滅并建議不要再將金錢花費在WebLogic、WebSphere以及JBoss Application Servers上面了。當時,RedHat的Mark Little曾經(jīng)專門就這種觀點進行過反駁。最近,Mark Little恰好寫了一篇文章闡述中間件平臺的未來趨勢,在這篇文章中,作者認為我們需要新的框架和模型來構(gòu)建應用,可適應的中間件平臺應該具有的特性包括:
能適應環(huán)境的變化,自動監(jiān)控和管理;
靈活的線程模型;
所有的應用和服務可以根據(jù)需要動態(tài)添加;
組件庫;
跟蹤對象和服務的依賴,以便于遷移時,相關(guān)的服務和對象能夠保持兼容。
Mark Little和Eberhard Wolff都提到了新的編程和部署模式,Parallel Universe公司的博客上,最近也連續(xù)發(fā)表了三篇文章介紹Java的發(fā)展趨勢,其中有一篇專門介紹現(xiàn)代Java Web應用的開發(fā)與部署,作者也提及了這種新的部署理念。
現(xiàn)在就說應用服務器已死可能為時尚早,但是服務化、分布式是應用的發(fā)展方向,這會對傳統(tǒng)應用服務器的部署、監(jiān)控等功能提出挑戰(zhàn)。關(guān)于這一問題,如果您有新的見解,歡迎與我們分享。