如何用python開發(fā)Zeroc Ice應(yīng)用
Zeroc Ice簡介
Zeroc ICE(Internet Communications Engine ,互聯(lián)網(wǎng)通信引擎)是目前功能比較強(qiáng)大和完善的RPC框架,支持跨平臺、跨語言調(diào)用。它非常靈活,可以通過TCP、UDP、SSL/TSL或WebSocket連接,支持同步、異步調(diào)用,以及服務(wù)器和客戶端之間的雙向連接。Zeroc ICE的效率非常高,它使用一種高效的二進(jìn)制協(xié)議,對帶寬的消耗比較小。甚至對于通過衛(wèi)星的RPC調(diào)用,Zeroc ICE還可以對數(shù)據(jù)流進(jìn)一步壓縮。另外Zeroc ICE還可以在不解包的情況下轉(zhuǎn)發(fā)調(diào)用請求,省去普通轉(zhuǎn)發(fā)時的解包、重新壓包的時間。
Zeroc ICE的應(yīng)用還可以部署在icegrid上,實現(xiàn)網(wǎng)格計算,即客戶端調(diào)用時不必指定目標(biāo)主機(jī),由ICE負(fù)責(zé)查找;服務(wù)端也可以在調(diào)用時才開啟,動態(tài)加載;同樣的服務(wù)也可以部署多個,實現(xiàn)高可用。
實驗簡介
Zeroc ICE支持跨語言RPC調(diào)用,包括C++、C#、Java、JavaScript、Python、Objective-C、Ruby、PHP、VB等。本次實驗采用Python(Pyhon 2.7以上,或者Python 3都可以)。實驗的內(nèi)容是在icegrid上部署一個簡單的服務(wù)器,當(dāng)客戶端調(diào)用時輸出指定內(nèi)容,并返回一個字符串。實驗步驟如下:
- 安裝Zeroc ICE
- 開發(fā)服務(wù)端和客戶端程序
- 部署到icegrid
- 客戶端調(diào)用
環(huán)境準(zhǔn)備
本次實驗采用的操作系統(tǒng)是Ubuntu 14.04。如果使用其他操作系統(tǒng),可以根據(jù)Zeroc ICE的文檔相應(yīng)調(diào)整。
安裝Zeroc Ice
如果系統(tǒng)中沒有安裝Zeroc ICE,并且ubuntu的軟件源中也沒有zeroc ice,可以按照下面的步驟安裝。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 5E6DA83306132997 sudo apt-add-repository "deb http://zeroc.com/download/apt/ubuntu$(lsb_release -rs) stable main" sudo apt-get update sudo apt-get install zeroc-ice-all-runtime zeroc-ice-all-dev
安裝之后系統(tǒng)中就有了slice2cpp、slice2java等Sliece(Zeroc ICE定義的接口描述語言,IDL)文件到相應(yīng)語言的轉(zhuǎn)換程序,以及icegrid、iceregistry、icegridadmin等程序。如果缺少目標(biāo)語言的工具(例如slice2py)或開發(fā)包,還需要特別安裝。
安裝Zeroc ICE的python開發(fā)包
當(dāng)然在這一步之前應(yīng)當(dāng)首先安裝python和pip(python的依賴管理工具),此處略。Zeroc ICE的python開發(fā)包(或者模塊)叫zeroc-ice,可以使用pip安裝。
sudo -H pip install zeroc-ice
安裝過程中可能出現(xiàn)缺少某些C/C++頭文件的問題,例如缺少python.h、openssl/ssl.h、bzlib.h,這些都是因為沒有安裝相應(yīng)的開發(fā)包??梢酝ㄟ^如下的命令解決:
sudo apt-get install python-dev sudo apt-get install libssl-dev sudo apt-get install libbz2-dev
開發(fā)Server和Client
下面即是真正的服務(wù)端和客戶端開發(fā)。開發(fā)過程通常是:
- 使用Slice語言定義語言無關(guān)的接口文件
- 轉(zhuǎn)換成指定語言的接口文件
- 根據(jù)接口文件開發(fā)服務(wù)端和客戶端程序
- 書寫服務(wù)端和客戶端的配置文件
使用slice語言定義接口
// Printer.ice
module Demo {
interface Printer {
string printString(string s);
};
};
生成指定語言的接口文件
本次開發(fā)采用的語言是python,所以使用
slice2py Printer.ice
其他語言可以依此類推,例如slice2java,slice2cpp。
命令執(zhí)行成功,可以看到在目標(biāo)目錄中生成了一個Printer_ice.py文件,以及一個Demo目錄。Demo是slice接口文件中定義的module名稱。
編寫服務(wù)器
import sys, traceback, Ice
import Demo
# PrinterI是接口實現(xiàn)類,Demo.Printer是slice2py生成的接口
class PrinterI(Demo.Printer):
def printString(self, s, current=None):
print(s)
return "Server Printed: " + s
status = 0
ic = None
try:
# 初始化zeroc ice環(huán)境
ic = Ice.initialize(sys.argv)
# 生成名為SimplePrinterAdapter的對象適配器,連接方式是缺省的tcp,監(jiān)聽端口10000
adapter = ic.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000")
# 生成接口的實現(xiàn)對象,并以指定的名字SimplePrinter添加到對象適配器中
object = PrinterI()
adapter.add(object, ic.stringToIdentity("SimplePrinter"))
# 激活對象適配器
adapter.activate()
# 使得本服務(wù)器的調(diào)用線程在此暫停,直至ice服務(wù)結(jié)束,或者進(jìn)程結(jié)束
ic.waitForShutdown()
except:
traceback.print_exc()
status = 1
if ic:
# Clean up
try:
ic.destroy()
except:
traceback.print_exc()
status = 1
sys.exit(status)
server.cfg內(nèi)容如下:
PrinterAdapter.AdapterId=PrinterAdapter PrinterAdapter.Endpoints=tcp
其中tcp的意思通過tcp協(xié)議調(diào)用,服務(wù)器監(jiān)聽來自tcp協(xié)議的連接請求。
編寫客戶端
import sys, traceback, Ice
import Demo
status = 0
ic = None
try:
ic = Ice.initialize(sys.argv)
# 生成名為SimplePrinter代理對象,且通過tcp調(diào)用,連接目標(biāo)機(jī)器的10000端口
base = ic.stringToProxy("SimplePrinter:default -p 10000")
# 將代理對象轉(zhuǎn)換成目標(biāo)對象
printer = Demo.PrinterPrx.checkedCast(base)
if not printer:
raise RuntimeError("Invalid proxy")
# 調(diào)用服務(wù)器的printString方法,并輸出返回結(jié)果
rs = printer.printString("Hello World, I'm talking to you through RPC")
print(rs)
except:
traceback.print_exc()
status = 1
if ic:
# Clean up
try:
ic.destroy()
except:
traceback.print_exc()
status = 1
sys.exit(status)
客戶端的配置文件如下:
Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 127.0.0.1 -p 4061
客戶端直連服務(wù)端
上述程序開發(fā)完畢之后不用部署到icegrid就可以直接運行,配置文件是用來在icegrid上定位和連接服務(wù)。此時可以一邊運行服務(wù)端,一邊運行客戶端,檢驗一下它們的功能。
python Server.py
運行之后可以看到進(jìn)程并沒有結(jié)束,一直在等待連接。然后另起一個終端,運行客戶端程序。
python Client.py
運行之后可以看到服務(wù)端和客戶端窗口的輸出。
部署到icegrid
icegrid是Zeroc ICE的云計算解決方案。它可以將各種服務(wù)端部署在多臺機(jī)器上,并為客戶端調(diào)用提供服務(wù)定位、服務(wù)激活、負(fù)載均衡、故障轉(zhuǎn)移等服務(wù)??蛻舳酥灰B接到指定的服務(wù)注冊中心,就可以根據(jù)服務(wù)名稱(這里是SimplePrinter),以及連接協(xié)議(Endpoints,這里是tcp)就可以找到相應(yīng)的服務(wù)。服務(wù)在注冊時也不必處在運行狀態(tài),可以由icegrid根據(jù)調(diào)用請求,自動啟動。

配置注冊中心
registry.cfg(服務(wù)注冊中心的配置文件)
IceGrid.InstanceName=SzcIceGrid #客戶端連接到注冊中心的地址 IceGrid.Registry.Client.Endpoints=tcp -p 4061 IceGrid.Registry.Server.Endpoints=tcp IceGrid.Registry.Internal.Endpoints=tcp IceGrid.Registry.PermissionsVerifier=SzcIceGrid/NullPermissionsVerifier IceGrid.Registry.AdminPermissionsVerifier=SzcIceGrid/NullPermissionsVerifier #注冊中心數(shù)據(jù)保存路徑,需要手動創(chuàng)建文件夾 IceGrid.Registry.Data=/home/rocway/test/zerocice/registry IceGrid.Registry.DynamicRegistration=1 Ice.Admin.InstanceName=AdminInstance Ice.Admin.ServerId=Admin
注意:手工創(chuàng)建文件中的路徑。
配置節(jié)點
節(jié)點是服務(wù)所在的機(jī)器。在實際生產(chǎn)環(huán)境中,服務(wù)注冊中心也可以運行在其中某個節(jié)點上。
node1.cfg(服務(wù)所在節(jié)點的配置文件)
# 注冊中心地址 Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 127.0.0.1 -p 4061 #node名 IceGrid.Node.Name=node1 IceGrid.Node.Endpoints=tcp #node存儲路徑 IceGrid.Node.Data=/home/rocway/test/zerocice/nodes/node1 IceGrid.Node.Output=/home/rocway/test/zerocice/nodes/node1 IceGrid.Node.CollocateRegistry=0
注意:手工創(chuàng)建上述文件中提到的路徑。其中服務(wù)端程序的輸出會保存在Ouput指向路徑的*.out文件中。
應(yīng)用描述文件
應(yīng)用描述文件用來描述服務(wù)端程序在icegrid中的部署情況。包括應(yīng)用的名稱、服務(wù)程序的路徑、執(zhí)行參數(shù)等等。
app.xml
<icegrid>
<application name="PrinterApplication">
<node name="node1">
<server id="PrinterServer" exe="python" activation="on-demand">
<adapter name="PrinterAdapter" endpoints="tcp -h 127.0.0.1">
<object identity="SimplePrinter" type="::Demo::Printer" property="Identity"/>
</adapter>
<option>/home/rocway/test/zerocice/Server.py</option>
<property name="Ice.Trace.Network" value="1"/>
<properties>
<property name="Ice.ThreadPool.Server.SizeMax" value="1" />
</properties>
<property name="IceMX.Metrics.Debug.GroupBy" value="id"/>
<property name="IceMX.Metrics.Debug.Disabled" value="1"/>
<property name="IceMX.Metrics.ByParent.GroupBy" value="parent"/>
<property name="IceMX.Metrics.ByParent.Disabled" value="1"/>
</server>
</node>
</application>
</icegrid>
啟動icegrid
1.啟動icegrid注冊中心
icegridregistry --Ice.Config=registry.cfg
2.啟動某個節(jié)點
icegridnode --Ice.Config=node1.cfg
3.啟動節(jié)點上的應(yīng)用管理程序, 并添加應(yīng)用
icegridadmin --Ice.Config=node1.cfg
application add app.xml
4.查看已經(jīng)添加的應(yīng)用
application describe PrinterApplication
5.啟動各節(jié)點上的應(yīng)用服務(wù)
icegridgui
6.運行客戶端程序
python Client.py
實驗總結(jié)
此次實驗實現(xiàn)了在icegrid上部署服務(wù)程序,客戶端通過icegrid的服務(wù)注冊中心調(diào)用該服務(wù)。實驗中服務(wù)端和客戶端使用的都是Python,有興趣的同學(xué)也可以分別使用不同的語言開發(fā)服務(wù)端和客戶端,嘗試一下Zeroc ICE的跨語言RPC調(diào)用。
本次實驗就到這里,有關(guān)Zeroc ICE的其他內(nèi)容請關(guān)注后續(xù)的課程。
以上就是如何用python開發(fā)Zeroc Ice應(yīng)用的詳細(xì)內(nèi)容,更多關(guān)于python開發(fā)Zeroc Ice應(yīng)用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python增強(qiáng)賦值和共享引用注意事項小結(jié)
這篇文章主要給大家介紹了關(guān)于Python增強(qiáng)賦值和共享引用注意事項的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
關(guān)于keras.layers.Conv1D的kernel_size參數(shù)使用介紹
這篇文章主要介紹了關(guān)于keras.layers.Conv1D的kernel_size參數(shù)使用介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
python機(jī)器學(xué)習(xí)實戰(zhàn)之最近鄰kNN分類器
這篇文章主要介紹了python機(jī)器學(xué)習(xí)實戰(zhàn)之最近鄰kNN分類器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
pycharm實現(xiàn)在虛擬環(huán)境中引入別人的項目
這篇文章主要介紹了pycharm實現(xiàn)在虛擬環(huán)境中引入別人的項目,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
使用Python合并Excel文件中的多個Sheet的實現(xiàn)過程
在Python中,可以使用pandas庫來處理Excel文件,將多個工作表(sheets)合并為一個工作表,以下是一個詳細(xì)的代碼示例,展示了如何實現(xiàn)這一功能,文中有相關(guān)的代碼供大家參考,需要的朋友可以參考下2024-10-10
Jupyter Notebook內(nèi)使用argparse報錯的解決方案
這篇文章主要介紹了在Jupyter Notebook內(nèi)使用argparse報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
利用一個簡單的例子窺探CPython內(nèi)核的運行機(jī)制
這篇文章主要介紹了利用一個簡單的例子窺探CPython內(nèi)核的運行機(jī)制,作者通過一個簡單的輸出函數(shù)深入、介紹了CPython源碼C代碼中的一些函數(shù),需要的朋友可以參考下2015-03-03
基于python中staticmethod和classmethod的區(qū)別(詳解)
下面小編就為大家?guī)硪黄趐ython中staticmethod和classmethod的區(qū)別(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
Python TCP全連接攻擊中SockStress全連接攻擊詳解
Sock Stress 全連接攻擊屬于TCP全連接攻擊,因為需要建立一次完整的TCP三次握手,該攻擊的關(guān)鍵點就在于,攻擊主機(jī)將windows窗口緩沖設(shè)置為0,實現(xiàn)的拒絕服務(wù)2022-10-10

