有Spyne客户端的示例吗?
我正在尝试在我的服务器上使用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 个回答
我是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客户端传输的拉取请求。
希望这对你有帮助。欢迎提交补丁。
最好的祝愿,