zerorpc是一种基于zeromq的灵活rpc。
zerorpc的Python项目详细描述
邮件列表:zerorpc@googlegroups.com(https://groups.google.com/d/forum/zerorpc)
zerorpc可以通过编程方式使用,也可以通过命令行使用。它来了 使用方便的脚本“zerorpc”,允许:
- 在不修改一行代码的情况下公开python模块,
- 通过命令行远程调用这些模块。
安装
在大多数系统中,问题是:
$ pip install zerorpc
根据gevent和pyzmq对您系统的支持,您可能需要使用开发文件安装libev(对于gevent)和libzmq(对于pyzmq)。
用一行代码创建服务器
让我们用一个简单的例子来看看zerorpc的作用。在第一个终端, 我们将公开python“time”模块:
$ zerorpc --server --bind tcp://*:1234 time
注意
绑定地址使用zeromq地址格式。你不受限制 到TCP传输:您也可以指定ipc:///tmp/time来使用 例如,主机本地套接字。“tcp://*:1234”是 “tcp://0.0.0.0:1234”表示“监听TCP端口1234,接受 所有IP地址上的连接”。
从命令行调用服务器
现在,在另一个终端中,调用公开模块:
$ zerorpc --client --connect tcp://127.0.0.1:1234 strftime %Y/%m/%d Connecting to "tcp://127.0.0.1:1234" "2011/03/07"
因为客户端用例是最常见的用例,“-client”是默认的 参数,您可以安全地删除它:
$ zerorpc --connect tcp://127.0.0.1:1234 strftime %Y/%m/%d Connecting to "tcp://127.0.0.1:1234" "2011/03/07"
此外,由于最常见的用例是connect(而不是bind) 您还可以省略“–connect”:
$ zerorpc tcp://127.0.0.1:1234 strftime %Y/%m/%d Connecting to "tcp://127.0.0.1:1234" "2011/03/07"
请参见远程服务文档
您可以内省远程服务;如果不这样做,它会自动发生 指定要调用的函数的名称:
$ zerorpc tcp://127.0.0.1:1234 Connecting to "tcp://127.0.0.1:1234" tzset tzset(zone) ctime ctime(seconds) -> string clock clock() -> floating point number struct_time <undocumented> time time() -> floating point number strptime strptime(string, format) -> struct_time gmtime gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min, mktime mktime(tuple) -> floating point number sleep sleep(seconds) asctime asctime([tuple]) -> string strftime strftime(format[, tuple]) -> string localtime localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,
指定非字符串参数
现在,看看如果我们试图调用一个需要非字符串的函数会发生什么 参数:
$ zerorpc tcp://127.0.0.1:1234 sleep 3 Connecting to "tcp://127.0.0.1:1234" Traceback (most recent call last): [...] TypeError: a float is required
这是因为所有命令行参数都作为字符串处理。别担心, 我们可以使用json编码指定任何类型的参数:
$ zerorpc --json tcp://127.0.0.1:1234 sleep 3 Connecting to "tcp://127.0.0.1:1234" [wait for 3 seconds...] null
ZeroWorkers:反向绑定和连接
有时,您不希望客户端连接到服务器;您希望 您的服务器充当一种工作机,并连接到一个集线器或队列 将发送请求。您可以通过交换“–bind”和 “–连接”:
$ zerorpc --bind tcp://*:1234 strftime %Y/%m/%d
我们现在有“something”想要调用“strftime”函数,并等待 让工人连接到它。让我们开始工作:
$ zerorpc --server tcp://127.0.0.1:1234 time
工作人员会联系倾听的客户,问他“我应该做什么 是吗?,客户端将发送“strftime”函数调用;工作者将 执行它并返回结果。第一个程序将显示 本地时间和出口。工人将继续工作。
监听多个地址
如果你想在多个地址上运行同一个服务器怎么办?重复一遍 “–bind”选项:
$ zerorpc --server --bind tcp://*:1234 --bind ipc:///tmp/time time
然后可以使用“zerorpctcp://*:1234”或 “zerorpc ipc:///tmp/time”。
等等,还有更多!你甚至可以混合使用“绑定”和“连接”。那意味着 服务器将等待给定地址的请求,和连接 作为另一个工人。同样,您可以多次指定“–connect”, 因此您的工作线程将连接到多个队列。如果队列没有运行, 它不会影响工作者(这就是ZeroMQ的魔力)。
警告
客户端可能不应该连接到多个地址!
几乎所有其他场景都可以工作;但是如果您要求客户端连接 到多个地址,其中至少有一个地址的末尾没有服务器, 客户将最终阻止。但是,客户端可以绑定多个 地址,并将向可用的工作人员发送请求。如果你想要的 要连接到多个远程服务器以实现高可用性, 你在中间插入像HAProxy这样的东西。
以编程方式公开零服务
当然,命令行只是zerorpc的一个方便包装器 python api。下面是几个例子。
以下是如何将您选择的对象公开为零服务:
class Cooler(object): """ Various convenience methods to make things cooler. """ def add_man(self, sentence): """ End a sentence with ", man!" to make it sound cooler, and return the result. """ return sentence + ", man!" def add_42(self, n): """ Add 42 to an integer argument to make it cooler, and return the result. """ return n + 42 def boat(self, sentence): """ Replace a sentence with "I'm on a boat!", and return that, because it's cooler. """ return "I'm on a boat!" import zerorpc s = zerorpc.Server(Cooler()) s.bind("tcp://0.0.0.0:4242") s.run()
让我们将此代码保存到cooler.py并运行它:
$ python cooler.py
现在,在另一个终端上,让我们尝试连接我们令人敬畏的零服务:
$ zerorpc -j tcp://localhost:4242 add_42 1 43 $ zerorpc tcp://localhost:4242 add_man 'I own a mint-condition Volkswagen Golf' "I own a mint-condition Volkswagen Golf, man!" $ zerorpc tcp://localhost:4242 boat 'I own a mint-condition Volkswagen Golf, man!' "I'm on a boat!"
恭喜你!你刚刚用你的第一个 零服务,伙计!