硬肝一次 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. # 1、下载某个版本的RabbitMQ的镜像 
  2. # MQ版本号:3.9.5 
  3. docker pull rabbitmq:3.9.5-management 
  4.  
  5. # 2、查看镜像 
  6. docker images 
  7.  
  8. # 3、启动MQ容器 
  9. # p:指定应用端口及Web控制台端口 
  10. # hostname:主机名 
  11. # e:环境变量 
  12. # RABBITMQ_DEFAULT_VHOST:虚拟机名称 
  13. # RABBITMQ_DEFAULT_USER:用户名 
  14. # RABBITMQ_DEFAULT_PASS:密码 
  15. # 3e83da0dc938:MQ镜像ID 
  16. 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 依赖包

  1. # 安装依赖包 
  2. # nameko 
  3. pip3 install nameko 
  4.  
  5. # flask 
  6. pip3 install flask 

3-3 创建服务生产者 Producer

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

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

  1. # producer_service.py 
  2.  
  3. from nameko.rpc import rpc 
  4.  
  5. class GenerateService(object): 
  6.     # 定义微服务名称 
  7.     name = "generate_service" 
  8.  
  9.     @rpc 
  10.     def hello_world(self, msg): 
  11.         print('hello,i am been called by customer(消费者),返回消息:{}'.format(msg)) 
  12.  
  13.         # 返回结果 
  14.         return "Hello World!I Am a msg from producer!" 

3-4 发布注册服务

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

  1. # 注册服务 
  2. # producer_service:目标文件 
  3. # admin:admin:MQ用户名及密码 
  4. # ip地址:5672:MQ服务器ip地址及应用端口号 
  5. # my_vhost:虚拟机名 
  6. 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 」拿到消费者对象去调用服务中的具体方法

  1. from flask import Flask 
  2. from nameko.standalone.rpc import ClusterRpcProxy 
  3.  
  4. app = Flask(__name__) 
  5.  
  6. # MQ配置 
  7. config_mq = {'AMQP_URI'"amqp://admin:admin@ip地址:5672/my_vhost"
  8.  
  9. @app.route('/hello_world', methods=['GET']) 
  10. def call_service(): 
  11.     with ClusterRpcProxy(config_mq) as rpc: 
  12.         # 消费者调用微服务(生产者),获取服务(生产者)的返回值 
  13.         result = rpc.generate_service.hello_world(msg="xag msg"
  14.  
  15.         # 返回结果 
  16.         return result, 200 
  17.  
  18. app.run(debug=True

3-6 测试一下

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

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

4. 最后

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

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

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

 

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

2021-03-22 08:15:46

国企程序猿事业

2018-03-06 10:46:42

代码Python买水果

2016-03-07 10:51:02

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

2020-03-11 14:56:06

苹果App Store审核

2020-04-17 09:51:52

Python数据库微信

2018-03-09 10:09:07

程序媛体验女生

2016-01-21 17:49:52

云之家Agora语音会议

2012-10-12 09:32:14

开源云开源云技术云标准

2010-03-26 16:24:04

云计算

2017-03-06 14:45:28

戴尔

2015-08-03 09:36:01

赛迪翻译

2015-08-31 09:27:21

语言界面UI

2015-09-09 09:41:28

十年代码

2018-04-13 17:37:13

SAP上云

2015-01-21 15:35:58

开源

2017-12-12 16:17:55

微服务系统运维

2015-11-20 10:37:36

KeystoneOpenStackDocker

2022-09-21 08:39:52

堆外内存泄露内存分布

2018-02-26 09:28:42

程序员Bug体验

2021-02-23 15:18:27

程序员国企工程师
点赞
收藏

51CTO技术栈公众号