《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.mzph.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地址 | 部署组件 |-…