zerorpc是一种基于zeromq的灵活rpc。

zerorpc的Python项目详细描述


https://travis-ci.org/0rpc/zerorpc-python.svg?branch=master

邮件列表:zerorpc@googlegroups.comhttps://groups.google.com/d/forum/zerorpc

ZrORPC是一种基于ZrOMQ和MasaGePACK的灵活的RPC实现。 使用zerorpc公开的服务api称为“zeroservices”。

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

恭喜你!你刚刚用你的第一个 零服务,伙计!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何显示因用户而异的SQLite存储数据?   转换java。sql。将映射传递给Jackon的valueToTree方法时StringNode的时间戳   从java中的列表json获取值   unicode Java字符存储在什么编码中?   java如何让Spring数据存储库中的默认方法命中缓存?   java使用readClassDescriptor()和resolveClass()来允许序列化版本控制   数组通过另一个矩阵的一部分填充矩阵   如果包含使用正则表达式的字符串,则替换父XML标记的java   java清除SharedReference中的单个变量   java将变量值从一个jsp页面传输到另一个jsp页面   java JDBC+SQLite:DriveManager不加载所需的驱动程序   相同源代码的java Kotlin构建生成不同的二进制文件   Java中的元组枚举