详解用python开发Zeroc Ice应用的操作是什么
Admin 2022-09-22 群英技术资讯 280 次浏览
在这篇文章中我们来了解一下“详解用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上部署一个简单的服务器,当客户端调用时输出指定内容,并返回一个字符串。实验步骤如下:
本次实验采用的操作系统是Ubuntu 14.04。如果使用其他操作系统,可以根据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)或开发包,还需要特别安装。
当然在这一步之前应当首先安装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
下面即是真正的服务端和客户端开发。开发过程通常是:
// 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是Zeroc ICE的云计算解决方案。它可以将各种服务端部署在多台机器上,并为客户端调用提供服务定位、服务激活、负载均衡、故障转移等服务。客户端只要连接到指定的服务注册中心,就可以根据服务名称(这里是SimplePrinter),以及连接协议(Endpoints,这里是tcp)就可以找到相应的服务。服务在注册时也不必处在运行状态,可以由icegrid根据调用请求,自动启动。
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>
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应用的操作是什么”的内容今天就到这,感谢各位的阅读,大家可以动手实际看看,对大家加深理解更有帮助哦。如果想了解更多相关内容的文章,关注我们,群英网络小编每天都会为大家更新不同的知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
集合(set)是一个无序的不重复元素序列。因此在每次运行的时候集合的运行结果的内容都是相同的,但元素的排列顺序却不是固定的,所以本章中部分案例的运行结果会出现与给出结果不同的情况(运行结果不唯一)可以使用大括号{}或者set()函数创建集合,注意:创建一个空集合必须用set()而不是{},因为{}是用来创建一个空字典
一般情况下,python中对一个字符串排序相当麻烦:一、python中的字符串类型是不允许直接改变元素的。必须先把要排序的字符串放在容器里,如
链表的定义:链表(linkedlist)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址。由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就能够访问整个结点序列。也就是说,结点包含两部分信息:一部分用于存储数据元素的值,称为信息域;另一部分用于存储下一个数据元素地址的指针,称为指针域。链表中的第一个结点的地址存储在一个单独的结点中,称
之前小编向大家讲解了很多关于列表的知识,我们都知道在python中列表特别重要,也很好用。但是有的时候,我们仅仅需要对数字进行处理时,虽然列表也可以处理数字,但是相比较之下,用array(数组)更加高效一些,因为array(数组)适合仅仅对数字且是同一类型的数字操作。那你知道如何将列表转为数组处理数据吗?别急,今天小编就告诉大家python中array与list相互转换的方法。
这篇文章主要为大家介绍了python神经网络tfrecords文件的写入读取及内容解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008