python微服务框架nameko简单使用教程

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

微信截图_20220120111636.png

rabbitmq管理地址http://localhost:15672/,账户密码均为guest

微信截图_20220120111753.png

微信截图_20220120111809.png

接着我们使用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

然后我们可以在发布服务侧看到打印了我们刚才的调用
微信截图_20220120114552.png

在发布服务中的类中的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()等待结果。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/811.html