写点什么

推荐一款 Python 微服务框架 - Nameko

用户头像
星安果
关注
发布于: 刚刚

1. 前言

大家好,我是安果!


考虑到 Python 性能及效率性,Python Web 端一直不温不火,JAVA 和 Golang 的微服务生态一直很繁荣,也被广泛用于企业级应用开发当中


​本篇文章将介绍一款 Python 微服务框架:「 Nameko 」

2. Nameko 介绍

Nameko 是一款小巧、简洁的、异步通信方式的微服务架构


它采用 RabbitMQ 消息队列作为消息中间件,基于发布者、订阅者模式


其中,消费者与生产者基于 RPC 进行通讯


项目地址:https://github.com/nameko/nameko

3. 实战一下

下面以 Flask 为例聊聊搭建 Python 微服务的步骤


3-1  安装 RabbitMQ 及启动


这里推荐利用 Docker 安装 RabbitMQ,以 Centos 为例


# 1、下载某个版本的RabbitMQ的镜像# MQ版本号:3.9.5docker pull rabbitmq:3.9.5-management
# 2、查看镜像docker images
# 3、启动MQ容器# p:指定应用端口及Web控制台端口# hostname:主机名# e:环境变量# RABBITMQ_DEFAULT_VHOST:虚拟机名称# RABBITMQ_DEFAULT_USER:用户名# RABBITMQ_DEFAULT_PASS:密码# 3e83da0dc938:MQ镜像IDdocker run -d --name rabbitmq3.9.5 -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin 3e83da0dc938
复制代码


需要注意的是,启动 MQ 容器时,利用 -p 指定了两个端口


  • 5672

  • 应用访问端口

  • 15672

  • 控制台 Web 访问端口号


然后,开放防火墙的 5672、15672 端口号


PS:如果是云服务器,需要另外配置安全组


最后,在浏览器中通过下面的连接进入到 MQ 后台 Web 管理页面


地址:http://ip 地址:15672


3-2  安装依赖包


使用 pip 命令在虚拟环境下安装 nameko、flask 依赖包


# 安装依赖包# namekopip3 install nameko
# flaskpip3 install flask
复制代码


3-3  创建服务生产者 Producer


自定一个类,使用 name 属性定义服务的名称为「 generate_service 」


然后使用装饰器「 rpc 」注册服务中具体的方法


# producer_service.py
from nameko.rpc import rpc
class GenerateService(object): # 定义微服务名称 name = "generate_service"
@rpc def hello_world(self, msg): print('hello,i am been called by customer(消费者),返回消息:{}'.format(msg))
# 返回结果 return "Hello World!I Am a msg from producer!" # 返回结果 return "Hello World!I Am a msg from producer!"
复制代码


3-4  发布注册服务


使用 nameko 命令在终端将目标文件中的服务注册到 MQ 中


# 注册服务# producer_service:目标文件# admin:admin:MQ用户名及密码# ip地址:5672:MQ服务器ip地址及应用端口号# my_vhost:虚拟机名nameko run producer_service --broker amqp://admin:admin@ip地址:5672/my_vhost
复制代码


其中,my_vhost 对应 MQ 容器启动时配置的虚拟机名


3-5  Flask 定义 API 及消费者调用服务


为了演示方便,这里使用 Flask 编写一个简单的 API


首先,定义 MQ 连接信息


然后,编写一个 API 接口,请求方式为 GET


最后,使用 nameko 中的「 ClusterRpcProxy 」拿到消费者对象去调用服务中的具体方法


from flask import Flaskfrom nameko.standalone.rpc import ClusterRpcProxy
app = Flask(__name__)
# MQ配置config_mq = {'AMQP_URI': "amqp://admin:admin@ip地址:5672/my_vhost"}
@app.route('/hello_world', methods=['GET'])def call_service(): with ClusterRpcProxy(config_mq) as rpc: # 消费者调用微服务(生产者),获取服务(生产者)的返回值 result = rpc.generate_service.hello_world(msg="xag msg")
# 返回结果 return result, 200
app.run(debug=True)
复制代码


3-6  测试一下


使用 Postman 调用上面的 API 接口,就能完成消费者调用生成者服务中的方法,拿到返回结果的完整流程


# 调用API接口http://127.0.0.1:5000/hello_worldMethod:GET
复制代码

4. 最后

上面以 Flask 为例讲解了微服务的搭建的完整流程


如果是其他 Web 框架( 比如 Django、FastAPI 等 )集成微服务流程是类似的,只需要修改生成 API 部分的逻辑即可,更多进阶内容大家可以参考官方文档


官方文档:https://nameko.readthedocs.io/en/stable/


如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!


推荐阅读

Postman 如何调试加密接口?


5 分钟,使用内网穿透快速实现远程桌面


聊聊 Jmeter 如何并发执行 Python 脚本


聊聊 PC 端自动化最佳方案 - Pywinauto


聊聊 PC 端自动化最佳方案 - WinAppDriver

发布于: 刚刚阅读数: 2
用户头像

星安果

关注

还未添加个人签名 2019.03.27 加入

公众号:AirPython,分享 Python 爬虫、自动化原创技术干货!

评论

发布
暂无评论
推荐一款 Python 微服务框架 - Nameko