有Spyne客户端的示例吗?

6 投票
1 回答
2955 浏览
提问于 2025-04-18 16:16

我正在尝试在我的服务器上使用spyne(http://spyne.io),并且使用ZeroMQ和MsgPack。我已经按照示例编写了服务器端的代码,但找不到任何示例来帮助我了解如何编写客户端的代码。

我发现了类spyne.client.zeromq.ZeroMQClient,但我不知道它的构造函数中的'app'参数应该是什么。

提前感谢你们的帮助!

编辑:

这是(简化版的)服务器端代码:

from spyne.application import Application
from spyne.protocol.msgpack import MessagePackRpc
from spyne.server.zeromq import ZeroMQServer
from spyne.service import ServiceBase
from spyne.decorator import srpc
from spyne.model.primitive import Unicode

class RadianteRPC(ServiceBase):    
    @srpc(_returns=Unicode)
    def whoiam():
        return "Hello I am Seldon!"

radiante_rpc = Application(
    [RadianteRPC],
    tns="radiante.rpc",
    in_protocol=MessagePackRpc(validator="soft"),
    out_protocol=MessagePackRpc()
)

s = ZeroMQServer(radiante_rpc, "tcp://127.0.0.1:5001")
s.serve_forever()

1 个回答

4

我是Spyne的作者。

Spyne的客户端传输有很多问题。

最重要的一点是,它们需要服务器端的代码才能正常工作。这是因为Spyne的WSDL解析器还没有完全完成,所以无法将服务器提供的接口传递给客户端。

一旦WSDL解析器完成,Spyne的客户端传输也会得到更新。现在它们运行得很好,测试也通过了,但它们有点过时,正如你所注意到的,文档也不够完善。

回到你的问题:传给客户端构造函数的app参数和传给服务器构造函数的是同一个应用实例。所以如果你这样做:

c = ZeroMQClient("tcp://127.0.0.1:5001", radiante_rpc)
print c.service.whoiam()

它会打印“你好,我是Seldon!”

这是我刚刚提交的完整代码:https://github.com/arskom/spyne/tree/master/examples/zeromq

但是

说了这么多,你不应该使用ZeroMQ来做RPC。

我在ZeroMQ刚火的时候就考虑过用它做RPC(我甚至在ZeroMQ的贡献者名单上有我的名字 :)),但我对看到的东西并不满意,于是我放弃了。

我在https://news.ycombinator.com/item?id=6089252上发表的相关评论是这样的:

根据我的经验,ZeroMQ在类似RPC的应用中非常脆弱,尤其是因为它试图抽象掉“连接”。这种思维方式在进行多播时非常合适(ZeroMQ在多播时表现得非常好),但对于单播,我实际上希望能够检测到断开连接或连接失败,并在我的发送缓冲区被堵死之前妥善处理。因此,在选择ZeroMQ作为内部RPC类型消息的传输方式之前,我会考虑其他替代方案。

如果你可以接受在解析(或发送)之前将整个消息放在内存中(在传输大文档时,HTTP并不是那么糟糕),那么将原始的MessagePack文档写入常规的TCP流(或者放在UDP数据报中)就可以很好地解决问题。MessagePack库确实支持解析流——可以查看它主页上的Python示例(http://msgpack.org)。

声明:我只是一个快乐的MessagePack(有时也用ZeroMQ)用户。我在Spyne工作(http://spyne.io),所以我对一些最流行的协议有经验。

我似乎是在一年多前写下了那条评论。快进到今天,我在Spyne 2.11中实现并发布了MessagePack传输。所以如果你在寻找一种轻量级的传输方式来内部传递小消息,我的推荐是使用它,而不是ZeroMQ。

不过,一旦你走出HTTP的世界,你就得回到系统级别处理套接字,这可能是你想要的,也可能不是,尤其是要看你为这个项目的这部分准备了多少资源。

可惜的是,除了我刚刚整理的示例之外,没有其他文档:https://github.com/arskom/spyne/tree/master/examples/msgpack_transport

服务器代码是相当标准的Spyne/Twisted代码,但客户端使用系统级别的套接字来说明它应该如何工作。我很乐意接受一个将其封装成合适Spyne客户端传输的拉取请求。

希望这对你有帮助。欢迎提交补丁。

最好的祝愿,

撰写回答