如何用python开发Zeroc Ice应用


Posted in Python onJanuary 29, 2021

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 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

  安装之后系统中就有了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-dev
sudo apt-get install libssl-dev
sudo apt-get install libbz2-dev

开发Server和Client

  下面即是真正的服务端和客户端开发。开发过程通常是:

  • 使用Slice语言定义语言无关的接口文件
  • 转换成指定语言的接口文件
  • 根据接口文件开发服务端和客户端程序
  • 书写服务端和客户端的配置文件

使用slice语言定义接口

// Printer.ice
module 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 = None

try:
  # 初始化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=PrinterAdapter
PrinterAdapter.Endpoints=tcp

  其中tcp的意思通过tcp协议调用,服务器监听来自tcp协议的连接请求。

编写客户端

import sys, traceback, Ice 
import Demo

status = 0 
ic = None

try:
  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

  运行之后可以看到服务端和客户端窗口的输出。

部署到icegrid

  icegrid是Zeroc ICE的云计算解决方案。它可以将各种服务端部署在多台机器上,并为客户端调用提供服务定位、服务激活、负载均衡、故障转移等服务。客户端只要连接到指定的服务注册中心,就可以根据服务名称(这里是SimplePrinter),以及连接协议(Endpoints,这里是tcp)就可以找到相应的服务。服务在注册时也不必处在运行状态,可以由icegrid根据调用请求,自动启动。

如何用python开发Zeroc Ice应用

配置注册中心

registry.cfg(服务注册中心的配置文件)

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
#注册中心数据保存路径,需要手动创建文件夹
IceGrid.Registry.Data=/home/rocway/test/zerocice/registry
IceGrid.Registry.DynamicRegistration=1
Ice.Admin.InstanceName=AdminInstance
Ice.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/node1
IceGrid.Node.Output=/home/rocway/test/zerocice/nodes/node1
IceGrid.Node.CollocateRegistry=0

注意:手工创建上述文件中提到的路径。其中服务端程序的输出会保存在Ouput指向路径的*.out文件中。

应用描述文件

  应用描述文件用来描述服务端程序在icegrid中的部署情况。包括应用的名称、服务程序的路径、执行参数等等。
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.启动某个节点

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应用的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中模块与包有相同名字的处理方法
May 05 Python
python多进程实现进程间通信实例
Nov 24 Python
Python+PIL实现支付宝AR红包
Feb 09 Python
详解Python核心对象类型字符串
Feb 11 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
Jul 06 Python
python如何实现异步调用函数执行
Jul 08 Python
PyTorch中常用的激活函数的方法示例
Aug 20 Python
Python tkinter界面实现历史天气查询的示例代码
Aug 23 Python
python实现语音常用度量方法的代码详解
May 25 Python
学会Python数据可视化必须尝试这7个库
Jun 16 Python
详解Pymongo常用查询方法总结
Jan 29 #Python
Python3使用tesserocr识别字母数字验证码的实现
Jan 29 #Python
Python爬取梨视频的示例
Jan 29 #Python
使用Python封装excel操作指南
Jan 29 #Python
用OpenCV进行年龄和性别检测的实现示例
Jan 29 #Python
python使用numpy中的size()函数实例用法详解
Jan 29 #Python
Python机器学习工具scikit-learn的使用笔记
Jan 28 #Python
You might like
与空气斗智斗勇的经典《Overlord》,传说中的“无稽之谈”
2020/04/09 日漫
PHP iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
PHP中使用unset销毁变量并内存释放问题
2012/07/05 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
PHP实现负载均衡下的session共用功能
2018/04/17 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
javascript编程起步(第七课)
2007/01/10 Javascript
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
jquery实现搜索框功能实例详解
2018/07/23 jQuery
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
python+pyqt实现12306图片验证效果
2017/10/25 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
尽职尽责村干部自我鉴定
2014/01/23 职场文书
高考寄语大全
2014/04/08 职场文书
集中整治工作方案
2014/05/01 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
办公室领导干部作风整顿个人整改措施
2014/09/17 职场文书
2014年人事行政工作总结
2014/12/03 职场文书
大足石刻导游词
2015/02/02 职场文书
入党函调证明材料
2015/06/19 职场文书
linux目录管理方法介绍
2022/06/01 Servers