2. 环境准备:Python 3.10+ 虚拟环境搭建、Docker Compose 部署 MySQL/Redis/RabbitMQ

本章是课程实践的基石。我们将完成两大部分的环境搭建:本地 Python 开发环境(含虚拟环境)与中间件容器化部署(MySQL、Redis、RabbitMQ)。确保所有组件版本对齐、网络互通,为后续的数据库迁移与异步任务调用提供稳定运行底座。

2.1 版本依赖与工具清单

在开始安装前,请确认主机已安装以下基础工具。下表列出了各组件的推荐版本与用途:

组件 推荐版本 用途说明
Python 3.10 ~ 3.12 应用运行时与脚本执行
Docker 24.0+ 容器化中间件运行环境
Docker Compose 2.20+ 多容器编排与网络管理
MySQL 8.0 关系型数据库,存储业务数据
Redis 7.2 缓存与消息队列(Celery Broker)
RabbitMQ 3.12 高级消息队列(Celery Broker/Result Backend)
版本对齐提示:本课程所有代码与配置均基于上述版本验证。若使用其他版本,请注意 API 兼容性差异,尤其是 RabbitMQ 3.12 与 pika 1.3+ 的适配。

2.2 Python 虚拟环境搭建

虚拟环境隔离项目依赖,避免与系统级 Python 包冲突。推荐使用 Python 内置的 venv 模块,无需额外安装。

2.2.1 创建与激活虚拟环境

# 创建项目目录并进入
mkdir middleware-course && cd middleware-course

# 创建虚拟环境(指定 Python 3.10+ 解释器)
python3 -m venv venv

# 激活虚拟环境(Linux/macOS)
source venv/bin/activate

# 激活虚拟环境(Windows PowerShell)
.\venv\Scripts\Activate.ps1

# 验证 Python 版本与虚拟环境路径
python --version
which python   # Linux/macOS
Get-Command python   # Windows

2.2.2 安装核心依赖包

激活虚拟环境后,使用 pip 安装课程所需的 Python 库。建议先升级 pip 至最新版:

pip install --upgrade pip

# 安装数据库驱动与 ORM
pip install sqlalchemy==2.0.25 pymysql==1.1.0 cryptography==41.0.7

# 安装 Redis 与 RabbitMQ 客户端
pip install redis==5.0.1 pika==1.3.2

# 安装 Celery 异步任务框架
pip install celery==5.3.6

# 安装 Alembic 数据库迁移工具
pip install alembic==1.13.1

# 生成 requirements.txt 用于环境复现
pip freeze > requirements.txt
注意:若使用 Apple Silicon (M1/M2/M3) 芯片,安装 cryptography 时可能需要先安装 OpenSSL 依赖:brew install openssl。Windows 用户请确保已安装 Microsoft C++ Build Tools。

2.3 Docker Compose 部署中间件

使用 Docker Compose 一键启动 MySQL、Redis、RabbitMQ 三个容器,并配置统一的网络与持久化存储。

2.3.1 编写 docker-compose.yml

在项目根目录创建 docker-compose.yml 文件,内容如下:

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: middleware-mysql
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: middleware_db
      MYSQL_USER: app_user
      MYSQL_PASSWORD: app_pass
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./init-scripts:/docker-entrypoint-initdb.d
    networks:
      - middleware-net
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7.2-alpine
    container_name: middleware-redis
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    networks:
      - middleware-net
    command: redis-server --appendonly yes

  rabbitmq:
    image: rabbitmq:3.12-management
    container_name: middleware-rabbitmq
    environment:
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: admin123
    ports:
      - "5672:5672"    # AMQP 协议端口
      - "15672:15672"  # 管理控制台端口
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq
    networks:
      - middleware-net
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"]
      interval: 15s
      timeout: 10s
      retries: 5

volumes:
  mysql_data:
  redis_data:
  rabbitmq_data:

networks:
  middleware-net:
    driver: bridge

2.3.2 启动与验证容器

# 启动所有容器(后台运行)
docker compose up -d

# 查看容器运行状态
docker compose ps

# 查看实时日志(按需使用)
docker compose logs -f mysql
docker compose logs -f rabbitmq

# 验证 MySQL 连接
docker exec -it middleware-mysql mysql -u app_user -papp_pass middleware_db -e "SELECT VERSION();"

# 验证 Redis 连接
docker exec -it middleware-redis redis-cli PING

# 验证 RabbitMQ 管理界面
# 浏览器访问 http://localhost:15672 ,使用 admin / admin123 登录
网络互通说明:三个容器均加入 middleware-net 桥接网络。在 Python 应用中,可通过容器名称(如 mysql、redis、rabbitmq)作为主机名访问对应服务,无需使用 localhost。

2.4 环境架构总览

下图展示了本地开发环境与容器化中间件的整体拓扑关系:

开发环境与中间件部署架构 本地开发环境 Python 虚拟环境 Python 3.10+ / venv 应用代码 SQLAlchemy / Celery / Alembic Docker Compose 容器集群 MySQL 8.0 端口 3306 数据库: middleware_db Redis 7.2 端口 6379 Celery Broker / Cache RabbitMQ 3.12 AMQP: 5672 管理台: 15672 middleware-net SQLAlchemy redis-py pika

2.5 连接配置与验证脚本

编写一个快速验证脚本,测试 Python 环境与三个中间件的连通性。在项目根目录创建 check_env.py:

import pymysql
import redis
import pika

# MySQL 连接测试
def check_mysql():
    try:
        conn = pymysql.connect(
            host='localhost',
            port=3306,
            user='app_user',
            password='app_pass',
            database='middleware_db'
        )
        cursor = conn.cursor()
        cursor.execute("SELECT VERSION()")
        version = cursor.fetchone()
        print(f"[OK] MySQL 连接成功,版本: {version[0]}")
        cursor.close()
        conn.close()
    except Exception as e:
        print(f"[FAIL] MySQL 连接失败: {e}")

# Redis 连接测试
def check_redis():
    try:
        r = redis.Redis(host='localhost', port=6379, decode_responses=True)
        pong = r.ping()
        print(f"[OK] Redis 连接成功,PING 响应: {pong}")
        r.close()
    except Exception as e:
        print(f"[FAIL] Redis 连接失败: {e}")

# RabbitMQ 连接测试
def check_rabbitmq():
    try:
        params = pika.ConnectionParameters(host='localhost', port=5672,
                                           credentials=pika.PlainCredentials('admin', 'admin123'))
        conn = pika.BlockingConnection(params)
        print(f"[OK] RabbitMQ 连接成功")
        conn.close()
    except Exception as e:
        print(f"[FAIL] RabbitMQ 连接失败: {e}")

if __name__ == '__main__':
    print("=== 环境连通性检查 ===\n")
    check_mysql()
    check_redis()
    check_rabbitmq()
    print("\n=== 检查完成 ===")
# 运行验证脚本(确保虚拟环境已激活)
python check_env.py

预期输出示例:

=== 环境连通性检查 ===

[OK] MySQL 连接成功,版本: 8.0.35
[OK] Redis 连接成功,PING 响应: True
[OK] RabbitMQ 连接成功

=== 检查完成 ===
排障指引:若某个服务连接失败,请按以下顺序排查:① 确认容器是否正常运行 docker compose ps;② 检查端口映射是否被占用 lsof -i :3306;③ 查看对应容器日志 docker compose logs <service>;④ 确认防火墙未阻断端口。

2.6 环境清理与重置

当需要重置环境或结束实验时,使用以下命令:

# 停止并移除容器、网络(保留数据卷)
docker compose down

# 停止并移除容器、网络、数据卷(完全清理)
docker compose down -v

# 重新构建并启动(无缓存)
docker compose up -d --force-recreate
数据安全提醒:docker compose down -v 会删除 MySQL、Redis、RabbitMQ 的所有持久化数据。仅当确认数据无需保留时执行此操作。日常开发中建议使用 docker compose down 保留数据卷。