Skip to main content
 Web开发网 » 站长学院 » 浏览器插件

Agileutil 一个 Python3 轻量级的RPC框架

2021年11月03日6220百度已收录

Agileutil 一个 Python3 轻量级的RPC框架  轻量级框架 第1张

AgileutilAgileutil是一个Python3 RPC框架。基于微服务架构,封装了rpc/,开发者可以很快上手,快速进行业务开发。

安装pip install agileutilRPC这是Agileutil最核心的功能。基于TCP协议和Pickle序列化方式实现的远程过程调用。下面是一个基于TCP协议的服务端例子。可参考下面的步骤进行开发:

创建一个TcpRpcServer对象, 指定服务端监听地址和端口调用regist()方法,将提供服务的方法注册到服务端(只有调用regist()方法注册过的服务,才可以被客户端访问)调用serve()方法,开始处理客户端请求TCP RPC 服务端from agileutil.rpc.server import TcpRpcServerdef sayHello(name): return 'hello ' + namenationServer = TcpRpcServer('0.0.0.0', 9988, workers=4)nationServer.regist(sayHello)nationServer.serve()TCP RPC 客户端客户端例子:

创建TcpRpcClient对象,指定RPC服务端地址通过call()方法,指定服务端方法名称和参数(注意:如果方法名不存在,或者服务端未调用regist()方法注册,那么call()方法将抛出异常)call() 方法的返回值和在本地调用一样,原来是什么返回类型,就还是什么(例如返回字典、列表、对象甚至内置类型,经过序列化后,不会发生改变)from agileutil.rpc.client import TcpRpcClientc = TcpRpcClient('127.0.0.1', 9988)resp = c.call(func = 'sayHello', args = ('zhangsan'))print('resp', resp)Tornado RPC 服务端TornadoTcpRpcServer同样是基于TCP协议的RPC服务端,只是底层是基于Tornado高性能网络库实现。你同样可以使用TornadoTcpRpcServer创建一个TCP服务,参考TcpRpcServer的创建步骤:

创建一个TornadoTcpRpcServer对象,指定监听的地址和端口调用regist()注册需要提供给客户端的方法调用server()方法开始处理客户端请求from agileutil.rpc.server import TornadoTcpRpcServerdef rows(): return {'name' : 123}s = TornadoTcpRpcServer('127.0.0.1', 9988)s.regist(rows)s.serve()Tornado RPC 客户端客户端使用TcpRpcClient对象即可。

from agileutil.rpc.client import TcpRpcClientc = TcpRpcClient('127.0.0.1', 9988)resp = c.call(func = 'rows'))print('resp', resp)的用法类似:

from agileutil.rpc.server import 对象:

from agileutil.rpc.client import 类似:

创建UdpRpcServer对象,指定监听的地址和端口调用regist()方法,将需要被客户端请求的方法注册进去调用serve()方法开始处理客户端请求返回的内容和调用本地方法没有差别,框架内部通过序列化和反序列化,将数据转化为程序内的对象(字典、列表、内置类型、各种类对象等等)from agileutil.rpc.server import UdpRpcServerdef sayHello(name): return 'hello ' + names = UdpRpcServer('0.0.0.0', 9988)s.regist(sayHello)s.serve()UDP RPC 客户端一个UDP客户端的例子:

创建UdpRpcClient对象,指定服务端地址和端口调用call()方法,并指定服务端的方法名称和参数返回的内容和调用本地方法没有差别,框架内部通过序列化和反序列化,将数据转化为程序内的对象(字典、列表、内置类型、各种类对象等等)from agileutil.rpc.client import UdpRpcClientcli = UdpRpcClient('127.0.0.1', 9988)for i in range(5000): resp = cli.call(func = 'sayHello', args =('xiaoming') ) print(resp)服务发现Agileutil既支持客户端与服务端直连,也支持服务注册发现 (客户端与服务端直连的例子,请参考上面的TcpRpcServer部分)。 目前仅支持基于Consul的服务发现,未来计划支持etcd。TCP/UDP/为例。

健康检查基于Consul的Check机制。服务注册后,自动添加一个定期的健康检查(默认为TCP端口检查,未来有计划支持发现,这时客户端如果请求到挂掉的服务节点上失败后,客户端会尝试请求其他服务节点进行重试。

快速开始服务注册发现的使用也很简单,请耐心看完。

第一步,你需要定义一个DiscoverConfig对象。 指定用于服务注册发现的Consul的地址和端口。同时通过serviceName参数指定一个全局唯一的服务名称(用于标记服务端服务)。同时指定服务端监听的地址和端口。from agileutil.rpc.discovery import DiscoveryConfigdisconf = 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/字段

CREATE TABLE `nation` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8首先调用Model.init()方法,设置mysql连接地址等信息然后为nation表定一个Nation类,并继承自Model类指定字段类型from agileutil.orm import Model, IntField, CharFieldModel.init('127.0.0.1', 3306, 'root', '', 'test2', min_conn_num=10)class Nation(Model): tableName = 'nation' #required primaryKey = 'id' #required id = IntField() #field type int name = CharField() #field type char创建记录Nation(name='test').create()查询一条记录obj = Nation.filter('name', '=', 'test').first()print(obj.name, obj.id)查询多条记录objs = Nation.filter('name', '=', 'test')for obj in objs: print(obj.name, obj.id)修改记录obj = Nation.filter('name', '=', 'test').first()obj.name = 'test update'obj.update()删除记录Nation.filter('name', '=', 'test').delete()另一种删除的方式

obj = Nation.filter('name', '=', 'test').first()obj.delete()PoolDBPooolDB实现了数据库连接池,并且ORM功能是基于PoolDB实现的。对于常用的数据库操作,如果不使用ORM,直接使用PoolDB也是可以的。

定义 PoolDB 对象.from agileutil.db4 import PoolDBdb = PoolDB(host='127.0.0.1', port=3306, user='root', passwd='', dbName='test2', min_conn_num=10)db.connect()查询记录sql = 'select * from nation'rows = db.query(sql)print(rows)删除、修改、插入记录sql = "insert into nation(name) values('test')"effect, lastid = db.update(sql)print(effect,lastid)sql = "delete from nation where name='test'"effect, _ = db.update(sql)print(effect,lastid)DBDB 是一个操作数据库的类,和PoolDB的区别是,它不支持数据库连接池,因此更建议使用PoolDB.它的用法和PoolDB是相似的。

定义DB对象from agileutil.db import DBdb = DB(host='127.0.0.1', port=3306, user='root', passwd='', dbName='test2')查询记录sql = 'select * from nation'rows = db.query(sql)print(rows)修改、删除、插入记录sql = "insert into nation(name) values('test')"effetc = db.update(sql)print(effetc, db.lastrowid())日志Agileutil提供了一个线程安全的Log对象,使用起来非常简单。

from agileutil.log import Loglogger = Log('./debug.log')logger.info(123, '456')logger.warning('warning')logger.error('error')日志切割默认日志按天分割,保留最近7天的,你也可以指定日志保留的天数。

logger = Log('./debug.log', logSaveDays=7)logger.info('info')当然,也可以强制不切割日志,通过isRotate参数。

logger = Log('./debug.log', isRotate=False)logger.info('info')ERROR级别日志默认的,ERROR级别的日志,在日志文件中会被标红表示,更加醒目,便于排查问题。

logger.error('runtimee exception raise')

评论列表暂无评论
发表评论
微信