nameko是python语言的一个微服务框架,支持通过rabbitmq消息队列传递的rpc调用,也支持http调用
nameko采用RabbitMQ作为注册中心,所以使用nameko必须要先安装RabbitMQ
我们先用容器来安装RabbitMQ,首先拉取rabbitmq镜像
docker pull rabbitmq:management
启动rabbitmq容器
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management
rabbitmq管理地址http://localhost:15672/,账户密码均为guest
接着我们使用nameko编写一个简单的微服务进行测试,首先需要安装nameko
pip install nameko
然后我们发布一个服务,测试deploy_service_demo.py代码如下
#!/usr/bin/python3 #coding:utf-8 from nameko.rpc import rpc class deploy_service_demo: name = "cs" @rpc def test_service(self, test): print("test nameko {} service !".format(test))
需要使用nameko启动命令发布服务
nameko run deploy_service_demo --broker amqp://guest:guest@172.28.3.47
然后我们编写一个调用端服务call_service.py试试,代码如下:
#coding:utf-8 from flask_login import user_accessed from nameko.standalone.rpc import ClusterRpcProxy CONFIG = {'AMQP_URI': "amqp://guest:guest@172.28.3.47"} def use_service(): with ClusterRpcProxy(CONFIG) as rpc: rpc.cs.test_service("my") if __name__ == "__main__": use_service()
执行测试下
python call_service.py
然后我们可以在发布服务侧看到打印了我们刚才的调用
在发布服务中的类中的name属性就是微服务的服务名,所以我们在调用的时候用的ClusterRpcProxy直接使用这个name属性的值,也就是微服务名而不是类名
如果调用时使用call_async,则是异步调用,代码如下:
#!/usr/bin/python3 #coding:utf-8 from flask_login import user_accessed from nameko.standalone.rpc import ClusterRpcProxy CONFIG = {'AMQP_URI': "amqp://guest:guest@172.28.3.47"} def use_service(): with ClusterRpcProxy(CONFIG) as rpc: async_ret = rpc.cs.test_service.call_async("your") print(async_ret.result()) if __name__ == "__main__": use_service()
那么在调用async_ret.result()时会等待异步任务返回结果,需要注意的是,运行 ClusterRpcProxy(config) 时会创建与队列的连接,该操作比较耗时,如果有大量的微服务调用,不应该重复创建连接,应在语句块内完成所有调用。异步调用的结果只能在语句块内获取,即调用.result()等待结果。