推薦一款 Python 微服務框架 - Nameko

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!"   # 返回結果        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 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
Method:GET

4. 最後

上面以 Flask 爲例講解了微服務的搭建的完整流程

如果是其他 Web 框架( 比如 Django、FastAPI 等 )集成微服務流程是類似的,只需要修改生成 API 部分的邏輯即可,更多進階內容大家可以參考官方文檔

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

如果你覺得文章還不錯,請大家 點贊、分享、留言 下,因爲這將是我持續輸出更多優質文章的最強動力!

推薦閱讀
Postman 如何調試加密接口?

5 分鐘,使用內網穿透快速實現遠程桌面

聊聊 Jmeter 如何併發執行 Python 腳本

聊聊 PC 端自動化最佳方案 - Pywinauto

聊聊 PC 端自動化最佳方案 - WinAppDriver

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章