了解最新公司動態(tài)及行業(yè)資訊
J2EE 平臺提供了一種基于組件的方法來設(shè)計(jì)、開發(fā)、組裝和部署企業(yè)應(yīng)用程序。它還提供了多層分布式應(yīng)用模型、組件重用、一致的安全模型和靈活的事務(wù)控制模型。近年來,它已在企業(yè)系統(tǒng)中大量使用。隨著 J2EE 應(yīng)用服務(wù)器的大規(guī)模部署和客戶訪問量的激增。企業(yè)對J2EE系統(tǒng)的可擴(kuò)展性和高可用性的要求越來越高,尤其是在電子商務(wù)和金融領(lǐng)域,這個(gè)問題也越來越突出。如何設(shè)計(jì)和構(gòu)建具有可擴(kuò)展性和高可用性的J2EE集群應(yīng)用服務(wù)器已經(jīng)成為J2EE應(yīng)用服務(wù)器設(shè)計(jì)中必須考慮的問題。但是J2EE應(yīng)用服務(wù)器集群是基于EJB組件的集群,與常見的Web集群技術(shù)有很大不同。實(shí)現(xiàn)的方法也有本質(zhì)的不同。
1 集群系統(tǒng)功能
集群系統(tǒng)是一組松散組合的服務(wù)器,它們組成一個(gè)虛擬服務(wù)器,為客戶端用戶提供統(tǒng)一的服務(wù)。對于這個(gè)客戶端,它在訪問集群系統(tǒng)時(shí)通常不會意識到它的服務(wù)是由哪個(gè)特定的服務(wù)器提供的。集群系統(tǒng)一般應(yīng)具備高可用性、可擴(kuò)展性、負(fù)載均衡、故障恢復(fù)和可維護(hù)性等特殊屬性。
高可用是集群系統(tǒng)最基本的要求,是對整個(gè)系統(tǒng)穩(wěn)定性的評價(jià)。可擴(kuò)展性是指隨著客戶端用戶數(shù)量的增加,整個(gè)系統(tǒng)繼續(xù)保持有效響應(yīng)時(shí)間的能力。在可擴(kuò)展性系統(tǒng)中,隨著用戶數(shù)量的增加,有效響應(yīng)時(shí)間變長,呈線性變化,這也反映了系統(tǒng)的峰值負(fù)載處理能力。有效預(yù)測訪問的峰值負(fù)載已成為不可能。用戶訪問量的急劇增加使得系統(tǒng)的有效響應(yīng)時(shí)間非線性變化,響應(yīng)時(shí)間急劇增加,直至系統(tǒng)不堪重負(fù)而停機(jī)。一般的解決方案是升級系統(tǒng)硬件系統(tǒng),或者增加服務(wù)器。但是,不合理地增加服務(wù)器,只能讓整個(gè)集群系統(tǒng)變得越來越大。系統(tǒng)的復(fù)雜性意味著系統(tǒng)的故障率會增加服務(wù)器運(yùn)維技術(shù),整個(gè)系統(tǒng)的可靠性和可維護(hù)性會降低。
因此,一個(gè)系統(tǒng)的可用性和可擴(kuò)展性是一個(gè)矛盾的關(guān)系,與整個(gè)集群系統(tǒng)的實(shí)現(xiàn)方式有很大關(guān)系。
2 EJB 技術(shù)
EJB 是J2EE 應(yīng)用平臺的核心。 Sun 在 EJB2.0 規(guī)范中對 EJB 的定義如下: EJB 是一種跨平臺的組件架構(gòu),用于開發(fā)和部署多層、分布式、面向?qū)ο蟮?Java 應(yīng)用系統(tǒng)。共有三種類型的 EJB 組件:會話 bean、實(shí)體 bean 和消息驅(qū)動 bean。會話 bean 有兩種類型:有狀態(tài)和無狀態(tài)。
EJB 服務(wù)器的核心是提供一個(gè)或多個(gè) EJB 容器 ( ) 供 EJB 使用。 EJB容器管理它所包含的EJB,為EJB組件的生存和執(zhí)行提供運(yùn)行環(huán)境,同時(shí)還負(fù)責(zé)EJB事務(wù)管理、安全管理、資源訪問控制和一些異常處理。 EJB 容器不允許 J2EE 客戶端程序直接訪問容器中的 EJB 對象。當(dāng)客戶端用戶想要訪問 EJB 時(shí),EJB 規(guī)范要求客戶端使用 Java 名稱和目錄接口 JNDI(Java 和 )API 來定位 Bean 的主接口。訪問一個(gè) EJB 通常需要以下三個(gè)步驟(見圖 1)(僅下面列出的調(diào)用):
1) 從 JNDI 中查找 bean 的主接口。首先,客戶端需要獲取一個(gè)JNDI初始化上下文,然后客戶端可以使用上下文方法從一個(gè)名字映射到它的home接口;
2)在home接口中使用()方法獲取Bean的接口引用;
3)通過接口中的方法使用Bean中定義的方法;
一個(gè)簡單的訪問示例如下:
// 獲取JNDI初始化上下文
= 新 ( );
// 查找 MyEJB 并獲取對 Home 對象的引用
= .("MyEJB");
// Home 對象被建模為 RMI-IIOP 對象
家=
()(, .Class);
//創(chuàng)建EJB對象,返回接口
myref = home.();
//通過接口調(diào)用EJB中實(shí)現(xiàn)的方法
.out.(myref.());
3 EJB 服務(wù)器集群
EJB服務(wù)器集群是一種基于組件的集群方式,與普通的Web集群技術(shù)有很大不同。實(shí)現(xiàn)的方法也不同。另外,由于EJB規(guī)范沒有提供任何支持集群的標(biāo)準(zhǔn),即使有些廠商在EJB服務(wù)器中提供集群特性,如何實(shí)現(xiàn)集群也是廠商自己決定的。實(shí)施的方法也各不相同。目前大部分J2EE應(yīng)用服務(wù)器都提供集群功能,如Bea應(yīng)用服務(wù)器、開源JBoss應(yīng)用服務(wù)器、公司提供的J2EE應(yīng)用服務(wù)器等。在EJB服務(wù)器集群的設(shè)計(jì)中,負(fù)載均衡(Load)、EJB集群和集群技術(shù)是設(shè)計(jì)中涉及的主要技術(shù)。 EJB集群的實(shí)現(xiàn)是整個(gè)系統(tǒng)實(shí)現(xiàn)的核心。
3.1 負(fù)載均衡(Load)
Load的主要目的是將訪問系統(tǒng)的負(fù)載分散到不同的機(jī)器上,從而提高整個(gè)系統(tǒng)的吞吐量和并發(fā)性。它允許多臺服務(wù)器共享一些繁重的計(jì)算或I/O任務(wù),從而消除網(wǎng)絡(luò)瓶頸,提高網(wǎng)絡(luò)的靈活性和可靠性。常用方法如下:
l 輪詢 DNS
DNS負(fù)載均衡是一種簡單有效的方法,使用簡單的域名查詢IP地址來實(shí)現(xiàn)簡單的負(fù)載均衡。給定任何地址,DNS 服務(wù)器都有一個(gè)與之對應(yīng)的 IP 地址池。每次請求將域名轉(zhuǎn)換為 IP 地址時(shí),都會循環(huán)回到 IP 地址池中的下一個(gè)地址。因此,它被稱為 DNS 循環(huán)。當(dāng)進(jìn)行訪問時(shí),請求 JNDI 的客戶端會被傳遞一個(gè) DNS 名稱作為命名服務(wù)器的 URL。每個(gè) DNS 名稱都被轉(zhuǎn)換為不同的地址。使用這種技術(shù),每個(gè)客戶端請求都被直接發(fā)送到不同的地址。在服務(wù)器上。負(fù)載均衡的一個(gè)主要缺點(diǎn)是一旦服務(wù)器出現(xiàn)故障,即使及時(shí)修改了DNS設(shè)置,仍然需要等待足夠長的時(shí)間(因?yàn)镈NS需要一定的刷新時(shí)間)才能生效。在此期間,部分客戶端用戶訪問仍會在故障服務(wù)器上發(fā)送。
l 軟件代理
軟件代理維護(hù)與一系列服務(wù)器的開放連接。訪問服務(wù)器時(shí),首先要經(jīng)過軟件代理,軟件代理可以通過一些負(fù)載均衡算法(如DNS Round-robin、隨機(jī)方法、訪問均衡算法)重定向用戶對服務(wù)器的訪問。這種軟件代理方式可以及時(shí)發(fā)現(xiàn)服務(wù)器崩潰或無響應(yīng),有效避免DNS輪詢方式中的錯(cuò)誤訪問。
l 硬件均衡器
這種硬件均衡器一般采用地址轉(zhuǎn)換技術(shù),將一個(gè)外部IP地址映射為多個(gè)內(nèi)部IP地址,并為每個(gè)TCP連接請求動態(tài)使用其中一個(gè)內(nèi)部地址,以達(dá)到負(fù)載均衡的目的。一般可以用第四層(或以上)的開關(guān)來實(shí)現(xiàn)。該交換機(jī)是根據(jù)IP地址和TCP端口交換虛擬連接,直接將數(shù)據(jù)包發(fā)送到目的計(jì)算機(jī)的相應(yīng)端口。通過交換機(jī),可以將來自外部的初始連接請求關(guān)聯(lián)到多個(gè)內(nèi)部地址,從而建立虛擬連接,實(shí)現(xiàn)負(fù)載均衡。這種第四層交換是基于硬件芯片的,所以網(wǎng)絡(luò)傳輸速度和交換速度都遠(yuǎn)超普通的軟件代理方式。比如使用Cisco CSS 11150(一個(gè)L4)可以實(shí)現(xiàn)硬件均衡。
3.2 EJB 集群技術(shù)
要訪問 EJB 容器中的 EJB,客戶端必須首先訪問 JNDI 命名服務(wù)器 [參見第 2 節(jié) EJB 技術(shù)]。因此,J2EE的EJB服務(wù)器實(shí)現(xiàn)集群()的核心也是圍繞著JNDI展開的。根據(jù)系統(tǒng)中JNDI命名樹的管理和組織方式不同,一般的EJB集群可以分為以下三種:
1)JNDI 樹代理(代理)
每個(gè) J2EE 中
維護(hù)自己的本地私有JNDI樹,里面的每臺服務(wù)器都不知道其他服務(wù)器的狀態(tài)和存在,只有Proxy服務(wù)知道里面每臺服務(wù)器的狀態(tài),可以訪問里面的任意一臺JNDI樹上的服務(wù)器,這就要求每臺服務(wù)器在啟動和啟動后都與Proxy服務(wù)保持聯(lián)系,以便Proxy知道自己的工作和所有的EJB對象。要訪問 EJB 對象,您必須首先訪問 JNDI 代理。通過 Proxy,您可以重定向?qū)λ?EJB 對象的訪問(參見圖 2))。這種方法的優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,只需要設(shè)計(jì)一個(gè)JNDI Proxy代理即可。對于每個(gè)應(yīng)用服務(wù)器沒有復(fù)雜的要求;系統(tǒng)具有良好的可擴(kuò)展性。要升級系統(tǒng),您可以簡單地添加服務(wù)器。但是這種方式有一個(gè)致命的缺點(diǎn),就是如果Proxy服務(wù)出現(xiàn)故障,整個(gè)系統(tǒng)將無法正常工作??煽啃圆?。
2) 集中式 JNDI 樹
當(dāng)使用集中式集群時(shí),整個(gè)集群系統(tǒng)中只有一個(gè)主命名服務(wù)器,負(fù)責(zé)管理和維護(hù)集群中全局的集中式JNDI樹。集群中的所有 EJB 服務(wù)器啟動后,都必須將對象綁定到這個(gè)名稱服務(wù)器,每個(gè) EJB 服務(wù)器不需要維護(hù)自己的私有 JNDI 樹,由這個(gè)主名稱服務(wù)器維護(hù)。如果要將 EJB 部署在集群中的多個(gè)服務(wù)器上,那么每個(gè)服務(wù)器都可以將同一個(gè)主對象綁定到名稱服務(wù)器。當(dāng)客戶端向名稱服務(wù)器請求訪問該 EJB 的 home 對象時(shí),所有 home 對象都可以將對象引用返回給客戶端,也可以根據(jù)平衡算法返回一個(gè)服務(wù)器的 home 對象引用(見圖 3))。為了提高整個(gè)系統(tǒng)的可靠性,這種集中式的方式必須考慮名稱服務(wù)器的備份問題服務(wù)器運(yùn)維技術(shù),通常在同時(shí)使用多個(gè)名稱服務(wù)器的大型系統(tǒng)中,可以在名稱服務(wù)器之間使用JNDI樹復(fù)制的方式,或者EJB 服務(wù)器可用于綁定多個(gè)服務(wù)器。比如公司的EJB應(yīng)用服務(wù)器就是采用這種方式。 CORBA Cos 集中管理所有應(yīng)用服務(wù)器的 JNDI 樹。使用這種集中式設(shè)計(jì)模式,系統(tǒng)設(shè)計(jì)簡單,但同時(shí)也帶來了集中式系統(tǒng)的固有缺陷。首先,在系統(tǒng)設(shè)計(jì)時(shí),要考慮命名服務(wù)器的備份問題,而隨著集群系統(tǒng)越來越大,整個(gè)系統(tǒng)中命名服務(wù)器的瓶頸問題也越來越突出。
3) 分布式 JNDI 樹
在這個(gè)模型中,每一個(gè)應(yīng)用服務(wù)器都有自己的名字服務(wù)器,名字服務(wù)器不僅維護(hù)一個(gè)私有的本地JNDI樹,還維護(hù)一個(gè)全局共享的JNDI樹。本地 JNDI 樹僅綁定部署在本地應(yīng)用程序服務(wù)器中的對象,而全局 JNDI 樹保存其他應(yīng)用程序服務(wù)器上本地 JNDI 樹的副本。這樣,任何名稱服務(wù)器都可以通過其本地私有和全局共享的 JNDI 樹來訪問,從而在整個(gè)系統(tǒng)中定位和部署 EJB 對象。一般采用多播的形式。其中一臺應(yīng)用服務(wù)器啟動后,加入這個(gè)組播組,然后利用IP組播技術(shù),將自己本地的JNDI樹復(fù)制到全局共享JNDI樹中的其他服務(wù)器上,這樣其他服務(wù)器就可以擁有該JNDI樹的副本它。同時(shí),應(yīng)用服務(wù)器必須在其他服務(wù)器之間保持(心跳)檢測,以便隨時(shí)檢測其他服務(wù)器的活動狀態(tài)。如果一個(gè)服務(wù)器異常崩潰,這個(gè)應(yīng)用服務(wù)器會從它的全局共享JNDI樹中刪除這個(gè)異常服務(wù)器的JNDI副本,其他活動服務(wù)器也必須做類似的操作。這種分布式模型系統(tǒng)最大的優(yōu)點(diǎn)是具有很強(qiáng)的可擴(kuò)展性。如果再向系統(tǒng)添加一臺服務(wù)器,則其他服務(wù)器無法進(jìn)行任何更改。而且整個(gè)系統(tǒng)采用分布式系統(tǒng),增強(qiáng)了可用性,系統(tǒng)中任何一個(gè)服務(wù)器的故障都不會影響整個(gè)系統(tǒng)的正常工作。這種方法也是目前使用最多的設(shè)計(jì)方法。 BEA的應(yīng)用服務(wù)器和JBoss應(yīng)用服務(wù)器采用這種設(shè)計(jì)方式。
24小時(shí)免費(fèi)咨詢
請輸入您的聯(lián)系電話,座機(jī)請加區(qū)號