什么是Project Zero?一個(gè)面向Web的平臺(tái)
什么是Project Zero?
用一個(gè)詞來形容,那就是:敏捷。我們的目標(biāo)就是要為創(chuàng)建面向Web的應(yīng)用引入敏捷。我們正準(zhǔn)備圍繞三個(gè)方面進(jìn)行創(chuàng)新。創(chuàng)新圍繞著創(chuàng)建面向Web應(yīng)用,從存在的RESTful服務(wù)、feeds和內(nèi)容中裝配和拼接新的應(yīng)用,以使你從Web或者企業(yè)開發(fā)中解放出來,第三個(gè)方面就是執(zhí)行這些應(yīng)用。
讓我對(duì)每一方面稍微多說一點(diǎn),因?yàn)樗鼈兌己芸?。我認(rèn)為圍繞著創(chuàng)建有兩個(gè)主要的概念。***個(gè)概念是動(dòng)態(tài)腳本(dynamic scripting)。如何使你的項(xiàng)目變得敏捷?其實(shí)并沒有必要在面向?qū)ο蟮慕Y(jié)構(gòu)環(huán)境中編寫代碼,而可以使用腳本。
在Project Zero中我們認(rèn)識(shí)到了這一點(diǎn),所以便引入了2種腳本語言。
在深入探討腳本之前,我先說下Java。Java社區(qū)為我們提供了很好的服務(wù),就像在IBM特別是WebSphere中那樣。 Java充滿了活力,也許能夠繼續(xù)輝煌十年。我們已經(jīng)對(duì)Java的發(fā)展做了促進(jìn)。現(xiàn)在Java已經(jīng)成為了系統(tǒng)編程語言。它應(yīng)該被用于實(shí)現(xiàn)Project Zero中精妙的部分,但我們希望你關(guān)于敏捷的***次經(jīng)驗(yàn)大部分來自動(dòng)態(tài)腳本。
所以我們?cè)赑roject Zero中提供了兩種動(dòng)態(tài)腳本用于選擇。一個(gè)是為熟悉Java的人準(zhǔn)備的——腳本語言Groovy。我在博客上曾開玩笑說Groovy是Java的尼古丁貼劑(nicotine patch)。當(dāng)你開始使用Groovy貼劑,我們就有一定的把握讓你戒掉Java,轉(zhuǎn)而接受動(dòng)態(tài)腳本。因此,如果你想不再使用Java,但又想能訪問你之前使用Java寫的類或者方法,你可以用Groovy做到這一點(diǎn)。但是,我們將讓你使用Groovy提供的更簡(jiǎn)潔的動(dòng)態(tài)語法,就像Ruby和 Python一樣。
另外,基于PHP的人氣和內(nèi)容。我們認(rèn)為使用Project Zero,通過基于一個(gè)公共Java平臺(tái)支撐的動(dòng)態(tài)腳本語言Groovy和PHP,你的項(xiàng)目將會(huì)敏捷起來并且能按需編碼。
那么,動(dòng)態(tài)腳本是其一。另一方面的概念是:Project Zero是基于SOA架構(gòu)構(gòu)建的,并且這個(gè)架構(gòu)是一個(gè)RESTful的架構(gòu)。圍繞著概念REST,我們已經(jīng)做了約束和簡(jiǎn)化。在Project Zero中,你基本上只需要使用HTTP。當(dāng)你在Zero中表示一個(gè)服務(wù)的時(shí)候,就代表你在用RESTful的方式或者REST派生方式表示服務(wù)。我們可以用RSS feed或者ATOM feed的方式表示服務(wù);但Web是我們使用Zero構(gòu)建的主要平臺(tái),而REST正是我們?cè)赑roject Zero中構(gòu)建的服務(wù)交互風(fēng)格。
對(duì)此,我們同時(shí)考慮了現(xiàn)行的一些流行框架,并已經(jīng)為此建立了一套約定。約定替代配置,因此如果你想要表示服務(wù),并沒有必要編碼。Project Zero中有一套標(biāo)準(zhǔn),如果你在構(gòu)建服務(wù)的時(shí)候遵循它們,就會(huì)發(fā)生奇跡。將動(dòng)態(tài)腳本和REST結(jié)合起來,現(xiàn)在你已經(jīng)真正地理解了它!這是兩個(gè)真正重要的因素。
另一部分是裝配。對(duì)松耦合的系統(tǒng)來說,SOA的優(yōu)點(diǎn)之一就是你可以從這些新近發(fā)布的服務(wù)中創(chuàng)建一套新的應(yīng)用程序。在 Project Zero中我們會(huì)毫無疑問促進(jìn)這個(gè)優(yōu)點(diǎn)。正如我提到的,我們的服務(wù)模型是圍繞著一個(gè)面向Web模型構(gòu)建的,因此它的構(gòu)建基于REST、feeds。那么現(xiàn)在要做的就是通過腳本、PHP或者Groovy編寫程序,或者通過一套我們擁有的可視化編輯器設(shè)計(jì),讓你圍繞剛剛創(chuàng)建或發(fā)布的基于Web面向Web的服務(wù)創(chuàng)建新的應(yīng)用?;蛘呖赡苤赜闷渌鼇碓吹姆?wù),比如來自Web或者你所在的企業(yè)。這就是關(guān)于裝配的基本想法?,F(xiàn)在我們用一些有趣的功能來拓寬這些想法。
如果你已經(jīng)在Web中使用了其它技術(shù)來可視化地創(chuàng)建動(dòng)態(tài)Web應(yīng)用,那我們是支持這些可視化技術(shù)的。Zero中提供了管道(Pipe)類型的接口。我們的一些裝配可視化工具并沒有什么太大的區(qū)別,但我們現(xiàn)在要做的區(qū)分是建立在一個(gè)很簡(jiǎn)單的方法之上——圍繞流程的一些基本概念。不管我是否構(gòu)造和裝配數(shù)據(jù)流(data-flow)——在數(shù)據(jù)流中我可以得到兩個(gè)feeds、匯集這些feeds、歸類這些feeds。這樣,我不僅通過創(chuàng)建數(shù)據(jù)流來構(gòu)建一個(gè)應(yīng)用或者構(gòu)造一個(gè)新的裝配集,而且順著流程嵌入了活動(dòng),也就是活動(dòng)流。因此,對(duì)于合并feed、發(fā)送郵件或者SMS信息這樣的服務(wù),我可以使用可視化編輯的方式或者純編碼的方式將其混合匹配起來。我可以編寫Groovy或者PHP腳步來獲取feed,合并它、匯集它等等。能夠根據(jù)先前創(chuàng)建的服務(wù)迅速地組裝出新的應(yīng)用,這非常強(qiáng)大,而且是對(duì)Project Zero敏捷特性的又一貢獻(xiàn)。
第三部分是關(guān)于執(zhí)行。正如我剛才所說的,Java世界充滿了活力。我們圍繞Project Zero所做的就是將執(zhí)行動(dòng)態(tài)腳步語言(也就是Groovy和PHP)的環(huán)境集中于Java上。在運(yùn)行時(shí)我們可以做許多有趣的事情,來優(yōu)化這些動(dòng)態(tài)腳步語言的執(zhí)行。能工作在這個(gè)領(lǐng)域之中,我真的感到很興奮,特別是在為Websphere應(yīng)用服務(wù)器在執(zhí)行腳本可能性工作的這些年里。
什么是腳本?一份腳本有著非常精確的起點(diǎn)和終點(diǎn)。執(zhí)行它,而后就會(huì)結(jié)束。很多運(yùn)行在應(yīng)用服務(wù)器之上的傳統(tǒng)應(yīng)用程序是為了長(zhǎng)期運(yùn)行而構(gòu)建的。那長(zhǎng)期運(yùn)行會(huì)有什么樣的問題呢?我們并不***,所以在這些程序中會(huì)有一些細(xì)小的缺陷,而且隨著時(shí)間的推移開始潰爛:內(nèi)存泄露、線程吊起等等。這往往使應(yīng)用程序運(yùn)行時(shí)間越長(zhǎng)越難駕馭。
Project zero的應(yīng)用程序和執(zhí)行環(huán)境傾向于采用運(yùn)行隨即結(jié)束(run-and-done)的特性。開始一個(gè)腳本,運(yùn)行結(jié)束然后停止(Kill)這個(gè)腳本,如此開始一個(gè)新的腳本,運(yùn)行它并停掉它。即使應(yīng)用編寫的不***,其中的缺陷也是可以忽視的。如果應(yīng)用中存在內(nèi)存泄露,至少它不會(huì)對(duì)結(jié)果或者系統(tǒng)有明顯的影響。我稱這種缺陷為海森堡蟲(HeisenBug)。我喜歡說Zero運(yùn)行環(huán)境是對(duì)海森堡蟲免疫的,因?yàn)橛行┪覀兺ǔT谶\(yùn)行的服務(wù)器中看到的缺陷是可以繞過去的,例如通過運(yùn)行和完成腳本模型。我們可以得到很多有趣的好處。
關(guān)于執(zhí)行環(huán)境的另一部分,即Zero是一個(gè)面向Web的平臺(tái)。我們知道如何來縮放網(wǎng)絡(luò)應(yīng)用,我們已經(jīng)在Websphere中做了好一段時(shí)間。Web自然地縮放;REST是極好的縮放協(xié)議。我之前提到過句子的比喻,url是圍繞內(nèi)容的nounds、操作和動(dòng)詞?;诖撕苋菀捉⒕彺嬉?guī)則,并且非常準(zhǔn)確。在其中有許多緩存技術(shù),而且有一些我們正明確地構(gòu)建于Zero中,以協(xié)助你構(gòu)建高性能可伸縮的應(yīng)用。分區(qū)(Partitioning)、負(fù)載管理(workload management)、高可用性(high availability),在面向Web的背景下,我們知道如何做到這一點(diǎn)。我們?cè)赑roject Zero運(yùn)行時(shí)中構(gòu)建了這些。Project Zero可以運(yùn)行在普通的JVM上,不過我們也會(huì)對(duì)其(特別是IBM的虛擬機(jī))進(jìn)行增強(qiáng),以更好地運(yùn)行敏捷的腳本化應(yīng)用。
什么類型的應(yīng)用不適合使用Project Zero,并且你何時(shí)需要整合其它資源來進(jìn)行實(shí)踐?
當(dāng)談到典型的Zero式RESTful應(yīng)用時(shí),我通常會(huì)用句子來比喻。當(dāng)你思考一個(gè)基于Zero的應(yīng)用時(shí),想一想英語中的句子。在句子中有名詞、動(dòng)詞和形容詞。我可以這樣造一個(gè)句子。名詞可能是“照片”,動(dòng)詞是“觀察或者讀缺這個(gè)照片,“獲取照片”,并且形容詞是照片的類型 ——JPEG格式的照片。這個(gè)句子是:“讀取JPGE格式的照片”。在Zero中我可以表示這一點(diǎn)。名詞是RESTful實(shí)體。那你如何來表示一個(gè) RESTful實(shí)體?用URL:/something/photo。動(dòng)詞是“獲缺,而在REST的術(shù)語中正好有四個(gè)主要的動(dòng)作:get、post、 put和delete。這樣句子就是“get photo”。數(shù)據(jù)類型是什么?可以是JPEG。想想構(gòu)建這樣的服務(wù)就像組織句子一樣簡(jiǎn)單。通過這種機(jī)制快速的表示語句、表示服務(wù)和暴露內(nèi)容是非常強(qiáng)大的,能使你的時(shí)間實(shí)現(xiàn)價(jià)值。
數(shù)據(jù)從何而來?腳本的內(nèi)容從何而來?我認(rèn)為一種情況(特別是對(duì)于企業(yè)情況)是,數(shù)據(jù)來自外在環(huán)境。當(dāng)你想基于那些數(shù)據(jù)開始構(gòu)建應(yīng)用時(shí),打比方說我有一個(gè)商業(yè)系統(tǒng);我不建議在Zero中構(gòu)建商業(yè)系統(tǒng),而可以使用Zero的一種情況是構(gòu)建一套應(yīng)用程序。我們稱其為情景應(yīng)用(situational app)。你可能在年初并沒有計(jì)劃做這些應(yīng)用,而是剛剛提出需求。在過去,你可能使用Lotus Notes和基于Lotus協(xié)作產(chǎn)品的工作平臺(tái),或者M(jìn)icrosoft Visual basic,或者諸如此類的東西來構(gòu)建這些應(yīng)用。我們有一些典型的老企業(yè)應(yīng)用,它們產(chǎn)生著數(shù)據(jù),現(xiàn)在你想通過新的視圖查看數(shù)據(jù),想用新的方式組合數(shù)據(jù)。可能會(huì)有多個(gè)來源的數(shù)據(jù),一些企業(yè)數(shù)據(jù),一些數(shù)據(jù)來自互聯(lián)網(wǎng),你想把那些數(shù)據(jù)集合起來給出新的透視圖。你要做到這一點(diǎn)很快。
我沒有必要規(guī)定你使用限制類型的應(yīng)用程序,但當(dāng)你嘗試快速地完成某事而且數(shù)據(jù)來自外界時(shí),可以說Project Zero是最有用的。