《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 SQLAlchemy

app = 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.json
    if 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 exists
    existing_user = User.query.filter_by(username=data['username']).first()
    if existing_user:
        return jsonify({"message": "Username already exists"}), 409  # Conflict error

    user = 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"}), 200
        else:
            return jsonify({"error": "User not found"}), 404

if __name__ == '__main__':
    with app.app_context():  # Create an application context
        db.create_all()  # Now this will work within the context
    app.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 requests

app = 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"}), 201

if __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-service
    ports:
      - "5000:5000"
    networks:
      - microservices-net

  order-service:
    build: ./order-service
    ports:
      - "5001:5001"
    networks:
      - microservices-net
    depends_on:
      - user-service

networks:
  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 的高效数据清洗技巧,包括处理缺失值、多表合并与性能优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980336.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NC2227_约瑟夫环

题解: import java.util.Scanner;​public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int k sc.nextInt();int m sc.nextInt();int set 0;for(int i 2;i < n;i ){set (set m) % i;}System.out.p…

openEuler操作系统

一、OpenEuler简介 OpenEuler 是一款由华为发起、社区驱动的开源 Linux 操作系统&#xff0c;专注于企业级应用场景(如服务器、云计算、边缘计算等)。其前身是华为的 EulerOS&#xff0c;2019 年正式开源并捐赠给开放原子开源基金会&#xff0c;旨在构建一个中立、开放的生态系…

vite+react+ts如何集成redux状态管理工具,实现持久化缓存

1.安装插件 这里的redux-persist--进行数据的持久化缓存&#xff0c;确保页面刷新数据不会丢失 yarn add react-redux^9.2.0 redux-persist^6.0.0 reduxjs/toolkit^2.5.1 2.创建仓库文件夹 在项目的src文件夹下创建名为store的文件夹&#xff0c;里面的具体文件如下 featur…

大模型function calling:让AI函数调用更智能、更高效

大模型function calling&#xff1a;让AI函数调用更智能、更高效 随着大语言模型&#xff08;LLM&#xff09;的快速发展&#xff0c;其在实际应用中的能力越来越受到关注。Function Calling 是一种新兴的技术&#xff0c;允许大模型与外部工具或API进行交互&#xff0c;从而扩…

图像分类项目1:基于卷积神经网络的动物图像分类

一、选题背景及动机 在现代社会中&#xff0c;图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用&#xff0c;例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类&#xff0c;可以帮助人们更好地了解动物种类、数量和分布情况&#xff0c;…

在 Ansys Maxwell 中分析磁场

在 Ansys Maxwell 中分析磁场 分析磁场的能力对于理解电磁系统至关重要。Ansys Maxwell 为工程师提供了强大的工具&#xff0c;帮助他们探索磁场数据并从中提取有价值的见解。在本指南中&#xff0c;我将深入研究 Ansys Maxwell 中的几种基本技术和方法&#xff0c;以有效地分…

[Lc滑动窗口_1] 长度最小的数组 | 无重复字符的最长子串 | 最大连续1的个数 III | 将 x 减到 0 的最小操作数

目录 1. 长度最小的字数组 题解 代码 ⭕2.无重复字符的最长子串 题解 代码 3.最大连续1的个数 III 题解 代码 4.将 x 减到 0 的最小操作数 题解 代码 1. 长度最小的字数组 题目链接&#xff1a;209.长度最小的字数组 题目分析: 给定一个含有 n 个 正整数 的数组…

数据库Redis数据库

目录 一、数据库类型 1、关系型数据库 2、非关系型数据库 3、关系型非关系型区别 二、Redis数据库 1、什么是Redis 3、Redis特点 4、Redis为什么读写快 5、部署Redis数据库 6、redis管理 7、Redis数据库五大类型 8、Redis数据库基础使用 9、redis五大类型增删查?…

蓝桥备赛(四)- 数组(下)

一 、 字符数组 1.1 介绍 数组的元素如果是字符类型 &#xff0c; 这种数组就是字符数组 &#xff0c; 字符数组可以是一维数组 &#xff0c; 可以是二维数组 (多维数组)。 接下来主要讨论一维的字符数组 : char arr1[5] //一维数组 char arr2[3][5] // 二维数组 C语言 中…

数据图表ScottPlot.WPF用法示例

目录 一、添加 NuGet 程序包&#xff08;5.0.47&#xff09; 二、MainWindow.xaml中添加引用 三、MainWindow.xaml.cs 具体使用代码 图表示例&#xff1a; 一、添加 NuGet 程序包&#xff08;5.0.47&#xff09; 二、MainWindow.xaml中添加引用 <Window x:Class"…

AtCoder Beginner Contest 001(A - 積雪深差、B - 視程の通報、C - 風力観測、D - 感雨時刻の整理)题目翻译

由于我发现网上很少有人会发很久之前AtCoder Beginner Contes的题&#xff0c;所以我打算从AtCoder Beginner Contest 001开始写。大约两周一更&#xff0c;需要的可以订阅专栏&#xff0c;感谢支持Thanks♪(&#xff65;ω&#xff65;)&#xff89; →题目讲解 A - 積雪深差 …

Windows 11【1001问】查看Windows是否激活的11种方法

在使用Windows 11的过程中&#xff0c;确保系统已正确激活是非常重要的一步。未激活的系统可能会限制某些功能的使用&#xff0c;并且无法获得最新的安全更新和支持。本文将详细介绍多种判断Windows 11是否已激活的11种方法&#xff0c;帮助用户快速了解自己的系统状态&#xf…

秒杀系统的常用架构是什么?怎么设计?

架构 秒杀系统需要单独部署&#xff0c;如果说放在订单服务里面&#xff0c;秒杀的系统压力太大了就会影响正常的用户下单。 常用架构&#xff1a; Redis 数据倾斜问题 第一步扣减库存时 假设现在有 10 个商品需要秒杀&#xff0c;正常情况下&#xff0c;这 10 个商品应该均…

USRP7440-通用软件无线电平台

1、产品描述 USRP7440基于第三代XILINX Zynq UltraScale RFSoC架构&#xff0c;它将射频ADC、DAC、ARM、FPGA等集成一体&#xff0c;瞬时带宽可以达到2.5GHz&#xff0c;尤其适合于射频直采应用&#xff0c;比如通信与雷达。 第一代RFSOC高达4GHz • 8x 或 16x 6.554GSPS DAC…

【Python机器学习】1.1. 机器学习(Machine Learning)介绍

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 1.1.1. 什么是机器学习&#xff1f; 举个例子&#xff1a; 小明1月工资1000&#xff0c;每月增长10%&#xff0c;第10月是多少&#xff…

协议-Airkiss

是什么&#xff1f; 设备 A 与外界没有建立任何实质性连接&#xff0c;可以称之为信息孤岛。设备 B 通过路由 或者直接 将 Wifi 的 ssid 与密码 UDP广播 传递给 A 为什么&#xff1f; 解决将无线网络的 ssid 与密码传输到设备难题 怎么做&#xff1f; 芯片自带AT指令开启Air…

python第十一课:并发编程 | 多任务交响乐团

&#x1f3af; 本节目标 理解多线程/多进程/协程的应用场景掌握threading与multiprocessing核心用法学会使用asyncio进行异步编程开发实战项目&#xff1a;高并发爬虫引擎破解GIL锁的性能迷思 1️⃣ 并发编程三剑客 &#x1f3bb; 生活化比喻&#xff1a; 多线程 → 餐厅多个…

linux中断调用流程(arm)

文章目录 ARM架构下Linux中断处理全流程解析&#xff1a;从硬件触发到驱动调用 ⚡**一、中断触发与硬件层响应** &#x1f50c;**1. 设备触发中断** &#x1f4e1; **二、CPU阶段&#xff1a;异常入口与上下文处理** &#x1f5a5;️**1. 异常模式切换** &#x1f504;**2. 跳转…

Deepseek 模型蒸馏

赋范课堂&#xff1a; https://www.bilibili.com/video/BV1qUN8enE4c/

商城系统单商户开源版源码

环境配置 1.软件安装 宝塔安装系统软件:Nginx、MySQL5.6、PHP( PHP用7.1-7.4版本)、phpMyAdmin(Web端MySQL管理工具)。 2.配置mysql 设置mysql&#xff0c;在已安装的软件里面找到 mysql点击进行设置 3.修改sql-mode 选择左侧配置修改&#xff0c;找到里面的sql-mode&…