青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調(diào)做技術(shù)__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

分布式程序開發(fā)平臺ICE概覽

本文基于ICE Manual及相關(guān)文檔就ICE的一些主要特性做一個概覽,它不是一個tutorial,不是一個guid,更不是manual。

概覽

ICE,Internet Communications Engine,按照官方介紹,是一個支持C++、.Net、Java、Python、Objective-C、Ruby、PHP及ActionScript等語言的分布式程序開發(fā)平臺。按照我的理解,簡單來說它是一個核心功能包裝RPC的庫。要把這個RPC包裝得漂亮,自然而然,對于使用者而言,調(diào)用一個遠(yuǎn)端的接口和調(diào)用一個本地的接口沒有什么區(qū)別,例如:

    Object *obj = xxx
    obj->sayHello(); 

ICE包裝sayHello接口,當(dāng)應(yīng)用層調(diào)用該接口時,ICE發(fā)送調(diào)用請求到遠(yuǎn)端服務(wù)器,接收返回結(jié)果并返回給應(yīng)用層。ICE在接口提供方面,做到了這一點。

以下,我將逐個給出ICE中的一些工具、組件、特性說明,以展示它作為一個分布式程序開發(fā)平臺所擁有的能力。到目前為止,所有這些信息均來自于ICE相關(guān)文檔,總結(jié)出來權(quán)當(dāng)為自己服務(wù)。

Slice

Slice(Specification Language for Ice)是ICE定義的一種中間語言,其語法類似于C++。對于一個RPC過程而言,例如上面調(diào)用遠(yuǎn)端的sayHello接口,其主要涉及到調(diào)用這個接口的參數(shù)和返回值傳遞,當(dāng)然接口本身的傳遞不在話下,ICE為了包裝這個過程,其使用了這樣一種方式:使用者使用Slice語言描述RPC過程中調(diào)用的接口,例如該接口屬于哪個類,該接口有哪些參數(shù)哪些返回值;然后使用者使用ICE提供的Slice編譯器(實際上是一個語言翻譯程序)將Slice源碼翻譯成目標(biāo)語言。而這個目標(biāo)語言,則是使用者開發(fā)應(yīng)用程序的開發(fā)語言,即上文提到的C++、.Net、Java等。

這些翻譯出來的目標(biāo)代碼,就封裝了sayHello底層實現(xiàn)的一切細(xì)節(jié)。當(dāng)然事情沒有這么簡單,但我們目前只需關(guān)注簡單的這一部分。ICE之所以支持那么多種開發(fā)語言,正是Slice立下的功勞。Slice語言本身的語言特性,實際上受限于目標(biāo)語言的語言特性,例如Slice支持異常,恰是因為Slice轉(zhuǎn)換的所有語言都包含異常這個語法特性。

Slice還有一個重要特性,在于一份Slice源碼被翻譯出來的目標(biāo)代碼,一般情況是被服務(wù)器和客戶端同時使用。

開發(fā)步驟

使用ICE開發(fā)應(yīng)用程序,其步驟遵循:

  1. 編寫Slice,說明整個RPC中涉及到的接口調(diào)用,編譯它
  2. 基于Slice目標(biāo)代碼和ICE庫編寫Server
  3. 基于Slice目標(biāo)帶啊和ICE庫編寫Client

一個例子

有必要展示一個例子,以獲得使用ICE開發(fā)應(yīng)用程序的感性認(rèn)識。這個例子是一個簡單的hello world程序,客戶端讓服務(wù)器打印一個字符串。

  • 編寫Slice
    // Printer.ice,Slice源碼后綴為ice
    module Demo {
        interface Printer {
            void printString(string s);
        };
    };

使用ICE提供的程序翻譯為C++代碼:

    $ slice2cpp Printer.ice

得到Printer.cpp和Printer.h。Slice翻譯出來的目標(biāo)代碼除了封裝RPC交互的一些細(xì)節(jié)外,最重要的,因為本身Slice文件其實是定義接口,但接口的實現(xiàn),則需要應(yīng)用層來做。

  • 服務(wù)器端使用生成的Printer.cpp/.h,并實現(xiàn)Printer接口
    // 翻譯出來的Printer.h中有對應(yīng)于Slice中定義的Printer類,及需要實現(xiàn)的printString接口
    class PrinterI : public Printer {
    public:
        virtual void printString(const string& s, const Ice::Current&) {
            count << s << endl;
        }
    };
  • 客戶端使用生成的Printer.cpp/.h,通過ICE獲得一個Printer對象,然后調(diào)用其printString接口
    // don't care about this
    PrinterPrx printer = PrinterPrx::checkedCast(base);
    printer->printString("Hello World!");

使用ICE開發(fā)應(yīng)用程序,整體過程即為以上展示。

概念

ICE包含了很多概念,作為一個開發(fā)平臺而言,有其專有術(shù)語一點不過分,熟悉這些概念可以更容易學(xué)習(xí)ICE。這里羅列一些關(guān)鍵概念。

服務(wù)器端和客戶端

ICE中的服務(wù)器端和客戶端和一般網(wǎng)絡(luò)程序中的概念不太一樣。在若干個交互的網(wǎng)絡(luò)程序中,我們都很好理解這樣一種現(xiàn)象:某個程序有多個角色,它可能是作為A程序的服務(wù)器端,也可能是作為B程序的客戶端。ICE中的服務(wù)器和客戶端角色更容易變換。

以Printer例子為例,如果我們的printString接口有一個回調(diào)函數(shù)參數(shù)(這在ICE中很常見),服務(wù)器實現(xiàn)printString時,當(dāng)其打印出字符串后,需通過該回調(diào)函數(shù)通知客戶端。這樣的回調(diào)機制在ICE的實現(xiàn)中,會創(chuàng)建一個新的網(wǎng)絡(luò)連接,而此時,這個原有的服務(wù)器端就變成了原有客戶端的客戶。當(dāng)然,你也可以避免這樣的情況出現(xiàn)。

ICE Objects/Object Adapter/Facet

對于Printer例子,一個Printer對象可以被看作是一個ICE Objects。Object可以說是服務(wù)器端提供給客戶端的接口。所以在服務(wù)器端通常會創(chuàng)建出很多個Object。服務(wù)器端使用Object Adapter對象去保存這些Object。例如,一個典型的ICE對象在初始化時可能包含以下代碼:

    // 創(chuàng)建一個Object Adapter
    Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Hello");
    // 創(chuàng)建一個Object,形如Printer
    Demo::HelloPtr hello = new HelloI;
    // 將Object加入到Object Adapter
    adapter->add(hello, communicator()->stringToIdentity("hello"));

Facet是Object的一部分,或者說Object是Facet的一個集合,摘Ice manual中的一句話:

An Ice object is actually a collection of sub-objects known as facets whose types are not necessarily related.

Proxy

Proxy是ICE客戶端里的概念。客戶端通過Proxy訪問服務(wù)器端上的Object,通過Proxy調(diào)用服務(wù)器端Object上提供的接口。在客戶端上一般有類似以下代碼:

    Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -p 10000");
    // Printer Proxy
    PrinterPrx printer = PrinterPrx::checkedCast(base);
    printer->printString("Hello World!");

Proxy又分為幾種,包括:

Direct Proxy

Direct Proxy,這里的direct意指這個proxy訪問的object時,是否攜帶了地址(EndPoint)信息,例如上面例子中SimplePrinter:default -p 10000就是一個地址。

Indirect Proxy

Indirect Proxy相對Direct Proxy而言,其沒有具體的地址,僅僅是一個符號。通常包含兩種形式:

  • SimplePrinter
  • SimplePrinter@PrinterAdapter

為了獲取真正的地址,客戶端需要一個定位服務(wù)(location service)來獲取這個符號對應(yīng)的地址。ICE中提供了一些默認(rèn)的服務(wù)程序,IceGrid就是其中之一,而IceGrid的作用就包括定位具體的地址,即翻譯符號地址到具體的地址。

這里Indirect Proxy可以看作一個域名,而Direct Proxy可以看作是IP地址。Indirect Proxy使用時,就需要借助DNS翻譯得到域名對應(yīng)的IP地址。

Fixed Proxy

由于Proxy是用于與服務(wù)器端的Object通信的,客戶端借助Proxy來訪問服務(wù)器端的Object,所以Proxy通常都會對應(yīng)一個真實的網(wǎng)絡(luò)連接。在ICE中,一般的Proxy于網(wǎng)絡(luò)連接(Connection)實際上是沒有太大關(guān)聯(lián)的。一個Proxy可以沒有Connection,也可以在建立這個Connection后又?jǐn)嚅_之。但是,ICE提供了一種特殊的Proxy,F(xiàn)ixed Proxy,這種Proxy緊密地與一個Connection綁定在一起,其生命周期被強制關(guān)聯(lián)起來。

關(guān)于Fixed Proxy可以參看ICE Manual Connection Management。

其他

  • AMI

Asynchronous Method Invocation,對于客戶端而言,用于表示某個服務(wù)器端接口是異步操作,需在Slice中使用metadata來修飾這個接口,例如:

    ["ami"]  void sayHello(int delay)
  • AMD

Asynchronous method dispatch,這個針對于服務(wù)器端,同樣表示這個接口是異步操作,需在Slice中使用metadata來修飾這個接口:

    ["ami", "amd"]  void sayHello(int delay)

通常對于這種異步接口而言,都需要使用Slice metadata amiamd同時修飾。

  • idempotent

idempotent是Slice中的概念,同const一樣用于修飾某個接口的特性。idempotent表示該接口無論調(diào)用多少次,其執(zhí)行結(jié)果都是相同的,例如一般的get類接口。

  • batched invocation

客戶端調(diào)用服務(wù)器端的接口這個動作稱為invocation。就像網(wǎng)絡(luò)層的數(shù)據(jù)緩存一樣,ICE對于接口調(diào)用也可能暫時緩存,當(dāng)多個提交請求緩存起來后,然后調(diào)用刷新接口全部刷新到服務(wù)器端,則稱為batched invocation

服務(wù)

ICE除了提供一個庫之外,還提供了一些應(yīng)用程序。這些應(yīng)用程序本身也是一些服務(wù)器,提供了一些方便的功能方便我們開發(fā)分布式程序。

Freeze

Freeze用于將Slice對象持久化到數(shù)據(jù)庫中,按照Manual里的說法,它應(yīng)該是一個編譯器,可以生成一些持久化操作的代碼。Freeze持久化對象時使用的數(shù)據(jù)庫是Berkeley DB。

Ice has a built-in object persistence service, known as Freeze. Freeze makes it easy to store object state in a database: you define the state stored by your objects in Slice, and the Freeze compiler generates code that stores and retrieves object state to and from a database. Freeze uses Berkeley DB as its database.

FreezeScript有點類似于Rails中的數(shù)據(jù)庫操作工具,可用于操作持久化到數(shù)據(jù)庫中的對象數(shù)據(jù)。

Ice also offers a tool set collectively called FreezeScript that makes it easier to maintain databases and to migrate the contents of existing databases to a new schema if the type definitions of objects change.

IceBox

IceBox可用于管理服務(wù)器中的動態(tài)組件。這些動態(tài)組件本質(zhì)上也是提供服務(wù)的ICE程序。在形式上,這些組件可以是動態(tài)連接庫。

IceBox is a simple application server that can orchestrate the starting and stopping of a number of application components. Application components can be deployed as a dynamic library instead of as a process.

IceGrid

IceGrid相當(dāng)于一個DNS解析服務(wù),可以讓服務(wù)器不用配置EndPoint,客戶端也不用指定服務(wù)器的EndPoint,以方便大量的服務(wù)器部署。在一般的應(yīng)用中,我們需要為ICE服務(wù)器指定綁定的網(wǎng)絡(luò)地址(IP和端口),同時也需要為客戶端指定服務(wù)器端的地址信息。當(dāng)服務(wù)增加到一定數(shù)量時,就會存在管理上和配置上的麻煩。而IceGrid則是用于避免這種麻煩,將服務(wù)器端和客戶端上的地址信息通過一個符號代替,就像我們把Internet上的服務(wù)器使用域名來標(biāo)識一樣。

但I(xiàn)ceGrid的作用不僅如此,通過配合部署一系列稱為IceGrid Node的程序,IceGrid還可以管理各個服務(wù)器的啟動、關(guān)閉、宕機重啟等,其中甚至包括負(fù)載均衡。

IceGrid provides a facility to activate servers on demand, when a client first invokes an operation. Server activation is taken care of by IceGrid nodes. You must run an IceGrid node on each machine on which you want IceGrid to start servers on demand.

簡要介紹可以參看ICE Manual Teach Yourself IceGrid in 10 minutes

Glacier2

Glacier2 is a lightweight firewall traversal solution for Ice applications.

按我的理解,Glacier2就像一個網(wǎng)關(guān)服務(wù)器。它被部署在服務(wù)器和客戶端之間,我們的服務(wù)器群部署在內(nèi)網(wǎng),外網(wǎng)不可訪問,然后通過Glacier2,外部網(wǎng)絡(luò)的客戶端就可以訪問內(nèi)網(wǎng)的服務(wù)器群提供的服務(wù)。

對于服務(wù)器的開發(fā)而言,使用Glacier2,服務(wù)器端不需要做任何改動??蛻舳诵枰渲肎lacier2服務(wù)的地址信息,也需要配置要使用服務(wù)器的地址信息。Glacier2通過客戶端欲訪問的服務(wù)器地址,在內(nèi)網(wǎng)定位到真實的服務(wù)器,并轉(zhuǎn)發(fā)請求提供服務(wù)。

Glacier2支持驗證客戶端,從這一點看來,它又有點像一個驗證服務(wù)器。通過驗證客戶端,以提供被正確授權(quán)的客戶端以完整服務(wù)。

Glacier2的工作過程可以描述為:

When a client invokes an operation on a routed proxy, the client connects to one of Glacier2’s client endpoints and sends the request as if Glacier2 is the server. Glacier2 then establishes an outgoing connection to the client’s intended server in the private network, forwards the request to that server, and returns the reply (if any) to the client. Glacier2 is essentially acting as a local client on behalf of the remote client.

一個Glacier2可服務(wù)于若干個客戶端和服務(wù)器。

詳細(xì)參看ICE Manual Glacier2

管理

ICE服務(wù)器可以提供給外部一定的管理功能,包括:關(guān)閉服務(wù)器、讀取服務(wù)器配置。這個功能是通過操作Ice.Admin這個Ice Object來實現(xiàn)的。這個Object包含兩個Facet:Process和Property,分別對應(yīng)于關(guān)閉服務(wù)器和讀取服務(wù)器配置功能。

對于需要管理服務(wù)器的客戶端而言,可以大致通過如下代碼來完成:

    // 可以通過communicator來獲取這個admin object
    Ice::ObjectPrx adminObj = ...;
    // 獲取admin object里的property facet
    Ice::PropertiesAdminPrx propAdmin = Ice::PropertiesAdminPrx::checkedCast(adminObj, "Properties");
    Ice::PropertyDict props = propAdmin->getPropertiesForPrefix("");

詳細(xì)參看ICE Manual Administrative Facility

連接管理

前已述及,ICE中的網(wǎng)絡(luò)連接隱藏于Proxy之下。Proxy有兩個接口可以獲取這個連接對象:

    ice_getConnection
    ice_getCachedConnection

例如:

    HelloPrx hello = HelloPrx::uncheckedCast(communicator->stringToProxy("hello:tcp -h remote.host.com -p 10000"));
    ConnectionPtr conn = hello->ice_getConnection();

ICE隱藏了網(wǎng)絡(luò)連接的細(xì)節(jié)。當(dāng)ICE發(fā)現(xiàn)需要建立連接時才會去建立,例如以上例子中當(dāng)獲得一個Proxy時(這里是HelloPrx),ICE并不建立網(wǎng)絡(luò)連接,當(dāng)某個時刻通過該Proxy調(diào)用服務(wù)器端的某個接口時,ICE發(fā)現(xiàn)對應(yīng)的網(wǎng)絡(luò)連接沒有建立,則發(fā)起網(wǎng)絡(luò)連接。

以上例子在獲取Proxy時,使用了uncheckCast,關(guān)于checkedCastuncheckedCast,也影響著網(wǎng)絡(luò)連接的建立邏輯:

On the other hand, if the code were to use a checkedCast instead, then connection establishment would take place as part of the checkedCast, because a checked cast requires a remote call to determine whether the target object supports the specified interface.

關(guān)于連接管理,ICE使用了一個稱為ACM的機制,即Active connection management。當(dāng)某個連接非active一段時間后,ICE就會主動關(guān)閉此連接。應(yīng)用層當(dāng)然可以控制這個行為。

詳細(xì)參看ICE Manual Connection Management

posted on 2013-02-15 15:24 Kevin Lynx 閱讀(6468) 評論(0)  編輯 收藏 引用 所屬分類: c/c++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品国产日韩| 欧美视频在线观看 亚洲欧| 欧美高清在线观看| 欧美ed2k| 91久久午夜| 91久久久一线二线三线品牌| 亚洲精品男同| 亚洲女同同性videoxma| 久久久www成人免费无遮挡大片 | 久久网站免费| 欧美插天视频在线播放| 亚洲裸体俱乐部裸体舞表演av| 99riav久久精品riav| 亚洲欧美高清| 美女精品在线| 国产精品久久久久9999高清| 国内精品久久久久国产盗摄免费观看完整版| 黄色免费成人| 一二三四社区欧美黄| 久久高清国产| 亚洲欧洲精品一区二区三区| 午夜精品成人在线| 欧美成人一区二区| 国产日产亚洲精品| 国产主播一区| 久久久久国产精品一区二区| 亚洲第一搞黄网站| 一区二区三区视频在线看| 久久精品动漫| 国产精品成人在线观看| 亚洲精品免费一二三区| 久久久精品一区| 一区二区高清视频| 久久久九九九九| 亚洲一区久久久| 欧美福利在线| 亚洲电影av| 久久久国产精品亚洲一区| 亚洲精品综合精品自拍| 久久久精品日韩| 国产精品日本精品| 亚洲已满18点击进入久久| 欧美激情1区2区3区| 久久xxxx精品视频| 国产精品一区二区a| 亚洲视屏在线播放| 亚洲精选一区二区| 欧美激情一区二区三区蜜桃视频| 1024成人网色www| 久久夜色精品国产欧美乱| 午夜免费日韩视频| 国产精品高清在线观看| 亚洲已满18点击进入久久| 夜夜爽夜夜爽精品视频| 欧美日韩欧美一区二区| 日韩午夜高潮| 亚洲精品在线二区| 欧美四级电影网站| 亚洲欧美日韩国产成人| 这里只有精品电影| 国产精品美女| 欧美专区福利在线| 久久精品在线免费观看| 亚洲成人在线视频网站| 欧美福利视频在线| 欧美国产亚洲精品久久久8v| 99re热精品| 一区二区三区精品视频在线观看| 欧美三级免费| 午夜伦欧美伦电影理论片| 亚洲欧美日韩一区| 激情综合在线| 亚洲日本黄色| 国产精品久久网站| 久久久久久久999| 开心色5月久久精品| 一本久久a久久精品亚洲| 亚洲视频在线观看| 国内久久婷婷综合| 亚洲人成小说网站色在线| 亚洲韩国一区二区三区| 欧美裸体一区二区三区| 午夜精品一区二区三区在线| 久久精品观看| 在线一区二区视频| 欧美韩日一区| 亚洲视频在线一区观看| 欧美亚洲午夜视频在线观看| 亚洲高清视频在线| 亚洲巨乳在线| 狠色狠色综合久久| 亚洲精品影视在线观看| 韩日欧美一区二区三区| 亚洲免费观看| 伊人婷婷欧美激情| 日韩一区二区免费高清| 国产综合第一页| 亚洲国产精品一区二区第四页av | 国产精品视频午夜| 免费看亚洲片| 国产精品久久久久久模特 | 欧美成人中文| 国产精品免费观看视频| 欧美福利一区二区三区| 国产精品网站一区| 亚洲国产精品国自产拍av秋霞| 国产精品视频免费一区| 91久久精品国产91久久性色| 国产日韩欧美精品在线| 日韩一级成人av| 亚洲精品久久7777| 欧美一区二区啪啪| 亚洲一区二区三区免费在线观看| 久热精品视频在线免费观看| 久久激情综合网| 国产精品多人| 亚洲精品在线一区二区| 99国产精品99久久久久久粉嫩| 久久精品人人做人人爽电影蜜月| 亚洲免费一区二区| 欧美日韩在线高清| 亚洲区在线播放| 亚洲区一区二| 美国十次了思思久久精品导航| 欧美一区二区三区四区在线观看地址| 欧美精品成人| 亚洲国产精品黑人久久久| 亚洲大片一区二区三区| 欧美在线精品免播放器视频| 欧美一区二区三区四区在线观看地址 | 亚洲欧美日韩精品久久| 亚洲图片自拍偷拍| 欧美日产在线观看| 最新国产成人av网站网址麻豆| 亚洲视屏一区| 欧美一二三区精品| 国产精品网曝门| 午夜精品三级视频福利| 欧美一区二区三区四区在线| 国产精品一卡二卡| 欧美一区精品| 鲁鲁狠狠狠7777一区二区| 欧美在线高清视频| 欧美一二三视频| 国产欧美三级| 久久精品国产第一区二区三区| 久久成人免费网| 狠狠色香婷婷久久亚洲精品| 久久久免费观看视频| 美女视频黄 久久| 影音先锋成人资源站| 蜜臀av一级做a爰片久久| 亚洲国产日韩欧美| 一本色道久久88综合亚洲精品ⅰ | 国产一区在线视频| 免费成人av| 在线视频日本亚洲性| 欧美在线视频日韩| 亚洲电影av| 欧美天堂亚洲电影院在线观看| 亚洲女性裸体视频| 免费一级欧美片在线播放| 亚洲精品综合在线| 欧美午夜电影完整版| 午夜精品福利一区二区蜜股av| 久久在线观看视频| 亚洲日本无吗高清不卡| 国产精品超碰97尤物18| 久久久精彩视频| 99视频精品在线| 久久在线视频在线| 中文国产一区| 在线观看国产精品网站| 欧美日韩国产高清| 久久成人18免费网站| 日韩视频久久| 免费在线看一区| 亚洲女ⅴideoshd黑人| 亚洲国产精品第一区二区| 国产精品人人做人人爽| 欧美顶级大胆免费视频| 午夜精品理论片| 亚洲乱码久久| 欧美成人精品三级在线观看| 欧美一区二区三区视频免费播放| 日韩视频第一页| 黑人极品videos精品欧美裸| 国产精品地址| 欧美日韩视频在线一区二区观看视频| 久久精品盗摄| 午夜欧美大片免费观看| 一区二区三区不卡视频在线观看 | 日韩视频欧美视频| 欧美+日本+国产+在线a∨观看| 亚欧成人在线| 亚洲色图制服丝袜| 日韩一区二区高清| 亚洲欧洲一区| 亚洲高清不卡一区| 亚洲欧美视频一区|