天天看點

ICE概述

網絡通信引擎(Internet Communications Engine, Ice)是由ZeroC的分布式系統開發專家實作的一種高性能、面向對象的中間件平台。它号稱标準統一,開源,跨平台,跨語言,分布式,安全,服務透明,負載均衡,面向對象,性能優越,防火牆穿透,通訊屏蔽。是以相比CORBA,DCOM,SOAP,J2EE等的中間件技術,自然是集衆多優點于一身,而卻沒有他們的缺點。 

Ice提供了完善的分布式系統解決方案,适合所有的異構網絡環境:用戶端和伺服器端可以用不同的程式語言來實作,可以運作在不同的作業系統和不同的體系結構的機器上,使用不同的網絡通信技術(TCP/UDP,SSL或通過插件功能擴充協定)。Ice也提供了用戶端和伺服器端的完全分離,用戶端不需要知道伺服器的實作過程和具體位置。Ice采用軟總線的機制,使得在任何情況下、采用任何語言開發的軟體隻要符合接口規範的定義,均能內建到分布式環境中去。Ice面向對象,可以将所有應用看作是對象及相關操作的集合,建構在Ice之上的分布式系統的對象的擷取隻取決于網絡的通暢性和擷取服務對象特征的準确程度,而與對象的位置以及對象所處的裝置環境無關。

1.2 ICE結構 

Ice是一種面向對象的中間件平台,從根本上說,這意味着Ice為建構面向對象的客戶/伺服器模式的應用提供了工具、應用程式接口(API)和庫支援。 

1.2.1 用戶端和伺服器 

        用戶端是主動的實體,向伺服器端發出服務請求;伺服器端是被動的實體,他們提供服務,響應用戶端的請求。這兩個角色并不是應用系統的組成部分的嚴格指稱,而是表示在某個請求從發生到結束期間,應用系統某些部分所承擔的角色。通常這樣的角色界定是不固定的,甚至會經常性的發生反轉行為。是以,許多客戶/伺服器常可以被準确的描述為對等系統(peer-to-peer),用戶端和伺服器角色隻有在執行某個特定操作、在特定的時間能才有絕對意義。 

1.2.2 Ice核心 

Ice核心包含大量的連結庫,是處于核心地位的對象總線,為用戶端和伺服器的遠端通信提供支援。它主要關心的是網絡通信、線程、位元組序、其它一些網絡細節及相關事務等,并将應用程式與這些底層事務隔離開。 

        Ice核心定義了異構環境下對象透明的發送請求和接收響應的基本機制,是建立對象之間用戶端/伺服器模型的核心元件。它使對象可以透明的向其它對象送出請求或者接收其它對象的響應,這些對象可以位于本地也可以位于遠端機器。Ice核心截獲用戶端的請求調用,找到可以實作請求的伺服器對象,并負責傳送參數、調用相應的方法、傳回結果等。用戶端對象并不需要了解和伺服器對象的通信、激活或存儲服務期對象的機制,也不需要伺服器對象位于何處、用何種語言實作、使用什麼作業系統或其它不屬于對象接口的系統部分。對于伺服器對象,也是如此。 

Ice核心提供一種客戶段/伺服器的松耦合通信方式,使得開發人員可以把更多的注意力放在應用邏輯的實作上。 

1.2.4 對象擴充卡 

       對象擴充卡是專用于伺服器端的Ice  API的一部分:隻有伺服器才使用對象擴充卡。對象伺服器有若幹功能,如下所列: 

1. 對象擴充卡把來自用戶端的請求映射到伺服器端特定對象的特定方法上。 

2. 對象擴充卡會跟蹤在記憶體中的伺服對象,記錄其對象辨別,進而實作适配請求的功能。 

3. 對象擴充卡可以與一個或多個傳輸端點關聯在一起。如果與某個擴充卡關聯的傳輸端點不止一個,就可以通過多種傳輸機制到達在該擴充卡中的伺服對象。為了提供不同的服務品質和性能,一個擴充卡可以同時關聯一個TCP/IP|端點和一個UDP端點。 

4. 對象擴充卡負責建立傳給用戶端的Ice代理。對象擴充卡知道每個對象的類型、辨別以及傳輸機制的詳細資訊。當伺服器端應用程式要求建立代理時,對象擴充卡會在其中嵌入正确的資訊。 

1.2.5 Ice代理 

       代理代碼是由使用者定義的Slice檔案經過編譯後生成的。一個用戶端要想與一個Ice對象建立聯系,必須持有該Ice對象的代理。代理是存在于用戶端位址空間的該Ice對象的代表。代理主要有兩個功能: 

1. 為客戶提供了一個向下(down-call)調用的接口。如果用戶端調用代理中的某個操作,就會有一個RPC消息被發送到伺服器,進而調用目标對象上的某個對應的操作。以代理為中介,用戶端發起的調用最終會調用到伺服器目标對象上相應的操作。 

2. 提供編碼(marshaling)和解碼(unmarshaling)。編碼是将複雜的資料結構串行化,使其便于網絡傳輸的過程。編碼把資料轉化為适合于傳送的标準形式,這種形式不依賴于本地機器的位元組序和填充規則。解碼是編碼的逆過程,将通過網絡得到的串化資料重新構造成具有類型的結構化資料。解碼之後得到的是與所使用的程式設計語言相适應的類型表示的資料。 

1.2.6 Ice骨架(skeleton) 

        骨架代碼也是由使用者定義的Slice檔案經過編譯後生成的,其中的内容與Slice中定義的對象和資料的類型是對應的。骨架代碼是用戶端的代理代碼在伺服器端的等價物。它提供了向上調用(up-call)的接口,允許Ice把控制線程轉交給伺服器端的應用程式代碼。骨架也負責編碼和解碼,是以伺服器可以接收用戶端發送的參數,并把傳回值和異常傳回客戶。 

1.4.1 Ice協定的組成 

        Ice提供了一個RPC(Remote Procedure Call)協定,該協定能夠運作在各種流傳輸和資料報傳輸協定上。目前,該協定支援TCP、UDP和SSL作為底層的傳輸機制。使用SSL協定時,用戶端和伺服器端之間的所有通信都可以進行加密,以確定傳輸的安全性。Ice協定的引擎是可以擴充的,開發人員可以通過增加API插件來增加新的底層傳輸協定,而不用修改源代碼,Ice的SSL傳輸就采用了這種插件結構。Ice協定定義由三個主要部分組成: 

1. 資料編碼規則:确定各種資料類型的串行化方式。 

2. 協定狀态機制:規定用戶端和伺服器如何互動不同類型的資訊。 

3. 版本控制:确定用戶端和伺服器怎樣就特定的協定和編碼版本達成一緻。編碼規則和狀态機制使用各自獨立的版本号,進而保證了良好的向後相容性。 

1.4.4 協定狀态機制 

         Ice隻有五種協定消息,相對于其它通信協定相當簡單。他們分别是: 

     從用戶端發到伺服器的請求; 

     從用戶端發到伺服器的批請求; 

                從伺服器端發到用戶端的答複; 

                從伺服器端發到用戶端的驗證連接配接資訊; 

                雙向發送的關閉連接配接消息; 

在這些消息裡,驗證和關閉連接配接消息隻用于面向連接配接的傳輸機制。 

        和資料編碼一樣,協定消息也沒有對齊限制。除了驗證和關閉連接配接消息。每個消息都由一個消息頭和一個緊跟其後的消息體組成。 

1.5.2 IceGrid 

         IceGrid是Ice定位伺服器的一種實作,它從間接綁定的協定-位址對中将一個間接代理中的符号資訊解析出來,IceGrid除了能夠提供簡單的服務對象定位功能,還提供了一些網格計算的特性。 

        用戶端通過代理發起調用請求,代理分為直接代理和間接代理。直接代理中儲存有伺服器的位址的詳細資訊,使用該資訊,直接代理可以直接連接配接到伺服器。而間接代理中隻包含對象擴充卡的資訊,沒有任何伺服器端的位址資訊。但是,間接代理是一種更為常見的代理方式,因為間接代理支援伺服器的透明遷移,即使伺服器位址改變,用戶端所持有的已有代理也不會失效。如果使用的是直接代理,雖然不用為了定位伺服器而進行額外的查找,但是如果伺服器被轉移到其他機器上,代理就不能繼續工作了。可見定位伺服器在分布式系統中是相當最重要的,可以大大提高系統的靈活性。 

在IceGrid中維護了記錄着對象擴充卡和伺服器位址的對應關系映射表。通過檢索這張表,用戶端就能擷取伺服器端目前的位址資訊,這個過程類似于通過DNS将網絡域名映射成IP位址。通過這種間接代理和IceGrid相結合的方式,伺服器的遷移将不會影響到用戶端的正常工作。 

        IceGrid提供了對象查找的服務,用戶端可用來擷取他們感興趣的對象代理。除此以外,還提供了伺服器激活服務:當用戶端發起請求時,伺服器可能處于未運作狀态,IceGrid會在第一個客戶請求到達時,随需啟動伺服器。通過這個服務,開發人員可以輕松配置包含若幹服務期的複雜應用。 

1.6 Ice架構的優勢 

• 面向對象的語義 

         Ice “線上路上”完全保留了 面向對象範型。所有的操作調用都使用遲後綁定,是以操作實作的標明,是根據對象在運作時的(而不是靜态的)實際類型決定的。 

• 支援同步和異步的消息傳遞 

        Ice 提供了同步和異步的操作調用(AMI)和分派(AMD),并且通過IceStorm 提供了釋出-訂閱消息傳遞機制。這樣,你可以根據你的應用的需要來選擇通信模型,而不必把你的應用硬塞進某種模型裡。 

• 支援多個接口 

        通過facets,對象可以提供多個不相關的接口,同時又跨越這些接口、保持單一的對象辨別。這提供了極大的靈活性,特别是在這樣的情況下:應用在發生演化,但又需要與更老的、已經部署的客戶保持相容。 

• 機器無關性 

        客戶及伺服器與底層的機器架構屏蔽開來。對于應用代碼而言,像位元組序和填充這樣的問題都隐藏了起來。 

• 語言無關性 

        客戶和伺服器可以分别部署,所用語言也可以不同(目前支援C++、Java、.Net、Object-C、Python、Ruby以及PHP (用戶端))。 客戶和伺服器所用的Slice 定義建立兩者之間的接口合約,這樣的定義也是它們唯一需要達成一緻的東西。 

• 實作無關性 

         客戶不知道伺服器是怎樣實作其對象的。這意味着,在客戶部署之後,伺服器的實作可以改變,例如,它可以使用不同的持久機制,甚至不同的程式設計語言。 

• 作業系統無關性 

          Ice API 完全是可移植的,是以同樣的源碼能夠在Windows 和UNIX上編譯和運作。 

       • 線程支援 

                Ice run time 完全是線程化的,其API 是線程安全的。 作為應用開發者,(除了在通路   共享資料時進行同步)你無需為開發線程化的高性能客戶和伺服器付出額外努力。 

       • 傳輸機制無關性 

                  Ice 目前采用了TCP/IP 和UDP 作為傳輸協定。客戶和伺服器代碼都不需要了解底層的傳輸機制(你可以通過一個配置參數選擇所需的傳輸機制)。 

       • 位置和伺服器透明性 

                 Ice run time 會負責定位對象,并管理底層的傳輸機制,比如打開和關閉連接配接。客戶與伺服器之間的互動顯得像是無連接配接的。如果在客戶調用操作時,伺服器沒有運作,你可以通過IcePack 讓它們随需啟動。伺服器可以遷移到不同的實體位址,而不會使客戶持有的代理失效,而客戶完全不知道對象實作是怎樣分布在多個伺服器程序上的。 

        • 安全性 

                通過SSL 強加密,可以使客戶和伺服器完全安全地進行通信,這樣,應用可以使用不安全的網絡安全地進行通信。你可以使用Glacier穿過防火牆,實作安全的請求轉發,并且完全支援回調。 

        • 内建的持久機制 

                使用Freeze,建立持久的對象實作變成了一件微不足道的事情。Ice提供了對高性能資料庫Berkeley DB[18] 的内建支援。 

       • 開放源碼 

        Ice 的源碼是開放的。盡管使用Ice 平台,并不一定要閱讀源碼,但通過源碼你可以了 解各種事情是怎樣實作的,或把這些代碼移植到新的作業系統上。