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 jsonrpclibjson_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库的更多相关文章
- 【归纳】正则表达式及Python中的正则库
正则表达式 正则表达式30分钟入门教程 runoob正则式教程 正则表达式练习题集(附答案) 元字符\b代表单词的分界处,在英文中指空格,标点符号或换行 例子:\bhi\b可以用来匹配hi这个单词,且 ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- Python中使用第三方库xlrd来写入Excel文件示例
Python中使用第三方库xlrd来写入Excel文件示例 这一篇文章就来介绍下,如何来写Excel,写Excel我们需要使用第三方库xlwt,和xlrd一样,xlrd表示read xls,xlwt表 ...
- 【转】利用Python中的mock库对Python代码进行模拟测试
出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...
- python中的turtle库绘制图形
1. 前奏: 在用turtle绘制图形时,需要安装对应python的解释器以及IDE,我安装的是pycharm,在安装完pycharm后,在pycharm安装相应库的模块,绘图可以引入turtle模块 ...
- python 中有趣的库tqdm
Tqdm 是 Python 进度条库,可以在 Python 长循环中添加一个进度提示信息用法:tqdm(iterator) # 方法1: import time from tqdm import tq ...
- Python中的BeautifulSoup库简要总结
一.基本元素 BeautifulSoup库是解析.遍历.维护“标签树”的功能库. 引用 from bs4 import BeautifulSoup import bs4 html文档-标签树-Beau ...
- Python中关于第三方库的补充
Python语言的强大之处在于它的开源.正是因为它的开源,产生了成百上千的第三方库,涵盖了计算机的几乎所有的方向.第三方库的安装也并不是特别的复杂,通过在cmd中使用pip命令可以安装几乎所有的库,但 ...
- python中的Matplot库和Gdal库绘制富士山三维地形图-参考了虾神的喜马拉雅山
首先请大家读一下面这篇文章了解什么是Gdal http://blog.csdn.net/grllery/article/details/77822595 剩下的我要公布绘制富士山的代码了,虽然基本co ...
随机推荐
- JS获取客户的IP地址
这里使用的是第三方的获取方式,重要项目建议不要用,因为你不知道搜狐未来会不会倒闭,,, 搜狐IP地址查询接口(默认GBK):http://pv.sohu.com/cityjson 搜狐IP地址查询接口 ...
- qt creator设置默认输出目录
note creator version : 4.13.1 敲黑板,一定要先配置好 Qt creator的default build directory , 再创建项目,最后再编译 敲黑板,一定要先配 ...
- Linux下c++之常见错误代码errno(退而结网法)
1.关于 还在到处找 errno对应的含义? 自己动手,很方便可找到其明确的含义 2. 动手 2.1 创建 c++源文件,输入下面的代码: #pragma once #include <iost ...
- idea使用教程-安装
[1]将安装包进行解压-->选择固态盘符 [2]发送到桌面快捷方式,生成一个快捷方式 [3]打开: 选择主题: 先进入再说,免费试用: 创建一个项目: 选择JDK: 找到jetbrains-ag ...
- 「算法笔记」状压 DP
一.关于状压 dp 为了规避不确定性,我们将需要枚举的东西放入状态.当不确定性太多的时候,我们就需要将它们压进较少的维数内. 常见的状态: 天生二进制(开关.选与不选.是否出现--) 爆搜出状态,给它 ...
- 网易云 微专业C++系统工程师
网易云 微专业C++系统工程师 一.学前基础 1.曾经学过某种编程语言(C语言最佳) 2.了解基本的变量.类型.作用域.循环和控制流程:了解基本数据类型(整数.浮点.字符串.数组等) 3.知道如何编译 ...
- Oracle打怪升级之路一【Oracle基础、Oracle查询】
前言 背景:2021年马上结束了,在年尾由于工作原因接触到一个政府单位比较传统型的项目,数据库用的是Oracle.需要做的事情其实很简单,首先从大约2000多张表中将表结构及数据导入一个共享库中,其次 ...
- Docker_创建自定义镜像(5)
生成docker镜像有两种方式 使用已有容器生成镜像 使用dockerfile生成镜像 一.使用已有容器生成镜像 1.下载centos镜像,并创建容器 2.进入容器部署python环境 centos镜 ...
- linux系统安装python3和pip
一.安装python 1.安装依赖环境 yum install gcc -y yum -y install zlib-devel bzip2-devel openssl-devel ncurses-d ...
- Python 利用@property装饰器和property()方法将一个方法变成属性调用
在创建实例属性时,如果直接把实例属性暴露出去,虽然写起来简单,但是存在一些风险,比如实例属性可以在外部被修改. 为了限制外部操作,可以通过一个set_score()方法来设置成绩,再通过一个get_s ...