Web發展簡史((webapp+Java原生)移動端開發 )+web網站)
發表時(shí)間:2019-4-1
發布人(rén):融晨科技
浏覽次數:35
Web發展簡史--------->((webapp+Java原生)移動端開發(微信小程序,公衆号,頭條app))+web網站)
Web發展簡史
1:在(zài)那時(shí),Web開發還比較簡單,開發者經常會去操作web服務器(主要(yào / yāo)還是(shì)他(tā)自己的(de)機器),并且他(tā)會寫一些HTML頁面放到(dào)服務器指定的(de)文件夾(/www)下。這(zhè)些HTML頁面,就(jiù)在(zài)浏覽器請求頁面時(shí)使用。(當時(shí)隻能獲取HTML,靜态頁面)
2:問題就(jiù)出(chū)現了(le/liǎo),你隻能獲取到(dào)靜态内容。倘若你想讓訪問者看到(dào)有多少其他(tā)訪問者訪問了(le/liǎo)這(zhè)個(gè)網站呢(還記得那些統計流量的(de)旋轉圖片嗎?!),或者倘若你想讓訪問者去填寫這(zhè)樣一個(gè)表單,包含有姓名和(hé / huò)郵件地(dì / de)址呢?于(yú)此就(jiù)轉向了(le/liǎo)CGI和(hé / huò)Perl腳本,在(zài)web服務器端運行一段短小的(de)代碼,并能與文件系統或者數據庫進行交互(可以(yǐ)交互啦!提交個(gè)表單,查看個(gè)信息)
3:當時(shí)組織CGI/Perl這(zhè)樣的(de)腳本代碼太混亂了(le/liǎo)。CGI伸縮性不(bù)是(shì)太好(經常是(shì)爲(wéi / wèi)每個(gè)請求分配一個(gè)新的(de)進程),也(yě)不(bù)太安全(直接使用文件系統或者環境變量),同時(shí)也(yě)沒提供一種結構化的(de)方式去構造動态應用程序。幾年來(lái)一直很困惑,直到(dào)大(dà)約2005年左右,出(chū)現了(le/liǎo)Java Server Pages(JSP),微軟的(de)ASP,以(yǐ)及PHP!我喜歡把當時(shí)的(de)參考架構比作成IIS和(hé / huò)ASP.NET,你可以(yǐ)用Visual Studio快速構建一個(gè)可伸縮并且安全的(de)應用程序。(因爲(wéi / wèi)cgi交互不(bù)怎麽好,所以(yǐ)在(zài)服務器上(shàng)開始寫(jsp,asp,php動态語言代碼了(le/liǎo)進行幫助查找數據,查找圖片,動态語言效率更高))
4:直到(dào)當時(shí),web服務器多半會返回整個(gè)頁面或者文檔,但AJAX(2005)的(de)出(chū)現,讓事情變得很有意思。AJAX允許客戶端的(de)JavaScript腳本爲(wéi / wèi)局部頁面提供請求服務,然後可以(yǐ)在(zài)無需回到(dào)服務器情況下動态刷新部分頁面,也(yě)就(jiù)是(shì)更新浏覽器中的(de)document對象,通常稱作DOM,或者文檔對象模型。(javascript的(de)出(chū)現讓用戶更加快速的(de)更改,修改頁面内容,而(ér)不(bù)用再去訪問WEB服務器去請求,返回HTML修改頁面啦!javascript訪問更快)
雖然從服務器端返回的(de)仍然是(shì)HTML,但浏覽器上(shàng)的(de)代碼能把這(zhè)HTML片段内嵌到(dào)當前頁面中。也(yě)就(jiù)是(shì)說(shuō)web應用的(de)響應可以(yǐ)更快,這(zhè)時(shí)我們真正用web應用取代了(le/liǎo)web頁面。谷歌的(de)GMail和(hé / huò)谷歌地(dì / de)圖都是(shì)當時(shí)AJAX的(de)殺手級産品。随後用AJAX局部刷新就(jiù)如雨後春筍般出(chū)現。
5:在(zài)随後的(de)幾年時(shí)間裏,AJAX成爲(wéi / wèi)了(le/liǎo)焦點,但在(zài)服務器端仍然使用着舊有的(de)技術。大(dà)概在(zài)2007年,37signals公司公開其成員–Ruby>(這(zhè)時(shí)候後台框架打開了(le/liǎo)新的(de)大(dà)門,後端框架先被提出(chū)來(lái)的(de),現在(zài)的(de)前端趨勢也(yě)開始要(yào / yāo)有MVC的(de)前端框架啦!WEB前端全棧開發,node.js直接訪問數據庫,mongo數據庫,)
6:在(zài)2007到(dào)2010年期間,湧現了(le/liǎo)3種開發潮流:
第一個(gè)是(shì)智能手機和(hé / huò)移動應用潮流。通常情況下,許多應用程序同時(shí)有web和(hé / huò)移動應用兩種版本。盡管如此,服務端仍然返回的(de)是(shì)HTML頁面,而(ér)不(bù)是(shì)其它移動應用可以(yǐ)識别。因此,你需要(yào / yāo)返回的(de)是(shì)結構化數據來(lái)取代HTML。
第二個(gè)開發潮流是(shì)jQuery。這(zhè)是(shì)一個(gè)非常流行的(de)JavaScript庫,能夠很容易構建動态、美妙的(de)web應用,甚至是(shì)AJAX!
第三個(gè)潮流是(shì)Node.js的(de)發布。這(zhè)是(shì)第一次能讓你用JavaScript開發高性能的(de)服務端程序,進而(ér)可能結束“客戶端開發者”要(yào / yāo)知道(dào)HTML/JavaScript,“服務端開發者”要(yào / yāo)知道(dào).NET/C#/Ruby這(zhè)樣的(de)噩夢。(json是(shì)服務器向浏覽器返回的(de)一種數據結構,浏覽器解析json提取裏面的(de)key-value鍵值對,服務器端(jsp,php)可以(yǐ)把數據庫裏面的(de)數據封裝到(dào)json中,發給浏覽器)
7:盡管這(zhè)是(shì)一個(gè)不(bù)錯的(de)架構,但我們可以(yǐ)重用一些在(zài)客戶端的(de)收獲去簡化那些曾經發生在(zài)像客戶端意大(dà)利面似的(de)jQuery代碼。和(hé / huò)Rails精神類似,我們需要(yào / yāo)用一種規定的(de)方式從服務端獲取到(dào)數據,再對客戶端的(de)HTML頁面進行包裝。因此,在(zài)接下來(lái)的(de)2年時(shí)間裏,業界出(chū)現了(le/liǎo)許多用于(yú)簡化客戶端開發的(de)框架,諸如Backbone,Ember,Derby和(hé / huò)Meteor,當然也(yě)包括我的(de)最愛,AngularJS,vlue.js。(這(zhè)些東西訪問數據庫,把數據從服務器取出(chū)到(dào)浏覽器,浏覽器MVC再去解析數據)
8:因此,這(zhè)就(jiù)是(shì)我們看到(dào)的(de)今天,而(ér)我後面要(yào / yāo)講到(dào)的(de)參考架構是(shì)這(zhè)樣的(de),mongodb作爲(wéi / wèi)數據庫服務器,node/express作爲(wéi / wèi)web應用服務器,客戶端使用AngularJS,同時(shí)也(yě)使用Bootstrap樣式風格。我發現這(zhè)種架構允許我能夠快速構建web服務以(yǐ)及基于(yú)AngularJS的(de)客戶端接口,甚至和(hé / huò)其它的(de)服務,如PhoneGap或者其它原生移動開發工具一樣,進行移動應用的(de)開發。(這(zhè)種開發模式越來(lái)越可以(yǐ)快速開發啦!應用到(dào)webapp開發,這(zhè)些前端一般用于(yú)業務型強,主要(yào / yāo)用于(yú)給用戶展現内容和(hé / huò)數據,業務型比較強的(de)。移動端開發還有Java原生開發的(de),主要(yào / yāo)用于(yú)邏輯性強的(de)。Java安卓原生開發(處理密碼處理,過濾什麽的(de))邏輯性比較強的(de)應用。現在(zài)APP可以(yǐ)使用混合式開發(webapp(html+css+javascript(mui移動端js框架)+node.js+mongo)+原生Java開發),現在(zài)網站開發用的(de)還是(shì)html+css+javascript(包括js框架)前端+後端(ssh+ssm+springboot框架))。這(zhè)就(jiù)是(shì)現在(zài)主流的(de)開發模式。
https://blog.csdn.net/zzzkk2009/article/details/9849431 經典的(de)安卓移動端開發(web+Java原生開發)web系統發展曆史
https://blog.csdn.net/z742182637/article/details/52055970 也(yě)是(shì)web系統開發曆史(不(bù)怎麽清晰,不(bù)是(shì)太好)
https://blog.csdn.net/youngyouth/article/details/84755278#web_5 web服務器架構的(de)發展曆史
1. 靜态頁面時(shí)代
大(dà)學時(shí)候,上(shàng)機還得換卡穿拖鞋,Novell的(de)網絡是(shì)很神奇的(de),然而(ér)更神奇的(de)是(shì)通訊原理老師半神秘的(de)講他(tā)上(shàng) Internet,“Cernet(教育網)有條64K的(de)出(chū)口,半年前還很快,現在(zài)已經比較卡了(le/liǎo)”。就(jiù)這(zhè)樣,我們用Netscape指向Yahoo。那是(shì)一個(gè)HTML加圖片的(de)世界,充斥着各種花哨閃耀的(de)字體和(hé / huò)鞠躬的(de)小人(rén),藍色連接點擊後會奇幻的(de)變色。
我們開始用不(bù)熟練的(de)HTML和(hé / huò)簡陋的(de)設計來(lái)設計網頁,并且知道(dào)這(zhè)邊有個(gè)浏覽器,那邊有個(gè)叫WebServer的(de)東西,但管理Sun工作站的(de)機房老師總是(shì)盯的(de)很緊,不(bù)會讓你動系統半分。聽說(shuō)有個(gè)叫Linux的(de)神奇東西,好吧我想嘗試,可是(shì)我隻有一台攢的(de)電腦,以(yǐ)及若幹張5寸3寸的(de)軟盤。我至今感謝一位師兄,他(tā)幫我下載并切分了(le/liǎo)一個(gè)版本的(de)Mandrake,就(jiù)這(zhè)樣室友看到(dào)非常奇怪的(de)一幕,我奔波在(zài)機房宿舍之(zhī)間,仔細計算容量來(lái)拷貝,就(jiù)這(zhè)樣在(zài)假期裏我第一次搭建了(le/liǎo)Apache。
2. CGI時(shí)代
很快頁面上(shàng)流行一個(gè)叫做計數器的(de)東西,免費的(de)收費的(de)建站網站都把它當作賣點,“立體超炫變色時(shí)尚計數器”,很快我們看到(dào)幾乎每個(gè)頁面都有了(le/liǎo)一個(gè)點擊量在(zài)88888的(de)酷裝置,隻是(shì)無論怎麽點都不(bù)會變化。而(ér)校園裏張貼着令人(rén)眼紅的(de)廣告,“征人(rén)寫CGI程序,一支500元!“。
慢慢的(de),知道(dào)了(le/liǎo)CGI是(shì)利用進程間輸入輸出(chū)通信,和(hé / huò)WebServer進行通信,從而(ér)可以(yǐ)寫程序來(lái)控制頁面輸出(chū)的(de)内容。但在(zài)當時(shí)會給硬盤分區就(jiù)在(zài)中關村被看成電腦高手的(de)年代,實在(zài)是(shì)會者寥寥。即便到(dào)了(le/liǎo)今天,我依然對Perl敬而(ér)遠之(zhī)。一些前輩用C寫出(chū)更高級的(de)CGI應用,比如WebMail,挖到(dào)第一桶金,成爲(wéi / wèi)今天互聯網的(de)先驅。
3. PHP露出(chū)鋒芒
說(shuō)實話,我認爲(wéi / wèi)PHP是(shì)最受益于(yú)互聯網浪潮的(de)語言,在(zài)合适的(de)時(shí)間和(hé / huò)好夥伴Mysql一起出(chū)現。利用Apache的(de)模塊mod-php,将php作爲(wéi / wèi)web服務器的(de)一部分運行,效率和(hé / huò)維護性都達到(dào)很好的(de)提升。腳本語言成爲(wéi / wèi)互聯網前端開發主力一直到(dào)今天。PHP和(hé / huò)大(dà)哥Perl,以(yǐ)及兄弟Python,Ruby一起盤據在(zài)編程語言排行榜5-10名位置。
同樣的(de)Mysql也(yě)是(shì)時(shí)代的(de)嬌子(zǐ),它快速靈活易用成爲(wéi / wèi)網站數據庫的(de)首選,但很長時(shí)間裏,Mysql被其他(tā)數據庫诟病,别說(shuō)Oracle等高富帥,即便是(shì)同爲(wéi / wèi)開源的(de)Postgres社區裏,也(yě)會有這(zhè)樣的(de)聲音,“不(bù)支持事務也(yě)叫數據庫?”。沒關系,開源社區很快爲(wéi / wèi)其加入各種引擎,如今Mysql絕對是(shì)裝機總量第一的(de)數據庫。
4. J2EE
Java時(shí)代來(lái)臨,一杯咖啡,一個(gè)可跳動的(de)小精靈牽動了(le/liǎo)所有的(de)大(dà)型軟件公司。沒錯是(shì)所有,包括微軟,Sun公司一時(shí)星光無限,所有的(de)開發人(rén)員都在(zài)談Java。人(rén)們對其桌面表現失望進而(ér)質疑時(shí),J2EE及時(shí)出(chū)現了(le/liǎo),Servlet+JSP快速成爲(wéi / wèi)Web開發的(de)好用技術。能夠跨平台,獨立解包使用的(de)Web服務器,挂接任意數據庫的(de)JDBC接口,一時(shí)世界變得很美好。
微軟的(de)ASP也(yě)出(chū)現了(le/liǎo),一開始也(yě)是(shì)腳本解釋,和(hé / huò)PHP等技術類似。很快微軟的(de)C#和(hé / huò)dotNET戰略出(chū)台,ASP也(yě)升級爲(wéi / wèi)ASP.Net,從此dotNET和(hé / huò)J2EE是(shì)競争者,更是(shì)一對站在(zài)相同站壕的(de)朋友,互相學習和(hé / huò)抄襲對方的(de)技術和(hé / huò)設計,直到(dào)今天。
5. Web層框架百花齊放
Servlet是(shì)一個(gè)優異的(de)Web技術規範,但面對叢多的(de)開發需求,還是(shì)不(bù)能很好的(de)覆蓋。Struts框架很快成爲(wéi / wèi)主流,今天我們依然看到(dào)很多.do後綴的(de)頁面。Struts主要(yào / yāo)做了(le/liǎo)三件事,一是(shì)對請求Url進行很好的(de)梳理,通過Command模式把請求指配到(dào)Action對象上(shàng),并可以(yǐ)用同期出(chū)現的(de)Ioc框架進行注入。二是(shì)梳理出(chū)若幹有用好用的(de)Intecepter,并可以(yǐ)自由組合構成自己的(de)Stack。三是(shì)對頁面流轉流程通過xml的(de)方式可以(yǐ)靈活定義。
同期,數以(yǐ)百計的(de)各種框架出(chū)現了(le/liǎo),多數都是(shì)針對Servlet的(de)空白點,在(zài)幾個(gè)方面進行代碼或者配置的(de)約定,可謂百花齊放,百家争鳴,我想Java社區能到(dào)今天依然繁榮,這(zhè)種海納百川,開放的(de)态度是(shì)根本原因。如今很多框架已經走過生命期,但還有很多活躍的(de),其中Webwork即Struts2,和(hé / huò)SpringMVC是(shì)模闆技術類别最出(chū)色的(de)。GWT,Wicket等在(zài)頁面組件類表現不(bù)錯,還有脫離Servlet束縛Play等框架。
6. WithoutEJB
J2EE裏,除了(le/liǎo)Servlet外另一個(gè)重量級的(de)規範就(jiù)是(shì)EJB。EJB設計的(de)來(lái)源是(shì)Corba技術,分布式對象技術在(zài)EJB規範中有完整的(de)體現。Rod在(zài)著作中對EJB規範粗重龐大(dà)難用提出(chū)各種質疑,尤其是(shì)針對其強制分布的(de)要(yào / yāo)求。我的(de)觀念是(shì)分布式支持沒有錯,現在(zài)EJB規範中對于(yú)Local和(hé / huò)Remote的(de)劃分定義是(shì)正确的(de)。開發人(rén)員應該一開始就(jiù)需要(yào / yāo)了(le/liǎo)解接口粒度的(de)劃分,本地(dì / de)和(hé / huò)遠程接口是(shì)不(bù)同的(de)。對于(yú)一般的(de)小型應用,Servlet和(hé / huò)EJB容器都在(zài)一個(gè)虛拟機中,本地(dì / de)接口是(shì)合理的(de),但對于(yú)大(dà)型企業應用和(hé / huò)互聯網級别應用,勢必需要(yào / yāo)服務的(de)遠程劃分和(hé / huò)調用。所以(yǐ)早期的(de)EJB,可以(yǐ)說(shuō)一方面設計不(bù)完備,另一方面又過度設計。但EJB自從3以(yǐ)後完全脫胎換骨,成爲(wéi / wèi)設計良好的(de)規範。
Spring作爲(wéi / wèi)開發框架,把Ioc和(hé / huò)AOP能力發揮的(de)淋漓盡緻,在(zài)各個(gè)層次很好融合其他(tā)技術和(hé / huò)項目庫,一直是(shì)Java Web開發的(de)主流。不(bù)過面對CDI等JavaEE規範,在(zài)注入,生命期管理,對象解耦等優勢不(bù)在(zài)。我預計今後Spring, JavaEE和(hé / huò)Osgi會在(zài)主流Java開發框架方向競争,也(yě)會相互借鑒和(hé / huò)融合。
7. Ajax
Javascript是(shì)浏覽器正統的(de)腳本語言,但在(zài)那個(gè)機器性能不(bù)佳的(de)年代,一段Js代碼造成鼠标沒有響應的(de)情況比比皆是(shì)。Js的(de)給人(rén)影響就(jiù)是(shì)頁面上(shàng)飄來(lái)飄去“點擊我”對話框,頁面上(shàng)走馬燈效果的(de)變色通告,或者是(shì)幾十層模态對話框的(de)惡意頁面,很多網吧的(de)機器默認Js是(shì)禁用的(de)。在(zài)很長的(de)一段時(shí)間裏,Java web開發一個(gè)潛規則就(jiù)是(shì)少手寫Js文件,這(zhè)樣可以(yǐ)很好的(de)支持多種浏覽器和(hé / huò)提高效率。
谷歌火了(le/liǎo),Ajax也(yě)成爲(wéi / wèi)火爆的(de)前端技術,我們在(zài)使用gmail,google map等産品時(shí),有了(le/liǎo)另一種體驗,點擊鏈接或按鈕後,即便網絡不(bù)算流暢,頁面不(bù)再全白重新刷新,而(ér)是(shì)内容漸漸的(de)出(chū)現。其原理就(jiù)是(shì)利用Js腳本到(dào)後台服務器獲取數據,在(zài)浏覽器前端對數據進行解析和(hé / huò)渲染,在(zài)這(zhè)個(gè)過程中,大(dà)多數頁面并不(bù)需要(yào / yāo)進行改變,隻是(shì)更新頁面中一部分即可。谷歌公司大(dà)力支持Firefox使其重生,并和(hé / huò)蘋果一起發展webkit項目,各自發展了(le/liǎo)chrome和(hé / huò)safari浏覽器,伴随者頁面渲染能力大(dà)力提升同時(shí),Js腳本的(de)解析能力也(yě)突飛猛進。我個(gè)人(rén)認爲(wéi / wèi)Ajax這(zhè)個(gè)技術看似簡單,但卻是(shì)新一代Web,所謂Web2.0的(de)基石性質技術,爲(wéi / wèi)互聯網泡沫後互聯網的(de)複興和(hé / huò)今日騰飛起到(dào)了(le/liǎo)重要(yào / yāo)作用。
8. Ruby and Rails
快速成長的(de)互聯網需要(yào / yāo)快速的(de)web開發能力,Rails框架出(chū)現了(le/liǎo),同時(shí)火爆的(de)還有Ruby語言,它的(de)出(chū)現滿足了(le/liǎo)當時(shí)開發者的(de)需要(yào / yāo),快速開發,玩cool的(de)東西,有完備的(de)後端模型支持。讓我們仔細分析一下Rails中MVC就(jiù)能發現,Model中對實體對象的(de)關系定義,和(hé / huò)JavaEE的(de)JPA很多概念一緻,但利用Ruby語言的(de)元能力,可以(yǐ)直接對實體對象進行功能擴展,而(ér)其時(shí)Java社區還在(zài)爲(wéi / wèi)貧血,充血對象争論不(bù)休。Control,View等層次也(yě)能和(hé / huò)Java的(de)一些框架概念一緻,不(bù)過有些設計構思更巧妙,而(ér)且Rails的(de)基因就(jiù)是(shì)滿足互聯網開發需要(yào / yāo),和(hé / huò)JavaEE企業級應用有所不(bù)同。
很快的(de),各種語言紛紛出(chū)現模仿Rails的(de)項目,Java的(de)Grails, SpringROO,JBossForge,Python的(de)Django,PHP的(de)Symfony等等。毫無例外的(de),能有影響力的(de)都是(shì)開源的(de),有良好社區能力建設的(de)項目。
9. JSF和(hé / huò)CDI
讓我們回到(dào)企業應用開發,大(dà)家有沒有想過所謂企業應用和(hé / huò)互聯網應用之(zhī)間最大(dà)的(de)差别是(shì)什麽?我認爲(wéi / wèi)是(shì)用戶數量級别的(de)差異,導緻前端設計方式,軟件體系,後台數據庫,緩存技術應用,有不(bù)同的(de)設計理念和(hé / huò)方式。用更技術化來(lái)說(shuō),就(jiù)是(shì)會話和(hé / huò)事務。企業應用是(shì)有強會話和(hé / huò)事務需求的(de),而(ér)這(zhè)兩個(gè)技術詞語也(yě)會一并關聯存在(zài)。很簡單,在(zài)一個(gè)事務中會經過多次會話過程,直到(dào)這(zhè)個(gè)事務全部做完。和(hé / huò)我們日常辦事是(shì)一樣的(de),填單子(zǐ),和(hé / huò)辦事人(rén)員溝通,修改單據,蓋章,各種口舌,最終感慨,辦事真難。
從軟件層面考慮,一個(gè)企業應用軟件可能用戶數并不(bù)太多,就(jiù)企業中百十号人(rén),但前後台的(de)交互是(shì)長時(shí)間,多次會話交互的(de)。JSF技術其實是(shì)借鑒了(le/liǎo)微軟ASP.net,它們繼承了(le/liǎo)傳統IDE快速開發的(de)思路,希望通過拖拽連接可以(yǐ)快速開發一個(gè)應用。頁面上(shàng)的(de)組件,對應後台服務器的(de)業務組件,在(zài)得到(dào)服務器請求之(zhī)後,組件需要(yào / yāo)做一系列動作來(lái)完成解析,校驗,模型重建,業務方法調用,頁面渲染等步驟,這(zhè)些必然有個(gè)較長的(de)過程。複雜性,效率,和(hé / huò)其他(tā)技術的(de)融合,JSF技術從誕生起就(jiù)被質疑不(bù)斷,而(ér)且面對每個(gè)明星技術,都有些格格不(bù)入,比如Ajax出(chū)現了(le/liǎo),而(ér)JSF要(yào / yāo)求的(de)Post方式還需要(yào / yāo)重刷頁面。但JSF一直在(zài)改進,越來(lái)越科學完善。如今,配合CDI,JSF是(shì)企業應用開發的(de)首選技術之(zhī)一,大(dà)家可以(yǐ)研究一下Oracle的(de)應用産品和(hé / huò)ADF開發框架。
CDI是(shì)Seam框架的(de)技術精華形成的(de)JavaEE規範,在(zài)JavaEE7裏面已經成爲(wéi / wèi)最重要(yào / yāo)的(de)規範之(zhī)一。和(hé / huò)Hibernate最終形成JPA一樣,CDI也(yě)是(shì)GavinKing構思,開發推動的(de)。仔細分析就(jiù)會發現,CDI幾乎彌補了(le/liǎo)JavaEE在(zài)現代開發需求中,對象方面定義的(de)絕大(dà)多數不(bù)足,比如和(hé / huò)DI規範定義了(le/liǎo)注入,生命期管理和(hé / huò)會話範圍定義,完善了(le/liǎo)EJB對于(yú)普通POJO對于(yú)事務,異步通知機制的(de)定義,還有注解的(de)堆疊定義,裝飾模式等等。有時(shí)候我就(jiù)在(zài)想,假如JavaEE是(shì)GK從頭打造,我們開發人(rén)員會少走很多彎路,因爲(wéi / wèi)他(tā)對企業應用的(de)理解和(hé / huò)用Java構建框架和(hé / huò)定義規範,都是(shì)貼近一線開發人(rén)員需求。唯一遺憾的(de)就(jiù)是(shì)CDI還沒有推動完成,他(tā)轉移興趣玩起語言了(le/liǎo)。關于(yú)JSF和(hé / huò)CDI,我建議做相關産品的(de)朋友,即便不(bù)用這(zhè)樣的(de)組合,最好也(yě)對其技術基本内容有所了(le/liǎo)解,我想對思路擴展是(shì)非常有好處的(de)。
10. Netty,NodeJs,Vertx和(hé / huò)異步化趨勢
Netty的(de)領導者和(hé / huò)Mina的(de)主力開發者TrustLee,是(shì)一個(gè)說(shuō)話慢條斯裏的(de)韓國(guó)人(rén)。面試時(shí)問我一個(gè)關于(yú)volatile問題,雙方都覺得非母語很别扭,所以(yǐ)就(jiù)都簡單表達一下就(jiù)算。可我沒想到(dào)這(zhè)個(gè)同齡的(de)開發人(rén)員,日後對Java在(zài)互聯網公司的(de)地(dì / de)位提升,起到(dào)這(zhè)麽大(dà)的(de)作用,這(zhè)個(gè)項目就(jiù)是(shì)Netty。我們都知道(dào)Java異步集合庫的(de)作者DougLea的(de)功勞,Nio1代,對于(yú)Socket的(de)異步化還不(bù)是(shì)很完善,即便是(shì)Nio2,工作重心還是(shì)文件系統的(de)異步化處理,網絡層的(de)異步化設計逐步加強改進。因爲(wéi / wèi)Java的(de)設計理念,正交化,接口堆疊,底層功能平台統一化等給異步分布式網絡框架留出(chū)足夠的(de)空間去發揮,Netty,Mina,Grizzly等項目紛紛出(chū)現。Twitter宣布從Ruby轉向Scala,并使用Netty讓其大(dà)紅大(dà)紫。
所謂異步網絡框架,就(jiù)是(shì)對網絡層調用,進行異步化,并進行接口封裝,使得容易理解和(hé / huò)使用。異步能力還是(shì)通過Java虛拟機現有功能實現的(de),通過對數據流的(de)處理和(hé / huò)狀态感知來(lái)進行處理,而(ér)不(bù)是(shì)傳統的(de)阻塞式的(de)收發消息。這(zhè)個(gè)符合我們生活中的(de)感受,當你訂票時(shí),你會打電話告訴你需要(yào / yāo)什麽,說(shuō)訂好票給我電話,然後你就(jiù)去做别的(de)事情,直到(dào)訂票員通知你訂好了(le/liǎo)來(lái)支付取票再進行下一步操作,如果訂票是(shì)同步的(de),那你就(jiù)要(yào / yāo)一直等待訂票完成,遇到(dào)春運可能會搭上(shàng)整天的(de)時(shí)間。
爲(wéi / wèi)什麽異步網絡框架也(yě)受到(dào)重視,答案也(yě)是(shì)互聯網,數以(yǐ)億計的(de)請求點擊湧來(lái)時(shí),傳統的(de)webserver頂不(bù)住了(le/liǎo),采用一個(gè)線程服務一個(gè)請求模型的(de)webserver,無法承受這(zhè)麽大(dà)的(de)數據訪問,特别對于(yú)Java這(zhè)樣的(de)吃内存語言,一個(gè)請求占用了(le/liǎo)一個(gè)線程,同時(shí)也(yě)占用了(le/liǎo)相對應的(de)若幹資源。用企業應用的(de)設計的(de)整個(gè)架構面對互聯網級别的(de)應用時(shí),有點崩潰的(de)感覺。解決高并發大(dà)量請求的(de)途徑是(shì)高吞吐量加上(shàng)可擴展的(de)軟件架構。異步化可以(yǐ)提升吞吐量,就(jiù)和(hé / huò)銀行的(de)排隊機一樣,顧客來(lái)了(le/liǎo)得到(dào)排隊服務,當有可用的(de)櫃台服務時(shí)會主動通知顧客,我們可以(yǐ)設想,即使有再多的(de)顧客,也(yě)可以(yǐ)通過增加業務櫃台,少許增加排隊機和(hé / huò)少量人(rén)工協調處理來(lái)解決。
NodeJs是(shì)一個(gè)異步化的(de)基于(yú)Javascript的(de)開發框架,是(shì)當前的(de)明星技術,符合了(le/liǎo)一些當前開發需求,如異步化,前端Js技術廣泛應用,Js引擎能力極大(dà)提升,NoSQL的(de)火爆,組件構建模式變化等。利用Js語言函數式編程能力,Js開發人(rén)員可以(yǐ)很輕松的(de)利用已有的(de)組件開發後端應用,前端可以(yǐ)直接用浏覽器處理Js,别忘了(le/liǎo)Js是(shì)浏覽器唯一能統一識别的(de)腳本語言,或者用JQuery,AngularJS等流行框架,世界很清淨,都是(shì)Js。
但我們需要(yào / yāo)了(le/liǎo)解在(zài)常駐内存服務型程序方面,Java等語言占有極大(dà)優勢,Java社區很快出(chū)現了(le/liǎo)和(hé / huò)NodeJs有相同設計思路的(de)項目,Vertx就(jiù)是(shì)其中的(de)優秀代表。它充分借鑒了(le/liǎo)NodeJs和(hé / huò)Erlang/OTP Actor模型的(de)優秀設計,利用分布式消息機制進行對象間通信,利用Netty進行網絡異步操作,方法調用倡導異步調用,有自己的(de)模塊化機制。這(zhè)樣,Java社區出(chū)現了(le/liǎo)和(hé / huò)NodeJs競争的(de)技術框架,良好使用,可以(yǐ)解決大(dà)規模互聯網應用的(de)需求。
Java領域的(de)異步化趨勢可以(yǐ)說(shuō)剛剛開始,我們看到(dào)Servlet和(hé / huò)EJB都加入異步支持,Spring的(de)Reactor,JBoss的(de)undertow,随着Java8對函數語言能力的(de)增強,可以(yǐ)預見又會有叢多的(de)項目産生。我關注着異步化趨勢和(hé / huò)JavaEE開發方式的(de)融合之(zhī)路,相信那是(shì)Web開發的(de)明天。