濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > 如何用python開(kāi)發(fā)Zeroc Ice應(yīng)用

如何用python開(kāi)發(fā)Zeroc Ice應(yīng)用

熱門(mén)標(biāo)簽:天津塘沽區(qū)地圖標(biāo)注 甘肅高頻外呼系統(tǒng) 滴滴地圖標(biāo)注公司 杭州房產(chǎn)地圖標(biāo)注 地圖標(biāo)注可以遠(yuǎn)程操作嗎 智能電話(huà)機(jī)器人調(diào)研 400電話(huà)在線如何申請(qǐng) 江門(mén)智能電話(huà)機(jī)器人 如何申請(qǐng)400電話(huà)代理

Zeroc Ice簡(jiǎn)介

  Zeroc ICE(Internet Communications Engine ,互聯(lián)網(wǎng)通信引擎)是目前功能比較強(qiáng)大和完善的RPC框架,支持跨平臺(tái)、跨語(yǔ)言調(diào)用。它非常靈活,可以通過(guò)TCP、UDP、SSL/TSL或WebSocket連接,支持同步、異步調(diào)用,以及服務(wù)器和客戶(hù)端之間的雙向連接。Zeroc ICE的效率非常高,它使用一種高效的二進(jìn)制協(xié)議,對(duì)帶寬的消耗比較小。甚至對(duì)于通過(guò)衛(wèi)星的RPC調(diào)用,Zeroc ICE還可以對(duì)數(shù)據(jù)流進(jìn)一步壓縮。另外Zeroc ICE還可以在不解包的情況下轉(zhuǎn)發(fā)調(diào)用請(qǐng)求,省去普通轉(zhuǎn)發(fā)時(shí)的解包、重新壓包的時(shí)間。
  Zeroc ICE的應(yīng)用還可以部署在icegrid上,實(shí)現(xiàn)網(wǎng)格計(jì)算,即客戶(hù)端調(diào)用時(shí)不必指定目標(biāo)主機(jī),由ICE負(fù)責(zé)查找;服務(wù)端也可以在調(diào)用時(shí)才開(kāi)啟,動(dòng)態(tài)加載;同樣的服務(wù)也可以部署多個(gè),實(shí)現(xiàn)高可用。

實(shí)驗(yàn)簡(jiǎn)介

  Zeroc ICE支持跨語(yǔ)言RPC調(diào)用,包括C++、C#、Java、JavaScript、Python、Objective-C、Ruby、PHP、VB等。本次實(shí)驗(yàn)采用Python(Pyhon 2.7以上,或者Python 3都可以)。實(shí)驗(yàn)的內(nèi)容是在icegrid上部署一個(gè)簡(jiǎn)單的服務(wù)器,當(dāng)客戶(hù)端調(diào)用時(shí)輸出指定內(nèi)容,并返回一個(gè)字符串。實(shí)驗(yàn)步驟如下:

  • 安裝Zeroc ICE
  • 開(kāi)發(fā)服務(wù)端和客戶(hù)端程序
  • 部署到icegrid
  • 客戶(hù)端調(diào)用

環(huán)境準(zhǔn)備

   本次實(shí)驗(yàn)采用的操作系統(tǒng)是Ubuntu 14.04。如果使用其他操作系統(tǒng),可以根據(jù)Zeroc ICE的文檔相應(yīng)調(diào)整。

安裝Zeroc Ice

   如果系統(tǒng)中沒(méi)有安裝Zeroc ICE,并且ubuntu的軟件源中也沒(méi)有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定義的接口描述語(yǔ)言,IDL)文件到相應(yīng)語(yǔ)言的轉(zhuǎn)換程序,以及icegrid、iceregistry、icegridadmin等程序。如果缺少目標(biāo)語(yǔ)言的工具(例如slice2py)或開(kāi)發(fā)包,還需要特別安裝。

安裝Zeroc ICE的python開(kāi)發(fā)包

  當(dāng)然在這一步之前應(yīng)當(dāng)首先安裝python和pip(python的依賴(lài)管理工具),此處略。Zeroc ICE的python開(kāi)發(fā)包(或者模塊)叫zeroc-ice,可以使用pip安裝。

sudo -H pip install zeroc-ice

  安裝過(guò)程中可能出現(xiàn)缺少某些C/C++頭文件的問(wèn)題,例如缺少python.h、openssl/ssl.h、bzlib.h,這些都是因?yàn)闆](méi)有安裝相應(yīng)的開(kāi)發(fā)包??梢酝ㄟ^(guò)如下的命令解決:

sudo apt-get install python-dev
sudo apt-get install libssl-dev
sudo apt-get install libbz2-dev

開(kāi)發(fā)Server和Client

  下面即是真正的服務(wù)端和客戶(hù)端開(kāi)發(fā)。開(kāi)發(fā)過(guò)程通常是:

  • 使用Slice語(yǔ)言定義語(yǔ)言無(wú)關(guān)的接口文件
  • 轉(zhuǎn)換成指定語(yǔ)言的接口文件
  • 根據(jù)接口文件開(kāi)發(fā)服務(wù)端和客戶(hù)端程序
  • 書(shū)寫(xiě)服務(wù)端和客戶(hù)端的配置文件

使用slice語(yǔ)言定義接口

// Printer.ice
module Demo {
  interface Printer {
     string printString(string s);
  };
};

生成指定語(yǔ)言的接口文件

  本次開(kāi)發(fā)采用的語(yǔ)言是python,所以使用

slice2py Printer.ice

  其他語(yǔ)言可以依此類(lèi)推,例如slice2java,slice2cpp。
  命令執(zhí)行成功,可以看到在目標(biāo)目錄中生成了一個(gè)Printer_ice.py文件,以及一個(gè)Demo目錄。Demo是slice接口文件中定義的module名稱(chēng)。

編寫(xiě)服務(wù)器

import sys, traceback, Ice 
import Demo

# PrinterI是接口實(shí)現(xiàn)類(lèi),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的對(duì)象適配器,連接方式是缺省的tcp,監(jiān)聽(tīng)端口10000
  adapter = ic.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000")
  # 生成接口的實(shí)現(xiàn)對(duì)象,并以指定的名字SimplePrinter添加到對(duì)象適配器中
  object = PrinterI()
  adapter.add(object, ic.stringToIdentity("SimplePrinter"))
  # 激活對(duì)象適配器
  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的意思通過(guò)tcp協(xié)議調(diào)用,服務(wù)器監(jiān)聽(tīng)來(lái)自tcp協(xié)議的連接請(qǐng)求。

編寫(xiě)客戶(hù)端

import sys, traceback, Ice 
import Demo

status = 0 
ic = None

try:
  ic = Ice.initialize(sys.argv)
  # 生成名為SimplePrinter代理對(duì)象,且通過(guò)tcp調(diào)用,連接目標(biāo)機(jī)器的10000端口
  base = ic.stringToProxy("SimplePrinter:default -p 10000")
  # 將代理對(duì)象轉(zhuǎn)換成目標(biāo)對(duì)象
  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)

  客戶(hù)端的配置文件如下:

Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 127.0.0.1 -p 4061

客戶(hù)端直連服務(wù)端

  上述程序開(kāi)發(fā)完畢之后不用部署到icegrid就可以直接運(yùn)行,配置文件是用來(lái)在icegrid上定位和連接服務(wù)。此時(shí)可以一邊運(yùn)行服務(wù)端,一邊運(yùn)行客戶(hù)端,檢驗(yàn)一下它們的功能。

python Server.py

  運(yùn)行之后可以看到進(jìn)程并沒(méi)有結(jié)束,一直在等待連接。然后另起一個(gè)終端,運(yùn)行客戶(hù)端程序。

python Client.py

  運(yùn)行之后可以看到服務(wù)端和客戶(hù)端窗口的輸出。

部署到icegrid

  icegrid是Zeroc ICE的云計(jì)算解決方案。它可以將各種服務(wù)端部署在多臺(tái)機(jī)器上,并為客戶(hù)端調(diào)用提供服務(wù)定位、服務(wù)激活、負(fù)載均衡、故障轉(zhuǎn)移等服務(wù)??蛻?hù)端只要連接到指定的服務(wù)注冊(cè)中心,就可以根據(jù)服務(wù)名稱(chēng)(這里是SimplePrinter),以及連接協(xié)議(Endpoints,這里是tcp)就可以找到相應(yīng)的服務(wù)。服務(wù)在注冊(cè)時(shí)也不必處在運(yùn)行狀態(tài),可以由icegrid根據(jù)調(diào)用請(qǐng)求,自動(dòng)啟動(dòng)。

配置注冊(cè)中心

registry.cfg(服務(wù)注冊(cè)中心的配置文件)

IceGrid.InstanceName=SzcIceGrid 
#客戶(hù)端連接到注冊(cè)中心的地址 
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
#注冊(cè)中心數(shù)據(jù)保存路徑,需要手動(dòng)創(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é)點(diǎn)

  節(jié)點(diǎn)是服務(wù)所在的機(jī)器。在實(shí)際生產(chǎn)環(huán)境中,服務(wù)注冊(cè)中心也可以運(yùn)行在其中某個(gè)節(jié)點(diǎn)上。
node1.cfg(服務(wù)所在節(jié)點(diǎn)的配置文件)

# 注冊(cè)中心地址 
Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 127.0.0.1 -p 4061 
#node名 
IceGrid.Node.Name=node1 
IceGrid.Node.Endpoints=tcp 
#node存儲(chǔ)路徑 
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ù)端程序的輸出會(huì)保存在Ouput指向路徑的*.out文件中。

應(yīng)用描述文件

  應(yīng)用描述文件用來(lái)描述服務(wù)端程序在icegrid中的部署情況。包括應(yīng)用的名稱(chē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>

啟動(dòng)icegrid

1.啟動(dòng)icegrid注冊(cè)中心

icegridregistry --Ice.Config=registry.cfg

2.啟動(dòng)某個(gè)節(jié)點(diǎn)

icegridnode --Ice.Config=node1.cfg

3.啟動(dòng)節(jié)點(diǎn)上的應(yīng)用管理程序, 并添加應(yīng)用

icegridadmin --Ice.Config=node1.cfg

application add app.xml

4.查看已經(jīng)添加的應(yīng)用

application describe PrinterApplication

5.啟動(dòng)各節(jié)點(diǎn)上的應(yīng)用服務(wù)

icegridgui

6.運(yùn)行客戶(hù)端程序

python Client.py

實(shí)驗(yàn)總結(jié)

  此次實(shí)驗(yàn)實(shí)現(xiàn)了在icegrid上部署服務(wù)程序,客戶(hù)端通過(guò)icegrid的服務(wù)注冊(cè)中心調(diào)用該服務(wù)。實(shí)驗(yàn)中服務(wù)端和客戶(hù)端使用的都是Python,有興趣的同學(xué)也可以分別使用不同的語(yǔ)言開(kāi)發(fā)服務(wù)端和客戶(hù)端,嘗試一下Zeroc ICE的跨語(yǔ)言RPC調(diào)用。
  本次實(shí)驗(yàn)就到這里,有關(guān)Zeroc ICE的其他內(nèi)容請(qǐng)關(guān)注后續(xù)的課程。

以上就是如何用python開(kāi)發(fā)Zeroc Ice應(yīng)用的詳細(xì)內(nèi)容,更多關(guān)于python開(kāi)發(fā)Zeroc Ice應(yīng)用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • python網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)知識(shí)點(diǎn)淺析
  • 基于Python_腳本CGI、特點(diǎn)、應(yīng)用、開(kāi)發(fā)環(huán)境(詳解)
  • 使用Docker開(kāi)發(fā)python Web 應(yīng)用
  • Python中SOAP項(xiàng)目的介紹及其在web開(kāi)發(fā)中的應(yīng)用
  • Python開(kāi)發(fā).exe小工具的詳細(xì)步驟
  • python開(kāi)發(fā)一個(gè)解析protobuf文件的簡(jiǎn)單編譯器
  • 教你使用Sublime text3搭建Python開(kāi)發(fā)環(huán)境及常用插件安裝另分享Sublime text3最新激活注冊(cè)碼
  • 詳解vscode實(shí)現(xiàn)遠(yuǎn)程linux服務(wù)器上Python開(kāi)發(fā)
  • 10款最佳Python開(kāi)發(fā)工具推薦,每一款都是神器
  • python開(kāi)發(fā)一款翻譯工具
  • Visual Studio code 配置Python開(kāi)發(fā)環(huán)境

標(biāo)簽:漢中 德宏 重慶 長(zhǎng)春 臨汾 河池 廊坊 東莞

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《如何用python開(kāi)發(fā)Zeroc Ice應(yīng)用》,本文關(guān)鍵詞  如,何用,python,開(kāi)發(fā),Zeroc,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《如何用python開(kāi)發(fā)Zeroc Ice應(yīng)用》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于如何用python開(kāi)發(fā)Zeroc Ice應(yīng)用的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    商洛市| 喀喇沁旗| 衡阳市| 马尔康县| 山东省| 洮南市| 桂东县| 莱州市| 若尔盖县| 高淳县| 深泽县| 桦南县| 望谟县| 太仆寺旗| 贞丰县| 古蔺县| 遵化市| 伽师县| 阿瓦提县| 彩票| 潮州市| 应用必备| 滦平县| 凉山| 兴化市| 日照市| 浦江县| 深圳市| 汤阴县| 中宁县| 镇巴县| 潮安县| 吴川市| 江源县| 繁峙县| 高雄县| 三穗县| 宜章县| 达州市| 湘潭县| 珲春市|