以 Enhydra 建構 N Tier 應用程式網站
撰文:數位芝麻網路公司/蔡志展 chihchun@digitalsesame.com
前面的兩個專欄章節中,我們略為對 Enhydra 的架構與安裝過程介紹,說明。本章節,將深入探討 Enhydra 應用程式伺服器的架構優劣。
系統的架構設計在開發大型網站格外的重要。典型的主從式架構 CGI
(Common Gateway Interface)亦或內嵌式網頁,大部分的邏輯程式都在是在客戶端執行,這類的應用程式在一隻程式中囊括了使用者介面(User Interface)與邏輯程式(Business Logic),這類的程式非常的臃腫,往往造成網站系統極大的負荷。為了減輕伺服器處理連線的負擔,更多的功能以預存程序 (Stored Procedure) 的型式或是利用像 Oracle 的 PL/SQL 將企業邏輯應用程式由用戶端轉移到資料庫中執行,雖然這樣可以減輕應用程式伺服器的的負擔,但相對系統的平台將被囿困在資料庫上,而失去跨平台的特性。一般簡單的主從架構沒辦法處理大型企業網站以及能夠快速反應的應用系統也沒辦法提供具有完善封裝性質的程式,以致於維護上會造成極大的困擾。諸如更新企業邏輯程式、修正頁面中的某個 Bug 、移植程式至其他平台等等。
Enhydra 是一套先進的 Java Application Server。藉由 Java 的特性,Enhydra 善用物件導向技術將各個物件做成封裝的元件。在架構圖中,我們很清楚的可以見到 Enhydra 提供了 Two tier 到 N-tier 的開發環境 (Framework),從邏輯來看,分別是後端的 Data Services,中間層的 Business Logic 和負責使用者介面的Presentation Logic。三層式運算架構 (Three Tier Architecture) 的相關技術於 90 年代開始在業界顯露頭角,目的在克服主從式架構的瓶頸,在主從式的架構上多一層中間層。
在應用程式伺服器(Application Server)執行,可以分散主伺服器端與用戶端的運算負擔,加強軟體的性能、彈性(flexibility)、維護性(maintainability)、可重用性(reusability)、與擴張性(scalability)。
應用程式伺服器有點接近 於 MIT 在 80 年代所設計的X Window
系統。在 X 視窗系統中,目的是在讓圖形使用者介面 (GUI) 可以顯示在使用者桌面上(註: 當然在 X 視窗系統架構中,GUI 的顯示是放在圖形伺服器上(Graphic Server),而應用程式是使用者端。),但將核心的程式邏輯放置在共享的主機上,而且程式也是在共享主機上執行的。應用程式伺服器與大型電腦架構下相似的是,應用程式伺服器無須憂心圖形使用者介面程式,而只需要提供共通的語言(例如: HTML、WML)供使用者端顯示。相同一套的邏輯程式也可同時提供不同的使用者端顯示(例如:網頁瀏覽器、WAP 手機、Palm、STB,甚至是IA等資訊家電產品)。
您可以參考 Enhydra 應用程式伺服器架構圖。三層式運算架構的三層分別是使用者介面層(視覺呈像邏輯)、商業邏輯層與資料邏輯判斷層。 所謂的視覺呈像物件(Presentation Objects) 包含了邏輯資訊的使用者介面、以及使用者輸入、輸出的互動,也含括了簡單的輸入控制與認證。商業邏輯物件(Business Objects) 則是代表程式中邏輯運用的函數或程序,BO 通常會由 PO 或是另外一個 Business Object呼叫使用。資料物件(Data Objects) 是程式與資料儲存系統(像是關聯式資料庫)的介面,DO 會由 BO 呼叫使用,用來儲存使用者輸入的資訊。Enhydra 中提供開發 N-tier Web Application 的多項工具與機制。
當你使用 Application Wizard 創造一個新的 Enhydra 應用程式的專案目錄時,會產生預設的 Makefile 與數個檔案夾。這些檔案夾裡面包含 presentation、business 和 data ,這三個將會是未來開發放置物件類別原始碼的檔案夾,你可以充分的利用這樣的目錄結構製作大量可以共享重用的物件。在以下的文件,這三種層級(tier) 的物件將分別被稱為 PO (Presentation Object)、BO(Business Object)、DO(Data Object)。
簡單的說, Enhydra 是一個 "Super Java Servlet",在標準的Java Servlet API上再封套上屬於 Enhydra 特有的 API。Java Servlet 簡言之,是以Java 語言為主,主要用途是在開發Web-Based 應用程式的一項技術,可以動態的在伺服器上擴充功能,Java
Servlet 是美商昇陽公司所定義規範符合於 Java 平台的一個延伸 API。Enhydra 架構設計的本意是提供程式開發者可以輕易擴充原有的元件,但也可存取較為低階的伺服器技術,例如使用標準的 Java Servlet API。
Enhydra 在Presentation Layer 中提供一個機制載入並執行呈像物件 (Presentation Objects),這個機制叫做呈像物件管理員 (Presentation Manager)。在每個 Enhydra Application 中呈像物件管理員是獨立且唯一的。它介於伺服器與Java Servlet 之間,負責處理使用者對網頁伺服器的要求與回應,轉換 Url (*.po) 載入相對應的Java Class,並具有快取(Cache) Presentation Objects 的能力。
值得一提的是,Enhydra 實做了相當完善的 Session 機制,這套系統被稱為Session Manager,Session Manager 也是 Enhydra Application Framework 的一部份,這個管理員自動給使用者 Cookie 並創建一個 Session 物件。Session Manager 在一台伺服器上,維護不同網頁間的使用者認證、資訊與狀態。呈像物件管理員(Presentation Manager) 也會負責給予 Session key,讓程式設計師利用這組鍵取得Session的資料。
一個Session 代表同一個使用者對伺服器不斷存取的一段區間,每個不同的使用者會擁有其個人獨立的 Session 物件,這個物件會在系統中存活,直到確認使用者離開系統。在 Session 物件中是 “SessionData” 物件,這個物件具有很大的彈性,可被放入任何的物件,例如一個購物車的物件。這樣的機制依賴著 Cookie 或是 Url Rewriting的技術。這個 Cookie 的內容是以亂數產生,可被用來當作安全的身分確認用途,每個使用者的資訊不會因為Cookie被竊取而洩漏,所有的資料只會被保留在應用程式伺服器中。
當資料是整個站所應該共享擁有的的物件,那麼這個物件應該被攝至於主要的伺服器中。當某些資料是單一使用者所單獨擁有,那麼這些資訊應該儲存在 SessionData 中。當資訊僅在某個網頁特別提供的,那麼這個資訊應該被寫在網頁的模板中。藉由 Session Manager ,可以在網頁間輕易的共享各個session 的資訊與狀態,追蹤使用者的行為與動向不再是無跡可循。在 Enhydra 內,session 的資料可以儲存於記憶體,或是硬碟、資料庫中與其他的 Enhydra Application Server 共享。
除了API 部分,Enhydra 還有兩大工具,可以提供程式設計開發者強大的 PO開發能力。一個是 Enhydra XMLC ,另一個則是 Enhydra JDDI。
Enhydra JDDI 技術提供了一個內嵌式語言的網頁開發環境,提供程式設計師在靜態網頁中運用 Java 撰寫動態文件的技巧,只消利用<JDDI>這樣的標籤,即可隨意的抓取 Java 物件的資訊,整合進網頁中。也可以利用特別的內嵌符號,置換資料內容,例如 @cgiArgs.Key@,可以取得使用者所填寫在表單內的輸入值。內嵌Java之動態網頁,是在伺服器上的 JVM (Java Virtual Machine) 載入執行的,並不會有耗費使用者端瀏覽器資源與網路連結的安全問題。這樣的技術可以用在使用模組化的網頁,或是提供網頁設計師一個整合Java 與靜態網頁的方式。在編寫 JDDI 的 Presentation Objects 時,必須使用 JDDIC (JDDI Compiler)去編譯副檔名為 “.jHTML” 的原始檔。JDDIC會將 “.jHTML” 檔案編譯成類別檔,而分別為獨立的PO。
XMLC 的全名是 XML Compiler ,XMLC是一隻獨立的程式,它可用來解析獨立的XML(Extensible Markup Language)檔案,並將 XML的文件結構轉換成樹狀結構的 Java Object 。你可以利用這些 XMLC產生出來的物件當作網頁的模板,XMLC使用DOM(Document Object Model)來提供存取 XML 的方式。
DOM是一種文件物件模式,文件物件模式是一個應用程式介面,用以描述文件架構,所以網站建置者可依照標準的方式存取及操作物件,一個 XML 格式的檔案,對應到這個模型上,將成為一個樹狀的結構。你將可以使用一個內含假資料的HTML 檔為模板,使用 DOM 樹模型來修改、複製、刪除檔案內容。這樣的好處是網頁模板與邏輯程式可以輕易的切開成兩個部分,不會有網頁(HTML)中夾雜程式碼而難以維護網頁的問題。您甚至可以繼承PO,許多的網頁版面也可被繼承重複使用,大量減少重複開發的時間。
在後端的資料存取方面,Enhydra 與關聯式資料庫的整合工具非常的完善。資料庫應用程式必須處理資料庫型態與Java型態的轉換。交易過程(Transaction handling)的處理,大多數的資料庫應用需要同時容納多個使用者上線,你比須注意多個使用者同時存取一筆資料的情況,交易處理(Transaction handling)可以確保使用者的資料不至於因為多人同時存取而亂掉。
Enhydra 使用 JDBC (Java Database Connecivity) 標準的 Java API 負責資料庫的處理,例如MySQL、Oracle、PostgreSQL、Informix、Sybase、Microsoft SQL Server 和 InstantDB。透過JDBC的抽象介面,可以同時使用或輕易的轉換異質資料庫(當然他們必須先行支援JDBC才行)。
Enhydra 提供了 Data Object Design Studio(以下簡稱DODS),一個圖形化使用者介面的設計工具,你可以利用它來設計 Data Layer的物件以及產生原始碼。根據你的需求,可以設定每個不同的需要增加資料物件與各種屬性欄位。每個DO都有不同的屬性與欄位,藉由滑鼠的拖拉點選,可以快速的設定出不同的屬性的欄位,例如一個 String、Date,也可輕易的將某欄位直接關聯指向 (reference) 到另外一個資料物件而使兩個不同的 DO 成為互相聯繫的體系。你也可以產生繼承於其他 DO的物件,甚至設置抽象(abstract)的 Data Object,也可以在 DODS 中設定對後續使用者的資料物件是否需要暫存等功能。
最後,DODS會產生出所有物件的原始碼,包括關聯式資料庫的SQL結構子句,DO的原始碼,還有處理查詢 DO 所使用的 Query 物件,另外還有一種 BDO (Business Data Object) 的物件。
這裡所說明的 DO 原始碼是一個很重要的物件,提供分別的 Data Object 每個屬性 “set” 和 “get” 等存取方法,利用 DO 就可以直接使用 “setSomeThing()” 方法設定每個屬性(Attribute)的值,利用 “getSomeThing()” 的方法取屬性的值。每個被 DODS 產生的 DO 除了產生你所設定的屬性外,另外會有兩個特別的欄位是給Enhydra Data Framework 所使用的,分別是 “oid” 與 “version”。這個 oid 是 Object ID 的意思,在Enhydra 中每個資料物件的 Object ID累加的方式都不一樣,當你試圖去創建一個新的資料物件時,Enhydra 會自動發給這個物件新的 Object ID,你可以利用 Object ID 辨別每個不同的資料物件。”version” 這個欄位,會記錄你對這個欄位的修改次數,每次你編修這個資料物件,該物件的版本會被自動加一,當多個元件存取同一份物件的時候,資料服務管理員(Data Manager) 系統會判斷出物件的版本,並防止同時更動資料物件,造成舊資料覆蓋新資料的情況發生。
Query 物件則是用來查詢關聯式資料庫中的每一個 Table。Query 物件將所蒐循資料庫中所有的資料,並取回一串(可以依次取回資料,也可一次取回一個陣列的物件)在資料庫中所找到的資料。而 Business Data Object 是介於 Business Logic 和 Data Layer 之間交談的一種物件。BDO 物件是你在使用 BO 讀取 DO 時的一個很好媒介,意思上來說,就是企業邏輯物件(Business Objects)與資料物件(DataObject)的膠水。當你的物件具有多對一的關聯特性時,BDO亦會產生便利的搜尋方法(method)去取得所有相關的物件 如果你的物件中擁有多對多的特性,你除了可以得到便利的方法,也可以使用現成的方法(method)在物件間”map” 或是 “unmap” 互相間的關係。
Enhydra 中的資料服務管理員(Data Manager)實做了資料庫連結池 (Database connection pool )的機制,並可容許設定資料庫連結數量的大小。所有的Database 存取都是統一先由資料服務管理員自 JDBC 池(Pools of JDBC) 中取得資料庫連線,經由資料服務層抓取數據物件,加快了速度上的存取。除了資料庫連接池的機制,資料服務管理員也會將 SQL 查詢語句做暫存(Cache)。系統並可以使用資料服務管理員存取多個不同的資料庫系統。善用這些工具,程式設計師無須再自行設計 JDBC 與 SQL 間的語句,只要直接使用這些物件即可。系統也會為您處理關聯式資料庫與 Java 物件的轉換。(註:您也可以透過資料庫管理員直接取得資料庫的連結,進而自己撰寫 SQL Query)。
此外 Enhydra 提供了一個異動功能(Transaction)。 當系統的程式運行中,我們不會希望因為交易的過程改變,或系統發生不可預期的錯誤,而造成資料庫的資訊錯誤。Enhydra 提供 ”DBTransaction” 之類別,提供應用程式軟體層次的插入、修改、刪除等提交(commit) 與撤銷(rollback)等功能。每個 DO 在被創造後,所有的動作都在 DBTransaction 的監控下運作,直到程式下達提交的指令。如此可避免由於交易動作錯誤所導致的系統誤判,破壞資料庫內的資料,大幅的增加系統的容錯性。
今天,我們對 Enhydra Three Tier 的設計架構做了一個比較詳細的描述,您應該開始試著去學習 N Tier 架構的開發環境,試著清晰的分隔三種層級的程式碼,透過完善的資料封裝,建立簡潔的程式碼、易於維護且功能強悍的殺手級商業網站。在未來的章節中,我們會依序一一的介紹每種API與工具的使用方法。