同步操作将从 lycclsltt/sunyata 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
Agileutil是一个Python3 RPC框架,client和server既可以直连,也可以通过Consul做服务注册发现。
Python 版本 >= 3.6
pip install agileutil
下面是一个TCP协议的服务端例子。
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()
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)
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)
底层是基于高性能的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()
客户端使用对应的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)
将TcpRpcServer替换为UdpRpcServer即可。
from agileutil.rpc.server import UdpRpcServer, rpc
@rpc
def sayHello(name):
return 'hello ' + name
server = UdpRpcServer('0.0.0.0', 9988)
server.serve()
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服务端暂不支持。一旦服务进程挂掉,那么客户端会请求到其他健康的服务端节点上。
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, 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()
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。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。