zerorpc 是利用 zeroMQ消息队列 + msgpack 消息序列化(二进制) 来实现类似 grpc 的功能,跨语言远程调用。
主要使用到 zeroMQ 的通信模式是 ROUTER–DEALER,模拟 grpc 的 请求-响应式 和 应答流式 RPC :
zerorpc 还支持 PUB-SUB 通信模式的远程调用。
zerorpc实际上会依赖msgpack-python, pyzmq, future, greenlet, gevent

一元调用

1. 服务端

  1. import zerorpc
  2. class HelloRPC(object):
  3. def hello(self, name):
  4. return "Hello, %s" % name
  5. s = zerorpc.Server(HelloRPC())
  6. s.bind("tcp://0.0.0.0:4242")
  7. s.run()

2. 客户端

  1. import zerorpc
  2. c = zerorpc.Client()
  3. c.connect("tcp://127.0.0.1:4242")
  4. print(c.hello("RPC"))

流式响应

1. 服务端

  1. import zerorpc
  2. class StreamingRPC(object):
  3. @zerorpc.stream #@zerorpc.stream这里的函数修饰是必须的,否则会有异常,如TypeError: can’t serialize
  4. def streaming_range(self, fr, to, step):
  5. return range(fr, to, step)
  6. s = zerorpc.Server(StreamingRPC())
  7. s.bind("tcp://0.0.0.0:4242")
  8. s.run()

2. 客户端

  1. import zerorpc
  2. c = zerorpc.Client()
  3. c.connect("tcp://127.0.0.1:4242")
  4. for item in c.streaming_range(10, 20, 2):
  5. print(item)

传入多个参数

1. 服务端

  1. import zerorpc
  2. class myRPC(object):
  3. def listinfo(self,message):
  4. return "get info : %s"%message
  5. def getpow(self,n,m):
  6. return n**m
  7. s = zerorpc.Server(myRPC())
  8. s.bind("tcp://0.0.0.0:4242")
  9. s.run()

2. 客户端

  1. import zerorpc
  2. c = zerorpc.Client()
  3. c.connect("tcp://127.0.0.1:4242")
  4. print(c.listinfo("this is test string"))
  5. print(c.getpow(2,5))