《Python實戰進階》No 11:微服務架構設計與 Python 實現

第11集:微服務架構設計與 Python 實現

2025年3月3日更新了代碼和微服務運行后的系統返回信息截圖,所有代碼在 python3.11.5虛擬環境下運行通過。

微服務架構通過將復雜應用拆分為獨立部署的小型服務,顯著提升了系統的可擴展性和維護性。本集將結合 Python 生態工具(如 Flask、Nameko 和 Docker),從架構設計到代碼實現,完整演示如何構建一個微服務系統。


在這里插入圖片描述

一、微服務核心概念與設計原則
  1. 核心思想

    • 單一職責:每個服務聚焦一個業務能力(如用戶管理、訂單處理)。
    • 獨立部署:服務可獨立開發、測試和部署,降低耦合性。
    • 輕量通信:通過 REST API 或消息隊列(如 RabbitMQ)實現服務間通信。
  2. 設計挑戰

    • 服務發現、分布式鏈路追蹤、數據一致性等問題需通過工具解決。

二、架構圖與組件說明

在這里插入圖片描述

(架構圖,包含以下組件)

  1. API 網關:統一入口,路由請求到對應服務(如使用 Flask 構建)。
  2. 服務注冊中心:管理服務實例地址(如 Consul)。
  3. 用戶服務:處理用戶注冊/登錄(Flask + SQLAlchemy)。
  4. 訂單服務:管理訂單邏輯(Flask + Redis)。
  5. 異步任務隊列:處理耗時操作(如 Celery)。

三、代碼案例:用戶服務與訂單服務

1. 項目結構

microservices-demo/
├── user-service/        # 用戶服務(Flask)
│   ├── app_user.py
│   └── requirements.txt
├── order-service/       # 訂單服務(Flask)
│   ├── app_order.py
│   └── requirements.txt
└── docker-compose.yml   # 容器編排(測試微服務可以通過cmd直接測試,不一定要安裝Docker,Docker主要用于自動化部署和服務編排比較方便)

運行 python app_user.py后,會在根目錄下自動新建一個var文件夾,
里面存放自動生成的 users.db數據庫。
具體目錄為:

microservices-demo/
├── var/  
│   ├── /app_user-instance
│       └── users.db

2. 用戶服務實現

# user-service/app_user.py
from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
db = SQLAlchemy(app)class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True)password = db.Column(db.String(120))@app.route('/register', methods=['POST'])
def register():data = request.jsonif not data or 'username' not in data or 'password' not in data:return jsonify({"message": "Bad Request: Missing username or password"}), 400  # Handle missing data# Check if the username already existsexisting_user = User.query.filter_by(username=data['username']).first()if existing_user:return jsonify({"message": "Username already exists"}), 409  # Conflict erroruser = User(username=data['username'], password=data['password'])db.session.add(user)db.session.commit()return jsonify({"message": "User created"}), 201@app.route('/validate_user/<int:user_id>', methods=['GET'])
def validate_user(user_id):with db.session() as session:user = session.get(User, user_id)if user:return jsonify({"message": "User is valid"}), 200else:return jsonify({"error": "User not found"}), 404if __name__ == '__main__':with app.app_context():  # Create an application contextdb.create_all()  # Now this will work within the contextapp.run(port=5000)

在cmd運行 python app_user.py:

 * Serving Flask app 'app_user'* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Running on http://127.0.0.1:5000
Press CTRL+C to quit

新開一個cmd測試微服務是否運行:
(注意:以下是windows CMD環境,如果是linux或MacOS, -d參數的雙引號不需要轉義符)

curl -X POST -H "Content-Type: application/json" -d "{\"username\":\"alice\",\"password\":\"pass123\"}" http://localhost:5000/register

系統返回:

{"message":"User created"}

表明關于用戶創建的微服務創建并運行成功響應。

3. 訂單服務實現

# order-service/app_order.py
from flask import Flask, jsonify, request
import requestsapp = Flask(__name__)# 模擬訂單存儲
orders = []@app.route('/create_order', methods=['POST'])
def create_order():# 調用用戶服務驗證用戶身份user_id = request.json['user_id']response = requests.get(f'http://localhost:5000/validate_user/{user_id}')   if response.status_code != 200:return jsonify({"error": "Invalid user"}), 401# 創建訂單邏輯orders.append({"user_id": user_id, "items": request.json['items']})print(orders)return jsonify({"message": "Order created"}), 201if __name__ == '__main__':app.run(port=5001)

**注意不要關閉 app_user.py 服務程序,因為 app_order.py 需要調用用戶信息生成訂單信息。
在新的 cmd 窗口運行 python app_order.py , 注意要先啟動虛擬環境,同一個虛擬環境可以在多個cmd 窗口同時激活.

在cmd運行 python app_order.py:

 * Serving Flask app 'app_order'* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Running on http://127.0.0.1:5001
Press CTRL+C to quit

在測試用的 cmd 窗口 提交訂單請求語句:

curl -X POST -H "Content-Type: application/json" -d "{\"user_id\":2,\"items\":[\"item1\"]}" http://localh
ost:5001/create_order

測試窗口返回:

{"message":"Order created"}

5001 端口服務返回打印的訂單信息:

[{'user_id': 2, 'items': ['item1']}, {'user_id': 2, 'items': ['item1']}]

4. 服務通信與容器化(不通過Docker部署也可以實現微服務,但是Docker作為微服務的技術實現比較方便高效,推薦使用)

編寫 Dockerfile
在每個服務目錄中創建 Dockerfile:

# user-service/Dockerfile
FROM python:3.11-slim  # 使用輕量級 Python 鏡像 <button class="citation-flag" data-index="4">
WORKDIR /app_user
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt  # 安裝依賴 <button class="citation-flag" data-index="9">
COPY . .
CMD ["python", "app_user.py"]
# order-service/Dockerfile
FROM python:3.11-slim
WORKDIR /app_order
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt  # <button class="citation-flag" data-index="4"><button class="citation-flag" data-index="9">
COPY . .
CMD ["python", "app_order.py"]

通過 Docker Compose 編排服務(docker-compose.yml):

version: '3'
services:user-service:build: ./user-serviceports:- "5000:5000"networks:- microservices-netorder-service:build: ./order-serviceports:- "5001:5001"networks:- microservices-netdepends_on:- user-servicenetworks:microservices-net:driver: bridge

四、關鍵實現細節
  1. 服務發現與負載均衡
    使用 Consul 或 Kubernetes 實現動態服務發現。
  2. 異步任務處理
    通過 Celery + RabbitMQ 處理耗時操作(如發送郵件)。
  3. 日志與監控
    集成 ELK Stack(Elasticsearch, Logstash, Kibana)集中管理日志。

五、測試與驗證
  1. 啟動服務
    docker-compose up --build
    
  2. 測試用戶注冊
    curl -X POST -H "Content-Type: application/json" -d "{\"username\":\"alice\",\"password\":\"pass123\"}" http://localhost:5000/register
    
  3. 創建訂單
    curl -X POST -H "Content-Type: application/json" -d "{\"user_id\":1,\"items\":[\"item1\"]}" http://localhost:5001/create_order
    

六、總結與最佳實踐
  • 優勢:獨立部署、技術棧靈活、易擴展。
  • 挑戰:分布式復雜性、數據一致性需額外設計。
  • 推薦工具鏈
    • 同步通信:Flask + Requests
    • 異步通信:Nameko + RabbitMQ
    • 容器化:Docker + Kubernetes

七、擴展閱讀
  • [Python 微服務通信機制設計 - CSDN
  • 容器化部署實踐:Docker 與 Kubernetes
  • 微服務監控體系構建

下一集將深入講解 Pandas 的高效數據清洗技巧,包括處理缺失值、多表合并與性能優化。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72279.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72279.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72279.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

USRP7440-通用軟件無線電平臺

1、產品描述 USRP7440基于第三代XILINX Zynq UltraScale RFSoC架構&#xff0c;它將射頻ADC、DAC、ARM、FPGA等集成一體&#xff0c;瞬時帶寬可以達到2.5GHz&#xff0c;尤其適合于射頻直采應用&#xff0c;比如通信與雷達。 第一代RFSOC高達4GHz ? 8x 或 16x 6.554GSPS DAC…

1.2.3 使用Spring Initializr方式構建Spring Boot項目

本實戰概述介紹了如何使用Spring Initializr創建Spring Boot項目&#xff0c;并進行基本配置。首先&#xff0c;通過Spring Initializr生成項目骨架&#xff0c;然后創建控制器HelloController&#xff0c;定義處理GET請求的方法hello&#xff0c;返回HTML字符串。接著&#xf…

【小羊肖恩】小羊杯 Round 2 C+K

題目鏈接&#xff1a;https://ac.nowcoder.com/acm/contest/100672#question C.是毛毛蟲嗎&#xff1f; 思路&#xff1a; 其實很簡單&#xff0c;假設我們要滿足題目所給條件&#xff0c;那么這個毛毛蟲最壞情況下肯定是一條如下圖所示的無向圖 右端省略號為對稱圖形 &…

不謂俠--記錄

音樂《不謂俠》 衣襟上 別好了晚霞 余暉送我牽匹老馬 正路過 煙村里人家 恰似當年故里正飛花 醉過風 喝過茶 尋常巷口尋個酒家 在座皆算老友 碗底便是天涯 天涯遠 無處不為家 蓬門自我也像廣廈 論意氣 不計多或寡 占三分便敢自稱為俠 刀可捉 拳也耍 偶爾閑來…

不同規模企業如何精準選擇AI工具: DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具深度剖析與對比

本文深入探討了最近國內外主流的 DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具的技術細節、性能表現、應用場景及局限性&#xff0c;并從技術能力、功能需求、成本預算、數據安全和合規以及服務與支持五個關鍵維度&#xff0c;詳細分析了不同規模企業在選擇 AI 工具時的考量因素…

Vue核心知識:KeepLive全方位分析

KeepAlive 是 Vue 組件中的一個重要功能&#xff0c;主要用于緩存組件&#xff0c;以提升性能和用戶體驗。 目錄 一、KeepAlive 基本概念二、KeepAlive 的核心原理三、KeepAlive 關鍵屬性解析1. include&#xff1a;指定需要緩存的組件2. exclude&#xff1a;指定不需要緩存的組…

【電力——tarjan割點,求連通塊】

題目 分析 這是割點的板子 代碼 #include <bits/stdc.h> using namespace std;const int N 1e410; const int M 3e410;int h[N], e[M], ne[M], idx; int dfn[N], low[N], tot; int root, ans;void add(int a, int b) // 添加一條邊a->b {e[idx] b, ne[idx] h…

【HTTP】解碼網絡通信的奧秘:HTTP,IP 地址,端口,DNS及NAT地址轉換的協同之舞

引言 每文學習一句詩&#xff1a;行一棋不足以見智&#xff0c;彈一弦不足以見悲 ——《淮南子說林訓》 譯文&#xff1a;走一個棋子&#xff0c;不足以現出智慧&#xff1b;彈一根琴弦&#xff0c;不能夠使人產生悲哀之情。 自述&#xff1a;互聯網現如今已經成為每個人都離不…

18、深拷貝與淺拷貝的區別【中高頻】

淺拷貝 淺拷貝只是拷貝了一個指針&#xff0c;并沒有開辟一塊新的內存。拷貝的指針和原來的指針 指向同一塊地址。當一個對象修改了資源&#xff0c;另一個對象也會受到影響&#xff0c;因此淺拷貝是有風險的&#xff1a;當兩個對象都銷毀 并調用析構函數時&#xff0c;會造成…

【Linux】從入門到精通:Make與Makefile完全指南

歡迎來到 CILMY23 的博客 &#x1f3c6;本篇主題為&#xff1a;從入門到精通&#xff1a;Make與Makefile完全指南 &#x1f3c6;個人主頁&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列專欄&#xff1a;C | C語言 | Linux | Python | 數據結構和算法 | 算法專題 &#x1…

利用PyQt簡單的實現一個機器人的關節JOG界面

在上一篇文章中如何在Python用Plot畫出一個簡單的機器人模型&#xff0c;我們介紹了如何在Python中畫出一個簡單的機器人3D模型&#xff0c;但是有的時候我們需要通過界面去控制機器人每一個軸的轉動&#xff0c;并實時的顯示出當前機器人的關節位置和末端笛卡爾位姿。 那么要實…

iOS 使用消息轉發機制實現多代理功能

在iOS開發中&#xff0c;我們有時候會用到多代理功能&#xff0c;比如我們列表的埋點事件&#xff0c;需要我們在列表的某個特定的時機進行埋點上報&#xff0c;我們當然可以用最常見的做法&#xff0c;就是設置代理實現代理方法&#xff0c;然后在對應的代理方法里面進行上報&…

XGBoost和LightGBM機器學習算法對比及實戰

文章目錄 1. XGBoost 原理核心思想關鍵技術點2. LightGBM 原理核心思想關鍵技術點3. XGBoost vs LightGBM 對比4. 適用場景選擇5. 總結1. 數據準備2. XGBoost 示例安裝庫代碼實現3. LightGBM 示例安裝庫代碼實現4. 關鍵參數對比5. 注意事項6. 輸出示例XGBoost 和 LightGBM 是兩…

局域網自動識別機器名和MAC并生成文件的命令

更新版本&#xff1a;添加了MAC 地址 確定了設備唯一性 V1.1 局域網自動識別機器名和MAC并生成文件的批處理命令 echo off setlocal enabledelayedexpansionREM 設置輸出文件 set outputFilenetwork_info.txtREM 清空或創建輸出文件 echo Scanning network from 192.168.20.1…

基于Python+Vue開發的體育用品商城管理系統源碼+開發文檔+課程作業

項目簡介 該項目是基于PythonVue開發的體育用品商城管理系統&#xff08;前后端分離&#xff09;&#xff0c;這是一項為大學生課程設計作業而開發的項目。該系統旨在幫助大學生學習并掌握Python編程技能&#xff0c;同時鍛煉他們的項目設計與開發能力。通過學習基于Python的體…

pyQT5簡易教程(一):制作一個可以選擇本地圖片并顯示的桌面應用

可以參考之前的教程安裝 PyQt 和 PyQt Designer https://blog.csdn.net/smx6666668/article/details/145909326?spm=1011.2415.3001.10575&sharefrom=mp_manage_link 一、打開pycharm中的QTdesigner 二、設計界面 和之前一樣,使用 PyQt Designer 來設計界面并保存為 .u…

LeetCode 解題思路 6(Hot 100)

解題思路&#xff1a; 初始化窗口元素&#xff1a; 遍歷前 k 個元素&#xff0c;構建初始單調隊列。若當前索引對應值大于等于隊尾索引對應值&#xff0c;移除隊尾索引&#xff0c;將當前索引加入隊尾。遍歷結束時當前隊頭索引即為當前窗口最大值&#xff0c;將其存入結果數組…

基于redis的位圖實現簽到功能

基于Redis位圖實現簽到功能是一種高效且節省內存的方法。以下是分步實現的詳細方案&#xff1a; 1. 鍵設計策略 采用 sign:<userId>:<YYYYMM> 格式存儲每月簽到數據 # 示例&#xff1a;用戶1001在2023年8月的簽到數據 sign_key "sign:1001:202308"2.…

C++ Qt OpenGL渲染FFmpeg解碼后的視頻

本篇博客介紹使用OpenGL渲染FFmpeg解碼后的視頻,涉及到QOpenGLWidget、QOpenGLFunctions、OpenGL shader以及紋理相關,播放效果如下: 開發環境:Win11 C++ Qt6.8.1、FFmpeg4.0、x64 ??注意:Qt版本不同時,Qt OpenGL API及用法可能差別比較大,FFmpeg版本不同時API調用可能…

deepseek部署:ELK + Filebeat + Zookeeper + Kafka

## 1. 概述 本文檔旨在指導如何在7臺機器上部署ELK&#xff08;Elasticsearch, Logstash, Kibana&#xff09;堆棧、Filebeat、Zookeeper和Kafka。該部署方案適用于日志收集、處理和可視化場景。 ## 2. 環境準備 ### 2.1 機器分配 | 機器編號 | 主機名 | IP地址 | 部署組件 |-…