AgileutilPython3 RPC 框架
Agileutil是一个Python3 RPC框架,client和server可以通过直连的方式访问,也可以通过Consul做服务注册发现。
特性
- 像本地函数一样调用
- 使用简单,用户只需要关注业务即可
- HTTP/UDP/TCP 全协议支持
- 支持异步 async/await
快速开始
Python 版本 >= 3.6
安装
pip install agileutil
TCP RPC 服务端
下面是一个TCP协议的服务端例子。
- 创建一个TcpRpcServer对象, 指定服务端监听地址和端口
- 通过@rpc装饰器注册需要被客户端请求的方法
- 调用serve()方法,开始处理客户端请求
from agileutil.rpc.server import TcpRpcServer, rpc import asyncio @rpc class TestService: def hello(self, name): return "Hello, {}!".format(name) async def add(self, a, b, c): asyncio.sleep(1) return a + b + c @rpc def hello(name): return "Hello, {}!".format(name) server = TcpRpcServer('0.0.0.0', 9988) server.serve()
TCP RPC 客户端
- 创建TcpRpcClient对象,指定RPC服务端地址
- 通过call()方法,指定服务端方法名称和参数(注意:如果方法名不存在,或者服务端未调用@rpc装饰器注册,那么call()方法将抛出异常)
- call() 方法的返回值和在本地调用一样,原来是什么返回类型,就还是什么(例如返回字典、列表、对象甚至内置类型,经过序列化后,不会发生改变)
from agileutil.rpc.client import TcpRpcClient cli = TcpRpcClient('127.0.0.1', 9988, timeout = 2) resp = cli.call('TestService.hello', 'xiaoming') print(resp) resp = cli.call('TestService.add', a=1, b=2, c=3) print(resp) resp = cli.call('hello', name = 'xiaoming') print(resp)
指定多个服务端地址
- 通过servers参数,你可以创建一个指定多个服务端地址的client对象,默认采用轮询的负载均衡策略,将请求转发到多个server上,如果请求其中一个server出现了失败,那么会自动重试。
from agileutil.rpc.client import TcpRpcClient c = TcpRpcClient(servers = ['127.0.0.1:9988', '127.0.0.1:9989']) resp = c.call('hello', 'zhangsan') print(resp)
HTTP RPC 服务端
底层是基于高性能的Sanic异步web框架实现的,使用起来非常简单,和TcpRpcServer的用法类似:
from agileutil.rpc.server import HttpRpcServer, rpc @rpc def sayHello(name): return 'hello ' + name s = HttpRpcServer('0.0.0.0', 9988, workers=1) s.serve()
HTTP RPC Client
客户端使用对应的HttpRpcClient对象:
from agileutil.rpc.client import HttpRpcClient c = HttpRpcClient('127.0.0.1', 9988) for i in range(10): resp = c.call('sayHello', 'zhangsan') print(resp)
UDP RPC 服务端
将TcpRpcServer替换为UdpRpcServer即可。
- 创建UdpRpcServer对象,指定监听的地址和端口
- 调用regist()方法,将需要被客户端请求的方法注册进去
- 调用serve()方法开始处理客户端请求
- 返回的内容和调用本地方法没有差别,框架内部通过序列化和反序列化,将数据转化为程序内的对象(字典、列表、内置类型、各种类对象等等)
from agileutil.rpc.server import UdpRpcServer, rpc @rpc def sayHello(name): return 'hello ' + name server = UdpRpcServer('0.0.0.0', 9988) server.serve()
UDP RPC 客户端
- 创建UdpRpcClient对象,指定服务端地址和端口
- 调用call()方法,并指定服务端的方法名称和参数
- 返回的内容和调用本地方法没有差别,框架内部通过序列化和反序列化,将数据转化为程序内的对象(字典、列表、内置类型、各种类对象等等)
from agileutil.rpc.client import UdpRpcClient cli = UdpRpcClient('127.0.0.1', 9988) for i in range(5000): resp = cli.call('sayHello', name = 'xiaoming' ) print(resp)
服务发现
除了客户端与服务端直连,也支持服务注册发现(客户端与服务端直连的例子,请参考上面的TcpRpcServer部分)。 目前仅支持基于Consul的服务发现,未来计划支持etcd。下面的例子以TCP为例。
健康检查
基于Consul的Check机制,服务注册后,自动添加一个定期的检查任务。默认为TCP端口检查,支持TCP/HTTP RPC服务端,UDP服务端暂不支持。一旦服务进程挂掉,那么客户端会请求到其他健康的服务端节点上。
快速开始
- 第一步,你需要定义一个DiscoverConfig对象。 指定用于服务注册发现的Consul的地址和端口。同时通过serviceName参数指定一个全局唯一的服务名称(用于标记服务端服务)。同时指定服务端监听的地址和端口。
from agileutil.rpc.discovery import DiscoveryConfig disconf = DiscoveryConfig( consulHost = '192.168.19.103', consulPort = 8500, serviceName = 'test-rpc-server', serviceHost = local_ip(), servicePort = 9988 )
说明: 1.consulHost 和 consulPort 参数指定Consul的地址和端口 2.ServiceName 参数用于标记服务端名称,并通过服务名称进行服务发现,需要保证全局唯一 3.serviceHost和servicePort参数指定服务端监听的端口和地址
- 第二步、调用setDiscoverConfig()方法将DiscoveryConfig对象传入
- 第三步,调用serve()方法,开始处理请求
s = TcpRpcServer('0.0.0.0', 9988) s.regist(sayHello) disconf = DiscoveryConfig( consulHost = '192.168.19.103', consulPort = 8500, serviceName = 'test-rpc-server', serviceHost = local_ip(), servicePort = 9988 ) s.setDiscoverConfig(disconf) s.serve()
完整的服务端示例 (UDP/HTTP调用方式相同)
from agileutil.rpc.server import TcpRpcServer, rpc from agileutil.rpc.discovery import DiscoveryConfig from agileutil.util import local_ip @rpc def sayHello(name): return 'hello ' + name disconf = DiscoveryConfig( consulHost = '192.168.19.103', consulPort = 8500, serviceName = 'test-rpc-server', serviceHost = local_ip(), servicePort = 10001 ) server = TcpRpcServer('0.0.0.0', 10001) server.setDiscoverConfig(disconf) server.serve()
完整的客户端示例(UDP/HTTP调用方式相同)
- 创建DiscoveryConfig对象,指定Consul的地址端口(serviceName参数和服务端的保持一致,且全局唯一)
- 调用setDiscoveryConfig()方法传入服务发现配置
from agileutil.rpc.client import TcpRpcClient from agileutil.rpc.discovery import DiscoveryConfig cli = TcpRpcClient() disconf = DiscoveryConfig( consulHost= '192.168.19.103', consulPort= 8500, serviceName='test-rpc-server' ) cli.setDiscoveryConfig(disconf) resp = cli.call('sayHello', name = 'mary') print(resp)
数据压缩
默认采用lz4进行压缩、解压缩(经过测试,它的压缩效果和gzip, zlib比较接近,压缩、解压缩性能是zlib的10倍左右)。 在数据传输大于4KB时,自动开启进行压缩。对端根据一个标记位进行判断,自动进行解压缩处理(或不处理,未经过压缩的情况)。开发者无需关心 数据的压缩、解压缩过程,经过测试对性能的影响极低(由于采用了level1级别的压缩),最高可减少75%的网络IO。
评论
前端框架新势力大盘点
点击上方 前端Q,关注公众号回复加群,加入前端Q技术交流群近年来,前端领域快速发展,新的框架不断涌现,为开发者提供了更多选择和解决方案。尽管 React、Vue、Angular、Next.js、Preact 等老牌框架依然稳坐市场主流,但新势力前端框架的崛起也为特定场景带来了更佳的适配和优
前端Q
0
110 个 Java 主流组件和框架整理,常用的应有尽有,建议收藏!!
点击关注公众号,Java 干货及时推送↓推荐阅读:铜三铁四,怒拿 35K * 14 薪!整理:四猿外以下排序是按照从技术组件到开发框架到代码工具,也有一些实在不好分类的,就放到最后了。WEB 容器Tomcathttps://tomcat.apache.org/Jettyhttps://ww
Java技术栈
0
大模型“芝麻开门”的首选框架,LangChain全新教程!附600分钟详解视频
LangChain 作为一个开源的大语言模型应用框架,自诞生之日起就备受瞩目。然而,它的发展之路却走过了不少曲折。一开始,LangChain 遭受了不少质疑和非议。有人认为它只适合入门学习,代码质量和设计缺乏工业级的严谨性,难以应用于生产环境。的确,作为一个新兴项目,LangChain 的早期版本还
机器学习算法与Python实战
10
一个开源的轻量级agent框架-Agere
Datawhale干货 推荐人:happyapplehorse,Datawhale学习者简介agere是一个开源的轻量级agent框架,主要特点是通用性和完全的可定制性。它通过将一个复杂流程拆解为一系列独立的小步骤,来简化构建具有复杂逻辑的agent的流程。agere是agen
Datawhale
10
Gin 框架介绍与快速入门
目录Gin 框架介绍与快速入门1.gin.Engine2.gin.Context1.安装2.导入3.第一个Gin 应用1. 快速和轻量级2. 路由和中间件3. JSON解析4. 支持插件5. Gin相关文档一、Gin框架介绍二、基本使用三、应用举例四、Gin 入门核心...
马哥Linux运维
0
Rust网络框架Pingora源码阅读1
要想深入Pingora应该是需要阅读源代码的,所以分析一下源代码,虽然Pingora没有提供丰富的示例,但是提供了一些不错的文档,比如它的internals.md文档,提供了很多细节和示意图,本系列文章会引用很多其中的示意图,...
邓胖
0
【回顾】一款基于 Go 语言的高性能、轻量级、非阻塞、I/O 事件驱动网络框架
关注 "GitHub精选",设为 "星标"探索有意思的开源项目大家好,又见面了,我是 GitHub 精选君!背景介绍在进行 Go 语言的 TCP 网络编程时,我们通常使用标准库(go net),但是标准库的协程压力较大,因此我们需要一...
开源你我他
0
宇宙人(1465期)SpaceX被曝正为美国情报机构建设间谍卫星网络;FCC批准手机直连管理框架;美将发射可识别人脸的超低轨星座
社会资源永远是有限的,好东西要靠抢。只有弱者才会坐等分配。——利弗莫尔#SpaceX被曝正为美国情报机构建设间谍卫星网络据路透社16日报道称,据知情人士透露,美国太空探索技术公司(SpaceX)正在根据与美国情报机构...
卫星与网络
0