热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python语言下的RPC开发

一、httpserver实现rpc 1、server.pyfromhttp.serverimportHTTPServer,BaseHTTPRequestHandlerfromurl

一、httpserver实现rpc


 1、server.py

from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qsl
import json
host
= ('', 8000)
class UserHandler(BaseHTTPRequestHandler):
def do_GET(self):
"""处理get请求"""
parse_url
= urlparse(self.path) # 处理请求地址
qs = dict(parse_qsl(parse_url.query)) # 获取请求地址中携带的参数
uid = int(qs.get("uid", 0)) # 比如携带的参数是uid
self.send_response(200) # 设置响应码
self.send_header('Content-type', 'application/json') # 设置响应头
self.end_headers()
if uid == 1: # 写入响应体
self.wfile.write(
json.dumps(
{
"username": "bily",
"gender": "male"
}
).encode(
"utf-8")
)
if __name__ == '__main__':
server
= HTTPServer(host, UserHandler)
server.serve_forever()

2、client.py

import requests
# 请求
res = requests.get(url="http://127.0.0.1:8000/?uid=1")
print(res.text)

上面其实就是实现了一个http的服务,通过http请求来完成客户端对于服务端的请求,但是显然有一些不满足远程过程调用的要求,比如客户端的调用应该向本地调用一样,而不是发送请求,那么我们可以将客户端进行一下封装:

import requests
class Client:
def __init__(self, url):
self.url
= url
def get_user(self):
res
= requests.get(url=self.url)
return res.text
c
= Client("http://127.0.0.1:8000/?uid=1")
# 模拟本地调用
res = c.get_user()
print(res)

可以看到通过封装后调用get_user方法,屏蔽了底层一些网络协议的细节。


二、基于xml实现rpc


 1、server.py

from xmlrpc.server import SimpleXMLRPCServer
class Calculate:
def add(self, x, y):
return x + y
obj
= Calculate()
server
= SimpleXMLRPCServer(("localhost", 8000))
# 将实例注册到rpc server
server.register_instance(obj)
server.serve_forever()

2、client.py

from xmlrpc import client
c
= client.ServerProxy("http://localhost:8000")
# 远程调用服务端的函数
res = c.add(3, 5)
print(res)

三、基于json实现rpc

基于xml是通过xml来进行数据的编码和解码,不过经常用到的的序列化和反序列化的还有json,那么如何通过json来实现rpc呢?

需要借助于jsonrpclib这个库,安装:

pip install jsonrpclib-pelix

1、server.py

from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer
class Calculate:
def sub(self, x, y):
return x - y
server
= SimpleJSONRPCServer(("localhost", 8000))
# 注册函数
server.register_function(lambda x, y: x + y, "add")
# 注册实例
obj = Calculate()
server.register_instance(obj)
server.serve_forever()

2、client.py

import jsonrpclib
client
= jsonrpclib.ServerProxy("http://localhost:8000")
res1
= client.add(1, 2)
res2
= client.sub(3, 5)
print(res1)
print(res2)

四、 基于zerorpc实现rpc

zerorpc是利用 zeroMQ消息队列 + msgpack 消息序列化(二进制) 来实现类似 grpc 的功能,跨语言远程调用。

zerorpc可以以编程方式或从命令行使用。它带有一个方便的脚本“zerorpc”,允许:



  • 无需修改任何代码即可公开 Python 模块

  • 通过命令行远程调用这些模块

不过它会依赖一些库,比如:msgpack-python, pyzmq, future, greenlet, gevent

所以使用它之前需要先进行安装:

pip install zerorpc

(一)一元调用


1、server.py

import zerorpc
class Calculate:
def add(self, a, b):
return a + b
server
= zerorpc.Server(Calculate())
server.bind(
"tcp://0.0.0.0:8000")
server.run()

2、client.py

import zerorpc
client
= zerorpc.Client()
client.connect(
"tcp://127.0.0.1:8000")
res
= client.add(2, 3)
print(res)

(二)流式响应


1、server.py

import zerorpc
class StreamingNum:
@zerorpc.stream
def streaming_range(self, start, end, step):
return range(start, end, step) # 返回的是一个生成器

server
= zerorpc.Server(StreamingNum())
server.bind(
"tcp://0.0.0.0:8000")
server.run()

2、client.py

import zerorpc
client
= zerorpc.Client()
client.connect(
"tcp://127.0.0.1:8000")
res
= client.streaming_range(1, 10, 2)
for i in res:
print(i)

 

作者:iveBoy

出处:http://www.cnblogs.com/shenjianping/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。



推荐阅读
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
author-avatar
mobiledu2502924751
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有