基于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. LocalDateTime与Date相互转换

    LocalDateTime 转 Date LocalDateTime localDateTime=LocalDateTime.now() Date date = Date.from(localDate ...

  2. 【LeetCode】559. Maximum Depth of N-ary Tree 解题报告(Python)

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

  3. Chapter 9 Measurement Bias

    目录 9.1 Measurement Error The structure of measurement error 9.3 Mismeasured confounders 9.4 Intentio ...

  4. Essentially No Barriers in Neural Network Energy Landscape

    目录 梗概 主要内容 path的定义 path的逼近 Mechanical Model Nudged Elastic Band 局部最优 Draxler F, Veschgini K, Salmhof ...

  5. 以简御繁介绍IOC

    1.IOC的理论背景 大家开发理念,一直都是奔着架构稳定.低耦合性.而IOC初衷,就是为了解决模块依赖问题,理解<六大设计原则(SOLID)> 如图所示,在我们开发中,业务的实现,就是靠着 ...

  6. 编写Java程序_输入三个整数x,y,z,请把这三个数由小到大输出,请写出实现代码。(3种方法)

    要求说明: 输入三个整数x,y,z,请把这三个数由小到大输出. 实现代码: 第1种方法: import java.util.Scanner; public class xyzMaxMin{ publi ...

  7. 合并区间(c++)

    L. 合并区间 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 给出n个闭区间,把其中有重叠的区间合并为一个区间. 例如,给出4个区间, ...

  8. Jenkins_centos7安装jenkins(1)

    Jenkins自动化部署的流程 一.下载安装 下载安装JDK wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/j ...

  9. 初识python: flush 实现进度条打印

    通过flush(强制刷新)实现,类似进度条打印: #!/user/bin env python # author:Simple-Sir # time:20180918 #打印进度条 import sy ...

  10. spring boot --- 使用 注解 读取 properties 文件 信息

    1.前言 以前使用spring MVC框架 ,读取properties 配置文件需要写一大堆东西 ,也许 那时候 不怎么使用注解 ,现在使用spring boot ,发现了非常简便的办法---使用注解 ...