硬肝一次 Python 微服務(wù)是一種什么體驗?
點擊上方 “AirPython”,選擇 “加為星標(biāo)”
第一時間關(guān)注 Python 原創(chuàng)干貨!

1. 前言
大家好,我是安果!
考慮到 Python 性能及效率性,Python Web 端一直不溫不火,JAVA 和 Golang 的微服務(wù)生態(tài)一直很繁榮,也被廣泛用于企業(yè)級應(yīng)用開發(fā)當(dāng)中
本篇文章將介紹一款 Python 微服務(wù)框架:「 Nameko 」
2. Nameko 介紹
Nameko 是一款小巧、簡潔的、異步通信方式的微服務(wù)架構(gòu)
它采用 RabbitMQ 消息隊列作為消息中間件,基于發(fā)布者、訂閱者模式
其中,消費者與生產(chǎn)者基于 RPC 進(jìn)行通訊
項目地址:https://github.com/nameko/nameko
3. 實戰(zhàn)一下
下面以 Flask 為例聊聊搭建 Python 微服務(wù)的步驟
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:指定應(yīng)用端口及Web控制臺端口
# hostname:主機(jī)名
# e:環(huán)境變量
# RABBITMQ_DEFAULT_VHOST:虛擬機(jī)名稱
# 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
應(yīng)用訪問端口
15672
控制臺 Web 訪問端口號
然后,開放防火墻的 5672、15672 端口號
PS:如果是云服務(wù)器,需要另外配置安全組
最后,在瀏覽器中通過下面的連接進(jìn)入到 MQ 后臺 Web 管理頁面
地址:http://ip地址:15672
3-2? 安裝依賴包
使用 pip 命令在虛擬環(huán)境下安裝 nameko、flask 依賴包
#?安裝依賴包
#?nameko
pip3?install?nameko
#?flask
pip3?install?flask
3-3? 創(chuàng)建服務(wù)生產(chǎn)者 Producer
自定一個類,使用 name 屬性定義服務(wù)的名稱為「 generate_service 」
然后使用裝飾器「 rpc 」注冊服務(wù)中具體的方法
#?producer_service.py
from?nameko.rpc?import?rpc
class?GenerateService(object):
????#?定義微服務(wù)名稱
????name?=?"generate_service"
????@rpc
????def?hello_world(self,?msg):
????????print('hello,i am been called by customer(消費者),返回消息:{}'.format(msg))
????????#?返回結(jié)果
????????return?"Hello?World!I?Am?a?msg?from?producer!"
3-4??發(fā)布注冊服務(wù)
使用 nameko 命令在終端將目標(biāo)文件中的服務(wù)注冊到 MQ 中
#?注冊服務(wù)
# producer_service:目標(biāo)文件
# admin:admin:MQ用戶名及密碼
# ip地址:5672:MQ服務(wù)器ip地址及應(yīng)用端口號
# my_vhost:虛擬機(jī)名
nameko?run?producer_service?--broker?amqp://admin:admin@ip地址:5672/my_vhost
其中,my_vhost 對應(yīng) MQ 容器啟動時配置的虛擬機(jī)名
3-5? Flask 定義 API 及消費者調(diào)用服務(wù)
為了演示方便,這里使用 Flask 編寫一個簡單的 API
首先,定義 MQ 連接信息
然后,編寫一個?API 接口,請求方式為 GET
最后,使用?nameko 中的「 ClusterRpcProxy 」拿到消費者對象去調(diào)用服務(wù)中的具體方法
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:
????????#?消費者調(diào)用微服務(wù)(生產(chǎn)者),獲取服務(wù)(生產(chǎn)者)的返回值
????????result?=?rpc.generate_service.hello_world(msg="xag?msg")
????????#?返回結(jié)果
????????return?result,?200
app.run(debug=True)
3-6??測試一下
使用 Postman 調(diào)用上面的 API 接口,就能完成消費者調(diào)用生成者服務(wù)中的方法,拿到返回結(jié)果的完整流程
#?調(diào)用API接口
http://127.0.0.1:5000/hello_world
Method:GET4. 最后
上面以 Flask 為例講解了微服務(wù)的搭建的完整流程
如果是其他 Web 框架(?比如?Django、FastAPI 等?)集成微服務(wù)流程是類似的,只需要修改生成 API?部分的邏輯即可,更多進(jìn)階內(nèi)容大家可以參考官方文檔
官方文檔:https://nameko.readthedocs.io/en/stable/
如果你覺得文章還不錯,請大家?點贊、分享、留言?下,因為這將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強(qiáng)動力!

