基于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. Spring核心原理之IoC容器初体验(2)

    本文节选自<Spring 5核心原理> 1 IoC与DI基本概念 IoC(Inversion of Control,控制反转)就是把原来代码里需要实现的对象创建.依赖,反转给容器来帮忙实现 ...

  2. JAVA连接MySQ报错:Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_version

    Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_version at sun.security.ssl.Al ...

  3. 手把手教你如何使用 webpack5 的模块联邦新特性

    想象一下,在webpack5还没出来前,前端使用第三方组件库,例如使用 dayjs 日期处理库,都是通过 npm i dayjs -s 安装 dayjs 模块到项目里,然后就可以通过 require ...

  4. 【九度OJ】题目1107:搬水果 解题报告

    [九度OJ]题目1107:搬水果 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1107 题目描述: 在一个果园里,小明已经将所有的水 ...

  5. 【LeetCode】108. Convert Sorted Array to Binary Search Tree 解题报告 (Java & Python)

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

  6. 【LeetCode】732. My Calendar III解题报告

    [LeetCode]732. My Calendar III解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/my-calendar ...

  7. 突破技术限制,实现Web端静默打印

    作为Web开发的同僚们,估计都有一个共同的烦恼,Web端为什么不能够像 CS端那样直接打印预览?直接移除掉打印预览界面不就可以了? 真实情况是Web端受限于浏览器的权限,无法直接访问打印机等本机资源. ...

  8. Java代码性能优化

    (1)在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 控制资源的使用,通过线程同步来控制资源的并 ...

  9. CS5216PIN TO PIN替换PS8402A方案|PS8402A电路设计原理图|CS5216芯片

    PS8402A是HDMI 电平移位器/中继器专为2型双模Display Port(DP++)电缆适配器应用而设计.它设计用于Display Port到DVI或Display Port到HDMI的2型适 ...

  10. Java Web程序设计笔记 • 【目录】

    章节 内容 实践练习 Java Web程序设计作业目录(作业笔记) 第1章 Java Web程序设计笔记 • [第1章 Web应用程序] 第2章 Java Web程序设计笔记 • [第2章 JSP基础 ...