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.5
docker 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镜像ID
docker 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
【Python 微服务框架 Nameko 初体验】需要注意的是,启动 MQ 容器时,利用 -p 指定了两个端口
- 5672
应用访问端口 - 15672
控制台 Web 访问端口号
PS:如果是云服务器,需要另外配置安全组
最后,在浏览器中通过下面的连接进入到 MQ 后台 Web 管理页面
地址:http://ip地址:15672
3-2 安装依赖包
使用 pip 命令在虚拟环境下安装 nameko、flask 依赖包
# 安装依赖包
# nameko
pip3 install nameko# flask
pip3 install flask
3-3 创建服务生产者 Producer
自定一个类,使用 name 属性定义服务的名称为「 generate_service 」
然后使用装饰器「 rpc 」注册服务中具体的方法
# producer_service.pyfrom nameko.rpc import rpcclass 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!"
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 Flask
from nameko.standalone.rpc import ClusterRpcProxyapp = 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, 200app.run(debug=True)
3-6 测试一下
使用 Postman 调用上面的 API 接口,就能完成消费者调用生成者服务中的方法,拿到返回结果的完整流程
# 调用API接口
http://127.0.0.1:5000/hello_world
Method:GET
4. 最后
上面以 Flask 为例讲解了微服务的搭建的完整流程
如果是其他 Web 框架( 比如 Django、FastAPI 等 )集成微服务流程是类似的,只需要修改生成 API 部分的逻辑即可
最近整理了几百 G 的 Python 学习资料,包含新手入门电子书、教程、源码等等,免费分享给大家!想要的前往 “Python 编程学习圈”,发送 “J” 即可免费获得
文章图片
推荐阅读
- Python 项目管理与构建工具(CookieCutter, PyScaffold, PyBuilder, Poetry)
- python|Linux系统Python虚拟环境管理软件pyenv
- Whoosh(Python 的轻量级搜索工具)
- 程序员合集|Pygame实战(升级后的2048小游戏—解锁新花样,根本停不下来【附源码】)
- Python|【Pygame小游戏】炸裂全场、超级炸弹人“爆炸”登场,这是你的童年嘛()
- Python 列表解析式竟然支持异步()
- 编程语言|程序员最讨厌的11句话 | 每日趣闻
- python|Python-OpenCV-图像通过透视变换矫正
- docker|Docker项目部署docker+flask+gunicorn