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

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

[[425796]]

本文转载自微信公众号「AirPython」,作者星安果。转载本文请联系AirPython公众号。

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 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

需要注意的是,启动 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 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

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!" 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

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 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

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

3-5 Flask 定义 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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

3-6 测试一下

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

# 调用API接口 
http://127.0.0.1:5000/hello_world 
Method:GET 
  • 1.
  • 2.
  • 3.

4. 最后

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

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

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

 

责任编辑:武晓燕 来源: AirPython
相关推荐

2018-03-06 10:46:42

代码Python买水果

2021-03-22 08:15:46

国企程序猿事业

2016-03-07 10:51:02

华为华为合作伙伴伙伴大会

2020-03-11 14:56:06

苹果App Store审核

2012-10-12 09:32:14

开源云开源云技术云标准

2020-04-17 09:51:52

Python数据库微信

2010-03-26 16:24:04

云计算

2024-07-12 14:54:48

2017-03-06 14:45:28

戴尔

2016-01-21 17:49:52

云之家Agora语音会议

2024-08-08 08:00:00

2018-03-09 10:09:07

程序媛体验女生

2015-08-31 09:27:21

语言界面UI

2015-08-03 09:36:01

赛迪翻译

2015-01-21 15:35:58

开源

2025-03-14 09:00:00

Akamai云计算安全

2015-09-09 09:41:28

十年代码

2018-04-13 17:37:13

SAP上云

2017-12-12 16:17:55

微服务系统运维

2012-01-17 11:02:39

点赞
收藏

51CTO技术栈公众号