zerorpc 是利用 zeroMQ消息队列 + msgpack 消息序列化(二进制) 来实现类似 grpc 的功能,跨语言远程调用。
主要使用到 zeroMQ 的通信模式是 ROUTER–DEALER,模拟 grpc 的 请求-响应式 和 应答流式 RPC :
zerorpc 还支持 PUB-SUB 通信模式的远程调用。
zerorpc实际上会依赖msgpack-python, pyzmq, future, greenlet, gevent
一元调用
1. 服务端
import zerorpcclass HelloRPC(object):def hello(self, name):return "Hello, %s" % names = zerorpc.Server(HelloRPC())s.bind("tcp://0.0.0.0:4242")s.run()
2. 客户端
import zerorpcc = zerorpc.Client()c.connect("tcp://127.0.0.1:4242")print(c.hello("RPC"))
流式响应
1. 服务端
import zerorpcclass StreamingRPC(object):@zerorpc.stream #@zerorpc.stream这里的函数修饰是必须的,否则会有异常,如TypeError: can’t serializedef streaming_range(self, fr, to, step):return range(fr, to, step)s = zerorpc.Server(StreamingRPC())s.bind("tcp://0.0.0.0:4242")s.run()
2. 客户端
import zerorpcc = zerorpc.Client()c.connect("tcp://127.0.0.1:4242")for item in c.streaming_range(10, 20, 2):print(item)
传入多个参数
1. 服务端
import zerorpcclass myRPC(object):def listinfo(self,message):return "get info : %s"%messagedef getpow(self,n,m):return n**ms = zerorpc.Server(myRPC())s.bind("tcp://0.0.0.0:4242")s.run()
2. 客户端
import zerorpcc = zerorpc.Client()c.connect("tcp://127.0.0.1:4242")print(c.listinfo("this is test string"))print(c.getpow(2,5))
