Java企業(yè)級應(yīng)用架構(gòu)設(shè)計是每個Java開發(fā)者不必學(xué)的知識,本文將對Java EE應(yīng)用的架構(gòu)與設(shè)計進(jìn)行一些基礎(chǔ)性的介紹,而這些內(nèi)容構(gòu)筑了整個Java EE應(yīng)用開發(fā)的基礎(chǔ)。

      Java企業(yè)級應(yīng)用架構(gòu)設(shè)計中的分布式結(jié)構(gòu)大致可以分為單級結(jié)構(gòu)、2級結(jié)構(gòu)、3級結(jié)構(gòu)和N級結(jié)構(gòu)。充分理解和應(yīng)用分布式結(jié)構(gòu)可以更好的理解當(dāng)代網(wǎng)絡(luò)計算的現(xiàn)狀,設(shè)計出更優(yōu)的企業(yè)級應(yīng)用程序。

      長久以來,Java企業(yè)級版本(Java EE)已經(jīng)成為了眾多產(chǎn)業(yè)領(lǐng)域(如銀行業(yè)、保險業(yè)、零售業(yè)、酒店業(yè)、旅游業(yè)以及電信業(yè)等等)進(jìn)行企業(yè)商務(wù)應(yīng)用開發(fā)和部署的平臺選擇。Java EE之所以應(yīng)用如此廣泛,其原因在于,Java EE可以為構(gòu)建健壯、高擴展性的分布式應(yīng)用系統(tǒng)提供標(biāo)準(zhǔn)化的平臺,而這些應(yīng)用所支持的范圍可以涵蓋從銀行核心業(yè)務(wù)運作,到航空公司訂票引擎之間的廣大區(qū)域。不過,開發(fā)成功的Java EE應(yīng)用也可能成為一項艱巨的任務(wù),Java企業(yè)級應(yīng)用架構(gòu)設(shè)計在其中起著重要作用。

      首先Java EE平臺自身所提供的豐富選擇就足可以令人生畏。那些過剩的框架、實用程序類庫、集成開發(fā)環(huán)境(IDE),以及可供選擇的工具讓一切都更加富有挑戰(zhàn)性。因此,選擇好合適的技術(shù)對于開發(fā)基于Java EE的軟件來說至關(guān)重要。而那些擁有健壯架構(gòu)與設(shè)計準(zhǔn)則的技術(shù),會對構(gòu)建易于維護(hù)、重用以及擴展的應(yīng)用系統(tǒng)大有裨益。

      我們將首先回顧一下分布式計算的進(jìn)化史以及n級結(jié)構(gòu)。之后我將展示Java EE平臺是如何解決分布式應(yīng)用開發(fā)中的難點的。同時你還會了解模型-視圖-控制器(MVC)結(jié)構(gòu)準(zhǔn)則。然后我會結(jié)合MVC準(zhǔn)則與Java EE平臺,來講解多層Java EE應(yīng)用結(jié)構(gòu)。

      在了解了應(yīng)用系統(tǒng)架構(gòu)之后,我將把注意力集中到基于面向?qū)ο笤瓌t的Java EE應(yīng)用開發(fā)上。我同時還會講解如何使用設(shè)計模式來簡化設(shè)計過程,以及如何選擇最佳的實踐范例。此外我還會觸及Sun公司的Java BluePrints所收錄的設(shè)計模式目錄,其內(nèi)容在Deepak Alur et al的《核心J2EE設(shè)計模式》(Prentice Hall出版社,2003年)一書中有詳細(xì)的介紹。在文章的最后,我將介紹通用建模語言(UML)以及其在可視化Java EE文檔設(shè)計與架構(gòu)之中所扮演的的角色。

      分布式計算進(jìn)化史

      在分布式計算中,一個應(yīng)用會被劃分為若干稍小的部件,并同時運行在不同的計算機上。這種計算方式又被稱為“網(wǎng)絡(luò)計算”,因為這些部件通常會通過建立在TCP/IP或者UDP協(xié)議之上的某些協(xié)議進(jìn)行通訊。這些稍小的應(yīng)用部件被稱為“級”,每一級都可以向其他連接級獨立提供一類服務(wù)。而“級”又可以被細(xì)化為若干“層”,以便降低功能的粒度。大多數(shù)Java企業(yè)級應(yīng)用架構(gòu)設(shè)計都應(yīng)具有三個不同的層:

      ◆表現(xiàn)層負(fù)責(zé)用戶接口。

      ◆業(yè)務(wù)層執(zhí)行業(yè)務(wù)邏輯。在運行過程中,它還會與數(shù)據(jù)訪問層進(jìn)行交互。

      ◆數(shù)據(jù)訪問層負(fù)責(zé)對存儲在企業(yè)信息系統(tǒng)(EIS)中的數(shù)據(jù)進(jìn)行存取等操作。

      通過分析分布式計算結(jié)構(gòu)的躍遷史,我們可以更好的理解當(dāng)代網(wǎng)絡(luò)計算的現(xiàn)狀。在接下來的幾節(jié)中,我將用幾個恰當(dāng)?shù)睦咏榻B分布式結(jié)構(gòu)的變遷。

      單級結(jié)構(gòu)
       
      單級結(jié)構(gòu)的使用可以追溯到那些使用簡易終端連接巨型主機的日子。在這種結(jié)構(gòu)中,用戶接口、業(yè)務(wù)邏輯以及數(shù)據(jù)等所有應(yīng)用構(gòu)成層都被配置在同一個物理主機中。用戶通過終端機或控制臺與系統(tǒng)進(jìn)行交互,而這種方式只具有非常有限的文本處理能力(參見圖1)

      Java企業(yè)級應(yīng)用架構(gòu)設(shè)計中的單層結(jié)構(gòu)
      圖1. 單層結(jié)構(gòu)(圖中文字:Console——“控制臺”;Dumb Terminal——“簡易終端”;Mainframe——主機)

      2級結(jié)構(gòu)
       
      在1980年代早期,個人電腦(PC)變得非常流行,它比大型主機便宜,處理能力又比簡易終端之類的設(shè)備強。PC的出現(xiàn)為真正的分布式(客戶端——服務(wù)器,C/S)計算鋪平了道路。作為客戶端的PC現(xiàn)在可以獨立運行客戶接口(UI)程序,同時它還支持圖形化客戶接口(GUI),允許用戶輸入數(shù)據(jù),并與服務(wù)器主機進(jìn)行交互,而服務(wù)器主機現(xiàn)在只負(fù)責(zé)業(yè)務(wù)邏輯和數(shù)據(jù)的部分。當(dāng)用戶在客戶端完成數(shù)據(jù)錄入后,GUI程序可以選擇性的進(jìn)行數(shù)據(jù)有效性校驗,之后將數(shù)據(jù)發(fā)送給服務(wù)器進(jìn)行業(yè)務(wù)邏輯處理。Oracle基于表單的應(yīng)用就是2級結(jié)構(gòu)的優(yōu)秀范例。表單的GUI存儲在客戶端PC中,而業(yè)務(wù)邏輯(包括代碼以及存儲過程)以及數(shù)據(jù)仍然保留在Oracle的數(shù)據(jù)庫服務(wù)器中。

      此后又出現(xiàn)了另外一種2級結(jié)構(gòu),在這種結(jié)構(gòu)中,不只是用戶接口(UI),連業(yè)務(wù)邏輯也被放到了客戶端一級。這種應(yīng)用的典型運行方式是直接連接數(shù)據(jù)庫服務(wù)器進(jìn)行各種數(shù)據(jù)庫查詢。這種客戶端被稱作“胖客戶端”,因為這種結(jié)構(gòu)將可執(zhí)行代碼的相當(dāng)大一部分都放到了客戶端一級(參見圖2)。

      Java企業(yè)級應(yīng)用架構(gòu)中的2級結(jié)構(gòu)
      圖2. 2級結(jié)構(gòu)(Business Logic Layer——業(yè)務(wù)邏輯層;Optional——可選;User Interface Layer——用戶接口層;Thick Client——胖客戶端;Data Access Layer——數(shù)據(jù)訪問層; Mainframe Server——服務(wù)器主機)

      3級結(jié)構(gòu)

      盡管2級“胖客戶端”應(yīng)用的開發(fā)很簡單,但是任何用戶接口或者業(yè)務(wù)邏輯的改變所導(dǎo)致的軟件升級都需要在所有客戶端上進(jìn)行。幸運的是,在上世紀(jì)90年代中期,硬件成本已經(jīng)變得越來越低,而CPU的運算能力卻得到了巨大提升。與此同時,互聯(lián)網(wǎng)的發(fā)展非常迅速,互聯(lián)網(wǎng)應(yīng)用的發(fā)展趨勢已經(jīng)逐漸顯現(xiàn),兩者的結(jié)合最終導(dǎo)致了3級結(jié)構(gòu)的產(chǎn)生。

      在3級結(jié)構(gòu)模型中,PC客戶端只需要安裝“瘦客戶端”軟件——比如瀏覽器——來顯示服務(wù)器提供的展示內(nèi)容,服務(wù)器負(fù)責(zé)準(zhǔn)備展示內(nèi)容、業(yè)務(wù)邏輯以及數(shù)據(jù)訪問邏輯,應(yīng)用程序的數(shù)據(jù)來自企業(yè)信息系統(tǒng),例如關(guān)系數(shù)據(jù)庫。在這樣的系統(tǒng)中,業(yè)務(wù)邏輯可以通過遠(yuǎn)程訪問,因此通過Java控制臺應(yīng)用程序支持一個獨立的客戶端就成為課程。業(yè)務(wù)層主要通過數(shù)據(jù)訪問層與信息系統(tǒng)實現(xiàn)交互。因為整個應(yīng)用都位于服務(wù)器之上,因此這樣的服務(wù)器也被稱作“應(yīng)用程序服務(wù)器”或者“中間件”(參見圖3)。

      Java企業(yè)級應(yīng)用架構(gòu)中的3級結(jié)構(gòu)
      圖3. 3級結(jié)構(gòu)(圖中文字:Presentation Layer——表現(xiàn)層;Business Logic Layer——業(yè)務(wù)邏輯層;Data Access Layer——數(shù)據(jù)訪問層;Thin Client——瘦客戶端;Application Server——應(yīng)用程序服務(wù)器;Enterprise Data——企業(yè)數(shù)據(jù);Database Server——數(shù)據(jù)庫服務(wù)器)

      N級結(jié)構(gòu)
       
      隨著互聯(lián)網(wǎng)帶寬的不斷提高,全世界的各大企業(yè)都相繼啟動了他們的網(wǎng)絡(luò)服務(wù)。這種變化導(dǎo)致應(yīng)用服務(wù)器無法繼續(xù)承擔(dān)表現(xiàn)層的巨大負(fù)荷。這項任務(wù)現(xiàn)在已經(jīng)由專門負(fù)責(zé)產(chǎn)生展示內(nèi)容的專門網(wǎng)頁服務(wù)器所承擔(dān)。展示內(nèi)容之后被傳送到客戶端級的瀏覽器上,瀏覽器會負(fù)責(zé)將用戶接口表現(xiàn)出來。N級結(jié)構(gòu)中的應(yīng)用服務(wù)器負(fù)責(zé)提供可遠(yuǎn)程訪問的業(yè)務(wù)邏輯組件,而表現(xiàn)層網(wǎng)頁服務(wù)器則使用本網(wǎng)協(xié)議通過網(wǎng)絡(luò)訪問這些組件。圖4展示了n級結(jié)構(gòu)。

      Java企業(yè)級應(yīng)用架構(gòu)中的N級結(jié)構(gòu) 

      以上是Java企業(yè)級應(yīng)用架構(gòu)設(shè)計中的分布式結(jié)構(gòu),在不同的需求和應(yīng)用場景中,我們會用到不同的分布式結(jié)構(gòu),設(shè)計不同的Java企業(yè)級應(yīng)用架構(gòu)。