python中的rpc库
2021/12/18 22:22:55
本文主要是介绍python中的rpc库,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
基于xml的rpc调用
- rpcserver.py
from xmlrpc.server import SimpleXMLRPCServer # python中类的命名方式遵循驼峰命名法 # 1. 没有出现url的映射 # 2. 没有出现编码和解码 # 3. 序列化和反序列化协议是:xml class Calculate: def add(self, x, y): return x + y def multiply(self, x, y): return x * y def subtract(self, x, y): return abs(x - y) def divide(self, x, y): return x / y obj = Calculate() server = SimpleXMLRPCServer(("localhost", 8088)) # 将实例注册给rpc server server.register_instance(obj) print("Listening on port 8088") server.serve_forever()
rpc服务通俗来讲:通过一定协议和方法使得调用远程计算机上的服务,就像调用本地服务一样。
- xml_rpc_client.py
from xmlrpc import client # xmlrpc挺好用的 # rpc强调的是本地调用效果 # rpc在内部调用很多 server = client.ServerProxy("http://localhost:8088") print(server.divide(2, 3))
基于json的rpc调用
-
安装
pip install jsonrpclib
-
json_rpc_server.py
from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer def my_dict(d): d["gender"] = "男" return d # 实例化server server = SimpleJSONRPCServer(("127.0.0.1", 8883)) # 将函数注册到server中 server.register_function(pow) server.register_function(lambda x, y: x + y, "add") server.register_function(my_dict) # 启动server server.serve_forever()
- json_rpc_client.py
import jsonrpclib server = jsonrpclib.Server("http://127.0.0.1:8883") print(server.add(11, 22)) # 33 print(server.pow(5, 3)) # 125 ret = server.my_dict(dict(name="马亚南", age=18)) print(ret, type(ret))
总结:
- 超时机制 - 重试
- 限流使服务处于长期可用的状态 - 高可用
- 解耦
- 负载均衡 微服务 - 分布式应用的一种具体的提现
- json-rpc是否满足上述的要求
- 序列化和反序列化数据压缩是否高效
- 该rpc框架是否支持多语言
更加高效和更加全面的技术 - zerorpc
基于zeromq的rpc框架: zerorpc
- zerorpc实现rpc调用
一元调用
- 服务端
import zerorpc class HelloRPC(object): def hello(self, name): return f"hello {name}" def add(self, x, y): return x + y # 1. 实例化一个server # 2. 绑定我们的业务代码到server中 server = zerorpc.Server(HelloRPC()) # 3. 设置协议、ip、端口 server.bind("tcp://0.0.0.0:8842") # 3. 启动server server.run()
- 客户端
import zerorpc # 在功能体验上,client端没有太大的差异 c = zerorpc.Client() c.connect("tcp://127.0.0.1:8842") print(c.hello("马亚南")) print(c.add(11, 22))
流式响应
- 服务端
import zerorpc class StreamingRPC(object): @zerorpc.stream # @zerorpc.stream这里的装饰器是必须的,否则会有异常,如TypeError:cant't serialize def 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()
- 客户端
import zerorpc c = zerorpc.Client() c.connect("tcp://127.0.0.1:4242") for item in c.streaming_range(10, 20, 2): print(item)
基于zerorpc的调用过程
- zerorpc支持nodejs和python的
zerorpc github链接
zerorpc官网
RPC需要解决的问题
- Id映射
- 传输协议 tcp/http
- 数据的编码和解码xml/json/msgpack
- 如何解决高并发问题
- 负载均衡问题
- 集群问题
选择哪一种rpc解决方案
- 生态
- 支持的语言(多语言/单语言)
这篇关于python中的rpc库的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-03用FastAPI掌握Python异步IO:轻松实现高并发网络请求处理
- 2025-01-02封装学习:Python面向对象编程基础教程
- 2024-12-28Python编程基础教程
- 2024-12-27Python编程入门指南
- 2024-12-27Python编程基础
- 2024-12-27Python编程基础教程
- 2024-12-27Python编程基础指南
- 2024-12-24Python编程入门指南
- 2024-12-24Python编程基础入门
- 2024-12-24Python编程基础:变量与数据类型