如何用python開發Zeroc Ice應用
Zeroc ICE(Internet Communications Engine ,互聯網通信引擎)是目前功能比較強大和完善的RPC框架,支持跨平臺、跨語言調用。它非常靈活,可以通過TCP、UDP、SSL/TSL或WebSocket連接,支持同步、異步調用,以及服務器和客戶端之間的雙向連接。Zeroc ICE的效率非常高,它使用一種高效的二進制協議,對帶寬的消耗比較小。甚至對于通過衛星的RPC調用,Zeroc ICE還可以對數據流進一步壓縮。另外Zeroc ICE還可以在不解包的情況下轉發調用請求,省去普通轉發時的解包、重新壓包的時間。 Zeroc ICE的應用還可以部署在icegrid上,實現網格計算,即客戶端調用時不必指定目標主機,由ICE負責查找;服務端也可以在調用時才開啟,動態加載;同樣的服務也可以部署多個,實現高可用。
實驗簡介Zeroc ICE支持跨語言RPC調用,包括C++、C#、Java、JavaScript、Python、Objective-C、Ruby、PHP、VB等。本次實驗采用Python(Pyhon 2.7以上,或者Python 3都可以)。實驗的內容是在icegrid上部署一個簡單的服務器,當客戶端調用時輸出指定內容,并返回一個字符串。實驗步驟如下:
安裝Zeroc ICE 開發服務端和客戶端程序 部署到icegrid 客戶端調用 環境準備本次實驗采用的操作系統是Ubuntu 14.04。如果使用其他操作系統,可以根據Zeroc ICE的文檔相應調整。
安裝Zeroc Ice如果系統中沒有安裝Zeroc ICE,并且ubuntu的軟件源中也沒有zeroc ice,可以按照下面的步驟安裝。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 5E6DA83306132997sudo apt-add-repository 'deb http://zeroc.com/download/apt/ubuntu$(lsb_release -rs) stable main'sudo apt-get updatesudo apt-get install zeroc-ice-all-runtime zeroc-ice-all-dev
安裝之后系統中就有了slice2cpp、slice2java等Sliece(Zeroc ICE定義的接口描述語言,IDL)文件到相應語言的轉換程序,以及icegrid、iceregistry、icegridadmin等程序。如果缺少目標語言的工具(例如slice2py)或開發包,還需要特別安裝。
安裝Zeroc ICE的python開發包當然在這一步之前應當首先安裝python和pip(python的依賴管理工具),此處略。Zeroc ICE的python開發包(或者模塊)叫zeroc-ice,可以使用pip安裝。
sudo -H pip install zeroc-ice
安裝過程中可能出現缺少某些C/C++頭文件的問題,例如缺少python.h、openssl/ssl.h、bzlib.h,這些都是因為沒有安裝相應的開發包??梢酝ㄟ^如下的命令解決:
sudo apt-get install python-devsudo apt-get install libssl-devsudo apt-get install libbz2-dev開發Server和Client
下面即是真正的服務端和客戶端開發。開發過程通常是:
使用Slice語言定義語言無關的接口文件 轉換成指定語言的接口文件 根據接口文件開發服務端和客戶端程序 書寫服務端和客戶端的配置文件 使用slice語言定義接口// Printer.icemodule Demo { interface Printer { string printString(string s); };};生成指定語言的接口文件
本次開發采用的語言是python,所以使用
slice2py Printer.ice
其他語言可以依此類推,例如slice2java,slice2cpp。 命令執行成功,可以看到在目標目錄中生成了一個Printer_ice.py文件,以及一個Demo目錄。Demo是slice接口文件中定義的module名稱。
編寫服務器import sys, traceback, Ice import Demo# PrinterI是接口實現類,Demo.Printer是slice2py生成的接口class PrinterI(Demo.Printer): def printString(self, s, current=None): print(s) return 'Server Printed: ' + s status = 0 ic = Nonetry: # 初始化zeroc ice環境 ic = Ice.initialize(sys.argv) # 生成名為SimplePrinterAdapter的對象適配器,連接方式是缺省的tcp,監聽端口10000 adapter = ic.createObjectAdapterWithEndpoints('SimplePrinterAdapter', 'default -p 10000') # 生成接口的實現對象,并以指定的名字SimplePrinter添加到對象適配器中 object = PrinterI() adapter.add(object, ic.stringToIdentity('SimplePrinter')) # 激活對象適配器 adapter.activate() # 使得本服務器的調用線程在此暫停,直至ice服務結束,或者進程結束 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內容如下:
PrinterAdapter.AdapterId=PrinterAdapterPrinterAdapter.Endpoints=tcp
其中tcp的意思通過tcp協議調用,服務器監聽來自tcp協議的連接請求。
編寫客戶端import sys, traceback, Ice import Demostatus = 0 ic = Nonetry: ic = Ice.initialize(sys.argv) # 生成名為SimplePrinter代理對象,且通過tcp調用,連接目標機器的10000端口 base = ic.stringToProxy('SimplePrinter:default -p 10000') # 將代理對象轉換成目標對象 printer = Demo.PrinterPrx.checkedCast(base) if not printer: raise RuntimeError('Invalid proxy') # 調用服務器的printString方法,并輸出返回結果 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客戶端直連服務端
上述程序開發完畢之后不用部署到icegrid就可以直接運行,配置文件是用來在icegrid上定位和連接服務。此時可以一邊運行服務端,一邊運行客戶端,檢驗一下它們的功能。
python Server.py
運行之后可以看到進程并沒有結束,一直在等待連接。然后另起一個終端,運行客戶端程序。
python Client.py
運行之后可以看到服務端和客戶端窗口的輸出。
部署到icegridicegrid是Zeroc ICE的云計算解決方案。它可以將各種服務端部署在多臺機器上,并為客戶端調用提供服務定位、服務激活、負載均衡、故障轉移等服務。客戶端只要連接到指定的服務注冊中心,就可以根據服務名稱(這里是SimplePrinter),以及連接協議(Endpoints,這里是tcp)就可以找到相應的服務。服務在注冊時也不必處在運行狀態,可以由icegrid根據調用請求,自動啟動。
registry.cfg(服務注冊中心的配置文件)
IceGrid.InstanceName=SzcIceGrid #客戶端連接到注冊中心的地址 IceGrid.Registry.Client.Endpoints=tcp -p 4061IceGrid.Registry.Server.Endpoints=tcpIceGrid.Registry.Internal.Endpoints=tcpIceGrid.Registry.PermissionsVerifier=SzcIceGrid/NullPermissionsVerifierIceGrid.Registry.AdminPermissionsVerifier=SzcIceGrid/NullPermissionsVerifier#注冊中心數據保存路徑,需要手動創建文件夾IceGrid.Registry.Data=/home/rocway/test/zerocice/registryIceGrid.Registry.DynamicRegistration=1Ice.Admin.InstanceName=AdminInstanceIce.Admin.ServerId=Admin
注意:手工創建文件中的路徑。
配置節點節點是服務所在的機器。在實際生產環境中,服務注冊中心也可以運行在其中某個節點上。node1.cfg(服務所在節點的配置文件)
# 注冊中心地址 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/node1IceGrid.Node.Output=/home/rocway/test/zerocice/nodes/node1IceGrid.Node.CollocateRegistry=0
注意:手工創建上述文件中提到的路徑。其中服務端程序的輸出會保存在Ouput指向路徑的*.out文件中。
應用描述文件應用描述文件用來描述服務端程序在icegrid中的部署情況。包括應用的名稱、服務程序的路徑、執行參數等等。app.xml
<icegrid> <application name='PrinterApplication'> <node name='node1'> <server 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.啟動某個節點
icegridnode --Ice.Config=node1.cfg
3.啟動節點上的應用管理程序, 并添加應用
icegridadmin --Ice.Config=node1.cfg
application add app.xml
4.查看已經添加的應用
application describe PrinterApplication
5.啟動各節點上的應用服務
icegridgui
6.運行客戶端程序
python Client.py
實驗總結此次實驗實現了在icegrid上部署服務程序,客戶端通過icegrid的服務注冊中心調用該服務。實驗中服務端和客戶端使用的都是Python,有興趣的同學也可以分別使用不同的語言開發服務端和客戶端,嘗試一下Zeroc ICE的跨語言RPC調用。 本次實驗就到這里,有關Zeroc ICE的其他內容請關注后續的課程。
以上就是如何用python開發Zeroc Ice應用的詳細內容,更多關于python開發Zeroc Ice應用的資料請關注好吧啦網其它相關文章!
相關文章:
1. phpstudy apache開啟ssi使用詳解2. 在JSP中使用formatNumber控制要顯示的小數位數方法3. 存儲于xml中需要的HTML轉義代碼4. jsp網頁實現貪吃蛇小游戲5. MyBatis JdbcType 與Oracle、MySql數據類型對應關系說明6. CentOS郵件服務器搭建系列—— POP / IMAP 服務器的構建( Dovecot )7. .NET SkiaSharp 生成二維碼驗證碼及指定區域截取方法實現8. ASP中if語句、select 、while循環的使用方法9. ASP中實現字符部位類似.NET里String對象的PadLeft和PadRight函數10. 利用CSS制作3D動畫
