美文网首页
Python 微服务框架 - Nameko

Python 微服务框架 - Nameko

作者: 木叶苍蓝 | 来源:发表于2023-02-06 15:10 被阅读0次

    1、前言

    考虑到 Python 性能及效率性, Python Web 端一直不温不火,Java 和 Golang 的微服务生态一直很繁荣,也被广泛用于企业级应用开发中。
    本文将介绍一款 Python 微服务框架: Nameko

    2. Nameko 介绍

    Nameko 是一款小巧,简洁的,异步通信方式的微服务架构
    它采用 RabbitMQ 消息队列作为消息中间件,基于发布者,订阅者模式。
    其中,消费者与生产者基于 RPC 进行通信
    项目地址: https://github.com/nameko/nameko

    3、实战一下

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

    1. 安装 RabbitMQ 及启动
      这里推荐利用 Docker 安装 RabbitMQ ,以 Centos 为例
    # 1. 下载某个版本的 RabbitMQ的镜像
    # MQ版本号: 3.9.5
    docker pull rebbitmq: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
    1. 安装依赖包
      使用 pip 命令在虚拟机环境下安装 nameko,flask 依赖包
    # 安装依赖包
    pip3 install nameko
    
    # flask
    pip3 install flask
    
    1. 创建服务生产者 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. 发布注册服务
      使用 nameko 命令在终端将目标文件中的服务注册到MQ 中
    注册服务
    # producer_service: 目标文件
    # admin:admin:MQ用户及密码
    # ip地址:5672 :MQ服务器ip地址及应用端口号
    # ny_vhost: 虚拟机名称
    nameko run producer_service --broker amqp://admin:admin@ip地址:4572/my_vhost
    

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

    1. Flask 定义 API 及消费者调用服务
      为了演示方便,这里使用 Flask 编写一个简单的API
      首先,定义 MQ 连接信息
      然后,编写一个 API 接口,请求方式 GET
      最后,使用 nameko 中的 [ClusterRpcProxy] 拿到消费者对象去调用服务中具体方法。
    from flask imoprt Flask
    from nameko.standalone.rpc import ClustreRpcProxy
    
    app = Flask(__name__)
    
    # MQ 配置
    config_mq = {'AMQP_URI': "amqp://admin:admin@ip地址:4572/my_vhost"}
    
    @app.route('/hello_world', method=['GET'])
    def call_service():
        with ClusterRpcProxy(config_mq) as rpc:
            result = rpc.generate_service.hello_world(msg='xagmsg')
            # 返回结果
            return result, 200
    
    app.run(debug=True)
    
    1. 测试一下
      使用 Postman 调用上面的 API 接口,就能完成消费者调用生产者服务中的方法,拿到返回结果的完整流程
    # 调用 API 接口
    http://127.0.0.1:5000/hello_world
    Method: GET
    

    4. 最后

    上面的 Flask 为例讲解了微服务的搭建的完整流程
    如果是其他的 Web 框架(比如 Django,FastAPI 等)集成微服务流程是类似的,只需要修改生成 API 的部分逻辑即可,更多进阶内容可以参考官方文档:
    https://nameko.readthedocs.io/en/stable/

    相关文章

      网友评论

          本文标题:Python 微服务框架 - Nameko

          本文链接:https://www.haomeiwen.com/subject/csiwhdtx.html