同步操作将从 lycclsltt/sunyata 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
中文 | English
Agileutil是一个Python3 RPC框架。基于微服务架构,封装了rpc/http/orm/log等常用组件,提供了简洁的API,开发者可以很快上手,快速进行业务开发。
pip install agileutil
这是Agileutil最核心的功能。基于TCP协议和Pickle序列化方式实现的远程过程调用。下面是一个基于TCP协议的服务端例子。可参考下面的步骤进行开发:
from agileutil.rpc.server import TcpRpcServer
def sayHello(name):
return 'hello ' + name
nationServer = TcpRpcServer('0.0.0.0', 9988, workers=4)
nationServer.regist(sayHello)
nationServer.serve()
客户端例子:
from agileutil.rpc.client import TcpRpcClient
c = TcpRpcClient('127.0.0.1', 9988)
resp = c.call(func = 'sayHello', args = ('zhangsan'))
print('resp', resp)
TornadoTcpRpcServer同样是基于TCP协议的RPC服务端,只是底层是基于Tornado高性能网络库实现。你同样可以使用TornadoTcpRpcServer创建一个TCP服务,参考TcpRpcServer的创建步骤:
from agileutil.rpc.server import TornadoTcpRpcServer
def rows():
return {'name' : 123}
s = TornadoTcpRpcServer('127.0.0.1', 9988)
s.regist(rows)
s.serve()
客户端使用TcpRpcClient对象即可。
from agileutil.rpc.client import TcpRpcClient
c = TcpRpcClient('127.0.0.1', 9988)
resp = c.call(func = 'rows'))
print('resp', resp)
Agileutil也提供了基于HTTP协议的远程过程调用。底层是基于高性能的Sanic异步web框架实现的,使用起来非常简单,和TcpRpcServer的用法类似:
from agileutil.rpc.server import HttpRpcServer
def sayHello(name):
return 'hello ' + name
s = HttpRpcServer('0.0.0.0', 9988, workers=1)
s.regist(sayHello)
s.serve()
同样的,客户端使用对应的HttpRpcClient对象:
from agileutil.rpc.client import HttpRpcClient
cli = HttpRpcClient('127.0.0.1', 9988)
for i in range(10):
resp = cli.call(func = 'sayHello', args=('zhangsan'))
print('resp', resp)
如果想要使用UDP协议,将TcpRpcServer替换为UdpRpcServer即可。一个UDP RPC服务端的例子如下,与TCP类似:
from agileutil.rpc.server import UdpRpcServer
def sayHello(name):
return 'hello ' + name
s = UdpRpcServer('0.0.0.0', 9988)
s.regist(sayHello)
s.serve()
一个UDP客户端的例子:
from agileutil.rpc.client import UdpRpcClient
cli = 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/HTTP这些协议的服务端、客户端类库均支持服务注册发现,下面的例子以TCP为例。
基于Consul的Check机制。服务注册后,自动添加一个定期的健康检查(默认为TCP端口检查,未来有计划支持HTTP健康检查)。一旦服务进程挂掉,那么客户端将请求到其他健康的服务节点上。同时客户端也存在重试机制,由于健康检查存在时间间隔,可能服务端进程挂掉后,仍需等待一段时间才被Consul发现,这时客户端如果请求到挂掉的服务节点上失败后,客户端会尝试请求其他服务节点进行重试。
服务注册发现的使用也很简单,请耐心看完。
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参数指定服务端监听的端口和地址
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()
from agileutil.rpc.server import TcpRpcServer
from agileutil.rpc.discovery import DiscoveryConfig
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.regist(sayHello)
server.serve()
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)
for i in range(3):
resp = cli.call(func = 'sayHello', args=('mary'))
定义一个nation表,包含两个字段:id字段和name字段
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
from agileutil.orm import Model, IntField, CharField
Model.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()
PooolDB实现了数据库连接池,并且ORM功能是基于PoolDB实现的。对于常用的数据库操作,如果不使用ORM,直接使用PoolDB也是可以的。
from agileutil.db4 import PoolDB
db = 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)
DB 是一个操作数据库的类,和PoolDB的区别是,它不支持数据库连接池,因此更建议使用PoolDB.它的用法和PoolDB是相似的。
from agileutil.db import DB
db = 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 Log
logger = 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级别的日志,在日志文件中会被标红表示,更加醒目,便于排查问题。
logger.error('runtimee exception raise')
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。