2025年3月29日 星期六 甲辰(龙)年 月廿八 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

硬肝一次 Python 微服务是一种什么体验?

时间:10-13来源:作者:点击数:39

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

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

  • 5672
    应用访问端口
  • 15672
    控制台 Web 访问端口号

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

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.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!"

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-5Flask 定义 API 及消费者调用服务

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

首先,定义 MQ 连接信息

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

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

  • from flask import Flask
  • from 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_world
  • MethodGET

4. 最后

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

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

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

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐