(以前寫(xiě)的一篇文章)
最近一直在關(guān)注ICE(
http://www.zeroc.com/),不得不說(shuō)其功能的強(qiáng)大,我主要看重幾個(gè)點(diǎn):
1.多語(yǔ)言支持,C++,Java,C#,Objective-C,Python,Ruby,PHP。
2.高級(jí)RPC,同時(shí)支持同步調(diào)用和異步調(diào)用,由于RPC是在ICE框架環(huán)境下運(yùn)行的,所以穩(wěn)定性和可靠性可以保證。在服務(wù)端內(nèi)部使用會(huì)非常方便,比如將ICE前置在數(shù)據(jù)庫(kù)之上,所有對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)方式就成了RPC
3.對(duì)分布式系統(tǒng)的支持-ICEGrid,涵蓋了負(fù)載均衡,位置服務(wù),計(jì)算節(jié)點(diǎn)“需要時(shí)啟動(dòng)”等眾多特性,更多內(nèi)容可以參考幫助文檔(http://www.zeroc.com/doc/index.html)。簡(jiǎn)單提一下“需要時(shí)啟動(dòng)”,就是說(shuō)某個(gè)client調(diào)用了節(jié)點(diǎn)Node1,如果Node1此時(shí)沒(méi)有啟動(dòng),則ICE負(fù)責(zé)將他啟動(dòng),這個(gè)過(guò)程對(duì)client來(lái)說(shuō)是透明的。 假如計(jì)算節(jié)點(diǎn)的邏輯上存在bug,觸發(fā)bug會(huì)引起節(jié)點(diǎn)退出。通常的做法是自己寫(xiě)一些監(jiān)控程序,如果發(fā)現(xiàn)節(jié)點(diǎn)不在了重啟動(dòng),利用ICEGrid后,就避免了這個(gè)問(wèn)題
4.提供了基于發(fā)布-訂閱機(jī)制的消息組建ICEStorm
上面只是我關(guān)注的幾點(diǎn),更多的功能特性,請(qǐng)參考幫助文檔! 下面以python作為web的開(kāi)發(fā)后端,來(lái)調(diào)用python寫(xiě)的ICE服務(wù),注意ICE服務(wù)可以是其他語(yǔ)言編寫(xiě)的,這個(gè)例子是修改的ICE提供的demo(D:\libs\Ice-3.3.1\demopy\book\printer),主要的功能是
(1)client通過(guò)瀏覽器打開(kāi)某個(gè)python頁(yè)面
(2) python頁(yè)面調(diào)用ICE基礎(chǔ)服務(wù)
(3)python頁(yè)面將結(jié)果通過(guò)瀏覽器返回給client
一。接口文件Printer.ice內(nèi)容如下:
#ifndef SIMPLE_ICE
#define SIMPLE_ICE
module Demo
{
interface Printer
{
string echo(string s);
};
};
#endif
二。Server.py內(nèi)容如下:
import sys,traceback,Ice
Ice.loadSlice(’Printer.ice’)
import Demo
class PrinterI(Demo.Printer):
def echo(self, s, current=None):
print s
return s
status = 0
ice = None
try:
ic = Ice.initialize(sys.argv)
adapter = ic.createObjectAdapterWithEndpoints(”SimplePrinterAdapter”, “default -p 10000″)
object = PrinterI()
adapter.add(object, ic.stringToIdentity(”SimplePrinter”))
adapter.activate()
ic.waitForShutdown()
except:
traceback.print_exc()
status = 1
if ic:
# Clean up
try:
ic.destroy()
except:
traceback.print_exec()
status = 1
sys.exit(status)
三。echo.psp內(nèi)容如下:
<%
import sys, traceback, Ice
import Demo
status = 0
ice = None
try:
ic = Ice.initialize(sys.argv)
base = ic.stringToProxy(”SimplePrinter:default -p 10000″)
printer = Demo.PrinterPrx.checkedCast(base)
if not printer:
raise RuntimeError(”Invalid proxy”)
sEcho = printer.echo(”Hello ICE!”)
print sEcho
except:
traceback.print_exc()
status = 1
if ic:
# Clean up
try:
ic.destroy()
except:
traceback.print_exc()
status = 1
%>
<%=sEcho%>
四。運(yùn)行過(guò)程:
1.啟動(dòng)ICE服務(wù):python Server.py
2.啟動(dòng)Apache
3.瀏覽器中輸入http://localhost:8080/echo.psp
4.此時(shí)瀏覽器中顯示:Hello ICE!