ICE官方文檔中2.2【The Ice Architecture】章節(jié)翻譯之二 收藏
2.2.3 Slice(Specification Language for ICE)
就像前面提到的,每個(gè)ice對(duì)象都有一個(gè)接口,接口中包括很多的操作;接口、操作、數(shù)據(jù)類型要想在客戶端和服務(wù)端進(jìn)行交互,就需要用Slice語(yǔ)言來(lái)進(jìn)行定義;Slice允許用某種方式定義客戶端和服務(wù)端交互的契約,該契約是與編程語(yǔ)言無(wú)關(guān)的,比如C++、Java、C#;Slice的定義被編譯器編譯成特定編程語(yǔ)言對(duì)應(yīng)的API,也即:針對(duì)定義好的接口、數(shù)據(jù)類型的API內(nèi)容都是由自動(dòng)生成的代碼組成。
2.2.4 Language Mappings
控制每個(gè)Slice構(gòu)造器如何轉(zhuǎn)換成對(duì)應(yīng)語(yǔ)言的規(guī)則被稱為語(yǔ)言映射【Language Mappings】;比如,對(duì)于C++映射(詳見(jiàn)Chapter 6),Slice中的序列【Sequence】以STL vector的形式出現(xiàn);而對(duì)于Java映射(詳見(jiàn)Chapter 10),Slice中的序列以Java array的形式出現(xiàn);為了確定對(duì)于特定Slice構(gòu)造的API看起來(lái)到底像什么,你只需要了解Slice定義、以及Slice語(yǔ)言映射規(guī)則即可;語(yǔ)言映射的規(guī)則非常地簡(jiǎn)單、有規(guī)律性,以至于你根本不需要去閱讀自動(dòng)生成的代碼就可以知道怎樣去使用這些生成的API。
當(dāng)然,你完全可以去閱讀自動(dòng)生成的代碼;但是,一般來(lái)說(shuō)【as a rule】,自動(dòng)生成的代碼還不是非常適合于人的閱讀的;我們推薦你熟練掌握語(yǔ)言映射規(guī)則,這樣你就可以最大限度的忽略自動(dòng)生成的代碼,你只需要關(guān)注那些你很感興趣的一些特定細(xì)節(jié)即可。
目前,Ice對(duì)C++、Java、C#、Python提供語(yǔ)言映射;對(duì)于客戶端,目前還支持PHP、Ruby。
2.2.5 Clients and Servers Structure
Ice客戶端、服務(wù)端都有如下的內(nèi)部邏輯結(jié)構(gòu):
從上圖可以看出,兩者都由應(yīng)用代碼、lib代碼、從Slice定義自動(dòng)生成的代碼這三者一起混合組合:
Ice Core包含客戶端、服務(wù)端為支持遠(yuǎn)程通信而需要的運(yùn)行時(shí);這些代碼關(guān)注的是網(wǎng)絡(luò)、線程、字節(jié)排序、以及其他一些和網(wǎng)絡(luò)相關(guān)的問(wèn)題,這樣就可以讓應(yīng)用代碼遠(yuǎn)離這些問(wèn)題;Ice Core以很多l(xiāng)ib包的形式提供給客戶端、服務(wù)端使用。
Ice Core中的通用部分可以通過(guò)Ice API進(jìn)行訪問(wèn);你可以使用這些API來(lái)處理一些零星的瑣事,比如初始化、關(guān)閉Ice運(yùn)行時(shí);Ice API對(duì)于客戶端、服務(wù)端來(lái)說(shuō)都是一樣的,只是服務(wù)端比客戶端使用API更多。
Proxy代碼是從Slice定義中自動(dòng)生成的,所以他主要是和你在Slice中定義好的對(duì)象、數(shù)據(jù)類型有關(guān);代理代碼主要有兩個(gè)主要功能:
對(duì)于客戶端他提供向下調(diào)用【down-call】的接口;在生成的代理API中調(diào)用一個(gè)功能最終會(huì)以發(fā)送一個(gè)RPC消息請(qǐng)求給服務(wù)端而結(jié)束,服務(wù)端會(huì)在對(duì)應(yīng)的目標(biāo)對(duì)象上調(diào)用一個(gè)對(duì)應(yīng)的功能;
他提供marshaling、unmarshaling代碼
Marshaling是指序列化一個(gè)復(fù)雜對(duì)象的過(guò)程;比如要想傳輸一個(gè)序列,Marshaling代碼會(huì)將數(shù)據(jù)轉(zhuǎn)換成一種可傳輸?shù)臉?biāo)準(zhǔn)形式;
Unmarshaling是Marshaling的逆過(guò)程;也即,當(dāng)數(shù)據(jù)通過(guò)網(wǎng)絡(luò)到達(dá)時(shí)需要反序列化,重新構(gòu)造一個(gè)本地的數(shù)據(jù)類型展現(xiàn)形式,以便適合于編程語(yǔ)言的使用;
Skeleton代碼也是從Slice定義中自動(dòng)生成的,所以他也是和Slice中定義的對(duì)象和數(shù)據(jù)類型有關(guān);存根代碼就相當(dāng)于服務(wù)端的代理代碼;他提供一個(gè)上行調(diào)用【up-call】接口,該接口允許Ice運(yùn)行時(shí)將線程控制權(quán)轉(zhuǎn)向應(yīng)用代碼,存根也提供marshaling、unmarshaling代碼,這樣服務(wù)端就能接收由客戶端發(fā)送過(guò)來(lái)的參數(shù),同時(shí)返回參數(shù)或者異常給客戶端。
Object Adapter是服務(wù)端相關(guān)ICE API中的一部分,只有服務(wù)端才會(huì)使用對(duì)象適配器,一個(gè)對(duì)象適配器主要有以下一些功能:
對(duì)象適配器將客戶端發(fā)起的請(qǐng)求映射到具體對(duì)象的方法上面;換句話說(shuō),對(duì)象適配器根據(jù)對(duì)象標(biāo)識(shí)來(lái)跟蹤到底是哪個(gè)伺服器【servant】。
對(duì)象適配器可以與一個(gè)或多個(gè)傳輸協(xié)議端點(diǎn)關(guān)聯(lián);如果超過(guò)一個(gè)傳輸協(xié)議端點(diǎn)與一個(gè)對(duì)象適配器關(guān)聯(lián),伺服器可以通過(guò)多種傳輸協(xié)議到達(dá);比如,一個(gè)適配器同時(shí)關(guān)聯(lián)了TCP/IP和UDP端點(diǎn),此時(shí)適配器就可以提供可選的Qos和性能特性了;
對(duì)象適配器負(fù)責(zé)創(chuàng)建能夠被傳輸?shù)娇蛻舳说拇恚粚?duì)象適配器知道他的每一個(gè)對(duì)象的類型、標(biāo)識(shí)、傳輸協(xié)議詳情,當(dāng)服務(wù)端應(yīng)用代碼請(qǐng)求創(chuàng)建一個(gè)代理時(shí)對(duì)象適配器只需要將這些信息嵌入即可;
注意到,就關(guān)注的過(guò)程視圖中,過(guò)程中只涉及到兩個(gè)點(diǎn):客戶端、服務(wù)端;為了支持分布式通信,所有的運(yùn)行時(shí)被Ice lib和從Slice定義中生成的代碼提供。
2.2.6 The Ice Protocol
ICE提供的是RPC協(xié)議,他使用TCP/IP、或者UDP作為底層傳輸協(xié)議;除此之外,Ice還允許使用SSL來(lái)作為傳輸協(xié)議,這樣客戶端和服務(wù)端之間的所有通信都是被加密的。
Ice協(xié)議定義如下一些內(nèi)容:
很多的消息類型,比如請(qǐng)求和回復(fù)消息類型;
一個(gè)協(xié)議狀態(tài)機(jī),能夠確定不同消息類型在客戶端和服務(wù)端之間交換信息時(shí)以何種順序進(jìn)行;以及針對(duì)TCP/IP協(xié)議的連接建立以及釋放;
編碼規(guī)則,他決定了每種類型的數(shù)據(jù)在傳輸過(guò)程中的表現(xiàn)形式;
對(duì)每條信息的消息頭,包括詳細(xì)信息有:消息類型、消息尺寸、以及協(xié)議和編碼版本;
Ice也支持傳輸過(guò)程中的數(shù)據(jù)壓縮功能:通過(guò)設(shè)置一個(gè)可配置的參數(shù)即可,這樣你就能壓縮網(wǎng)絡(luò)流量從而節(jié)省帶寬;如果你的應(yīng)用程序在客戶端和服務(wù)端之間有大量數(shù)據(jù)需要交互,那這是非常有用的。
Ice協(xié)議很適合于構(gòu)建高效的事件轉(zhuǎn)發(fā)機(jī)制,因?yàn)樗试S在不知道消息體內(nèi)任何詳細(xì)信息的情況下對(duì)消息進(jìn)行轉(zhuǎn)發(fā);這就意味著消息的轉(zhuǎn)發(fā)不需要任何的消息反序列化和重新序列化【unmarshaling and remarshaling】,他們轉(zhuǎn)發(fā)一條消息,只是簡(jiǎn)單的把他作為一個(gè)不透明的字節(jié)緩沖器而已。
Ice協(xié)議也支持雙向操作:如果服務(wù)端想要發(fā)送一條消息給客戶端提供的一個(gè)回調(diào)對(duì)象,就可以直接通過(guò)由客戶端調(diào)用請(qǐng)求時(shí)創(chuàng)建的那個(gè)原始連接進(jìn)行回調(diào);當(dāng)客戶端位于防火墻之后,而防火墻只允許友好【outgoing】連接、而不允許外來(lái)【incoming】連接訪問(wèn),此時(shí)這個(gè)特性就顯得異常重要了。
2.4 Architectural Benefits of Ice
Ice的架構(gòu)對(duì)應(yīng)用開(kāi)發(fā)者來(lái)說(shuō)提供了很多的好處:
面向?qū)ο笳Z(yǔ)義
Ice全面維持【preserve】面向?qū)ο蟮臉邮健緋aradigm】“Across the wire”;所有的操作調(diào)用都使用后期綁定【late binding】,這樣所有操作的實(shí)現(xiàn)都是依賴于實(shí)際運(yùn)行時(shí)(不是靜態(tài)的【not static】)的對(duì)象類型;
支持同步和異步消息
Ice同時(shí)提供同步和異步的操作調(diào)用和操作分發(fā),通過(guò)IceStorm還可以實(shí)現(xiàn)發(fā)布-訂閱【publish-subscribe】消息;這就允許你去根據(jù)應(yīng)用需要選擇通信模型,而不是一定得讓應(yīng)用程序去適應(yīng)某個(gè)單獨(dú)的模型;
支持多個(gè)接口
通過(guò)facet,對(duì)象能夠提供多個(gè)不相關(guān)的接口,同時(shí)這些接口卻保持著同一個(gè)對(duì)象標(biāo)識(shí);特別地,隨著應(yīng)用的不斷演變,卻需要去保持對(duì)老的、已經(jīng)部署過(guò)的客戶端保持兼容時(shí),對(duì)此Ice就提供了非常好的靈活性;
機(jī)器無(wú)關(guān)性
通過(guò)底層的機(jī)器架構(gòu),客戶端和服務(wù)端是完全隔離的【shield】;類似字節(jié)排序和填充這些問(wèn)題對(duì)于應(yīng)用代碼而言都是隱藏的;
語(yǔ)言無(wú)關(guān)性
客戶端和服務(wù)端能夠獨(dú)立的用不同編程語(yǔ)言開(kāi)發(fā);客戶端和服務(wù)端通過(guò)使用Slice定義來(lái)確定雙方都需要遵循的契約,而這也是雙方唯一需要達(dá)成一致的;
實(shí)現(xiàn)無(wú)關(guān)性
客戶端對(duì)于服務(wù)端如何實(shí)現(xiàn)他們的對(duì)象是不知道的;這就意味著客戶端被部署之后服務(wù)端的實(shí)現(xiàn)仍然可以被改變;比如,可以使用不同的持久機(jī)制,甚至使用不同的編程語(yǔ)言;
操作系統(tǒng)無(wú)關(guān)性
Ice API是非常輕便的,所以相同的源代碼可以在Windows和Unix下面編譯和運(yùn)行;
線程支持
Ice運(yùn)行時(shí)是完全基于線程的,Ice API也是線程安全的;對(duì)需要開(kāi)發(fā)基于線程的、高性能的客戶端和服務(wù)端應(yīng)用程序的開(kāi)發(fā)者而言是不需要什么努力【no effort】的;
傳輸協(xié)議無(wú)關(guān)性
Ice目前支持TCP/IP和UDP作為傳輸協(xié)議,可以通過(guò)配置參數(shù)選擇想要的傳輸協(xié)議;客戶端和服務(wù)端代碼都無(wú)需關(guān)注底層的傳輸協(xié)議;
定位和服務(wù)器透明性
Ice運(yùn)行時(shí)負(fù)責(zé)定位和查找對(duì)象、以及管理底層傳輸協(xié)議機(jī)制,比如打開(kāi)和關(guān)閉連接;客戶端和服務(wù)端的交互就像是沒(méi)有連接一樣;通過(guò)IceGrid,你能夠讓服務(wù)端按需【on demand】啟動(dòng),也即當(dāng)客戶端調(diào)用一個(gè)操作時(shí)服務(wù)端若不在運(yùn)行狀態(tài),此時(shí)服務(wù)器自動(dòng)開(kāi)始運(yùn)行;服務(wù)器還能在不破壞被客戶端持有的代理情況下遷移到不同的物理地址上,此時(shí)客戶端是完全不知道對(duì)象的實(shí)現(xiàn)是如何通過(guò)服務(wù)端進(jìn)程分發(fā)的;
安全性
客戶端和服務(wù)端能夠在具有強(qiáng)大加密功能的SSL協(xié)議下進(jìn)行通信,這樣應(yīng)用程序就能夠在不安全的公共網(wǎng)絡(luò)上進(jìn)行安全的通信了;通過(guò)Glacier2,你能夠穿越防火墻,實(shí)現(xiàn)對(duì)請(qǐng)求的安全轉(zhuǎn)發(fā),而且還對(duì)回調(diào)提供全面支持;
內(nèi)置持久化
有了Freeze,創(chuàng)建持久化對(duì)象實(shí)現(xiàn)變得毫無(wú)價(jià)值;Ice通過(guò)內(nèi)置高性能的Berkeley DB數(shù)據(jù)庫(kù)來(lái)提供支持;
源碼可用性
Ice的源代碼是可用的;雖然對(duì)于使用該平臺(tái)時(shí)看源碼不是必要的,但是他讓你可以知道事情到底是如何完成的;
終上所述,Ice對(duì)于分布式計(jì)算提供了比我們熟知的其他平臺(tái)更加完善的、更具有生產(chǎn)力的【state-of-the art】開(kāi)發(fā)和部署環(huán)境。
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/sfdev/archive/2008/12/07/3468777.aspx