基于xml的rpc调用

  1. 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服务通俗来讲:通过一定协议和方法使得调用远程计算机上的服务,就像调用本地服务一样。

  1. xml_rpc_client.py
from xmlrpc import client

# xmlrpc挺好用的
# rpc强调的是本地调用效果
# rpc在内部调用很多
server = client.ServerProxy("http://localhost:8088")
print(server.divide(2, 3))

基于json的rpc调用

  1. 安装

    pip install jsonrpclib

  2. 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()
  1. 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))

总结:

  1. 超时机制 - 重试
  2. 限流使服务处于长期可用的状态 - 高可用
  3. 解耦
  4. 负载均衡 微服务 - 分布式应用的一种具体的提现
  5. json-rpc是否满足上述的要求
  6. 序列化和反序列化数据压缩是否高效
  7. 该rpc框架是否支持多语言

更加高效和更加全面的技术 - zerorpc

基于zeromq的rpc框架: zerorpc

  • zerorpc实现rpc调用

一元调用

  1. 服务端
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()
  1. 客户端
import zerorpc

# 在功能体验上,client端没有太大的差异
c = zerorpc.Client()
c.connect("tcp://127.0.0.1:8842")
print(c.hello("马亚南"))
print(c.add(11, 22))

流式响应

  1. 服务端
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()
  1. 客户端
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的调用过程

RPC需要解决的问题

  1. Id映射
  2. 传输协议 tcp/http
  3. 数据的编码和解码xml/json/msgpack
  4. 如何解决高并发问题
  5. 负载均衡问题
  6. 集群问题

选择哪一种rpc解决方案

  1. 生态
  2. 支持的语言(多语言/单语言)

python中的rpc库的更多相关文章

  1. 【归纳】正则表达式及Python中的正则库

    正则表达式 正则表达式30分钟入门教程 runoob正则式教程 正则表达式练习题集(附答案) 元字符\b代表单词的分界处,在英文中指空格,标点符号或换行 例子:\bhi\b可以用来匹配hi这个单词,且 ...

  2. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  3. Python中使用第三方库xlrd来写入Excel文件示例

    Python中使用第三方库xlrd来写入Excel文件示例 这一篇文章就来介绍下,如何来写Excel,写Excel我们需要使用第三方库xlwt,和xlrd一样,xlrd表示read xls,xlwt表 ...

  4. 【转】利用Python中的mock库对Python代码进行模拟测试

    出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...

  5. python中的turtle库绘制图形

    1. 前奏: 在用turtle绘制图形时,需要安装对应python的解释器以及IDE,我安装的是pycharm,在安装完pycharm后,在pycharm安装相应库的模块,绘图可以引入turtle模块 ...

  6. python 中有趣的库tqdm

    Tqdm 是 Python 进度条库,可以在 Python 长循环中添加一个进度提示信息用法:tqdm(iterator) # 方法1: import time from tqdm import tq ...

  7. Python中的BeautifulSoup库简要总结

    一.基本元素 BeautifulSoup库是解析.遍历.维护“标签树”的功能库. 引用 from bs4 import BeautifulSoup import bs4 html文档-标签树-Beau ...

  8. Python中关于第三方库的补充

    Python语言的强大之处在于它的开源.正是因为它的开源,产生了成百上千的第三方库,涵盖了计算机的几乎所有的方向.第三方库的安装也并不是特别的复杂,通过在cmd中使用pip命令可以安装几乎所有的库,但 ...

  9. python中的Matplot库和Gdal库绘制富士山三维地形图-参考了虾神的喜马拉雅山

    首先请大家读一下面这篇文章了解什么是Gdal http://blog.csdn.net/grllery/article/details/77822595 剩下的我要公布绘制富士山的代码了,虽然基本co ...

随机推荐

  1. 【LeetCode】405. Convert a Number to Hexadecimal 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...

  2. 【LeetCode】47. Permutations II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:递归 方法二:回溯法 日期 题目地址:htt ...

  3. 【LeetCode】701. Insert into a Binary Search Tree 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  4. 【剑指Offer】数组中只出现一次的数字 解题报告(Python)

    [剑指Offer]数组中只出现一次的数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  5. 【剑指Offer】数据流中的中位数 解题报告(Python)

    [剑指Offer]数据流中的中位数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  6. P1547逆转,然后再见

    描述 上届的高三在这个暑假终于要到各个城市奔向他们的大学生活了.奇怪的是学校这次异常阔气,说要用三台车子去载他们上学.上届高三的师兄们异常兴奋--可惜的是临行的时候,学校终于露出它"狰狞&q ...

  7. pytest之 fixture 实现机制

    一.相同测试数据存放优化 在讲 fixture 实现机制之前,插入一段内容 上次有个小伙伴问我说,类似下面的用例代码情况,每条测试用例的数据都一样的,我们可以怎么进行优化吗? 当然是可以的 其实我们可 ...

  8. 读书笔记markdown模板

    读书笔记 书名 作者 出版社 阅读日期 书籍背景 书摘/ 笔记 批注 总结& 收获 读完每一本书,把书中的知识转化为「自己的智慧」,才是最扎实的收获- 他山之石 摘录相关精彩书评-

  9. CS5211完全替代兼容LT7211|PS8625|CH7511方案|EDP转LVDS|Capstone CS5211

    CH7511|LT7211|PS8625替代方案--Capstone CS5211AN 设计EDP转LVDS优势方案原理图+PCB板设计 CH7511|LT7211|PS8625这三款都是专门用于设计 ...

  10. 替代联阳IT6564方案|CS5262替代IT6564|设计DP转HDMI+VGA扩展坞方案

    联阳IT6564:带嵌入式MCU的单芯片4通道DisplayPort1.2到HDMI2.0/VGA转换器 联阳IT6564是一种高性能的单芯片显示端口到HDMI和VGA转换器.IT6564FN结合Di ...