分布式电商微服务系统实战部署指南

一、项目背景与技术选型

在当今互联网电商领域,高并发、低延迟、稳定运行是系统架构设计的核心目标。随着业务规模的不断扩大,传统的单体架构已无法满足复杂的业务需求,分布式微服务架构成为主流解决方案。本文将基于一个实际的开源电商项目,详细介绍如何使用 Nacos + Flask + MongoDB 构建一个完整的分布式电商微服务系统。

二、系统架构设计

2.1 整体架构

本系统采用前后端分离 + 微服务架构设计,主要包含以下核心服务:

  • API网关服务(gateway):作为系统的统一入口,负责请求路由、负载均衡和服务发现
  • 库存服务(inventory-service):管理商品信息和库存数据
  • 订单服务(order-service):处理订单创建、查询等业务逻辑
  • 支付服务(payment-service):模拟支付流程,生成交易记录

2.2 技术栈说明

技术组件用途版本要求
Python后端开发语言3.8+
FlaskWeb框架2.0+
MongoDB数据库存储4.0+
Nacos服务注册与发现2.x
Nacos-SDKPython客户端3.2.0

三、环境搭建与依赖安装

3.1 基础环境准备

首先,确保你的开发环境满足以下要求:

# 1. 安装Python 3.8+
python --version

# 2. 创建虚拟环境(推荐)
cd D:\dianshangxitong
python -m venv venv

# 3. 激活虚拟环境
venv\Scripts\activate

3.2 安装项目依赖

创建 requirements.txt 文件,包含以下依赖:

flask==2.3.3
pymongo==4.5.0
requests==2.31.0
nacos-sdk-python==3.2.0

执行安装命令:

pip install -r requirements.txt

四、Nacos服务注册中心部署

4.1 下载与启动Nacos

Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的服务发现和配置管理平台。访问 Nacos官方GitHub 下载最新稳定版。

Windows启动命令:

# 进入Nacos安装目录的bin文件夹
cd nacos/bin

# 单机模式启动
startup.cmd -m standalone

4.2 验证Nacos运行状态

启动成功后,访问 http://127.0.0.1:8848/nacos,默认用户名密码均为 nacos

关键配置注意:Nacos 核心需要开放的端口是 8848端口(HTTP默认端口),用于服务注册/发现、配置拉取、健康检查及控制台访问。

4.3 创建公共配置

创建 nacos_config.py 文件,统一管理Nacos连接参数:

# nacos_config.py
NACOS_SERVER = "127.0.0.1:8848"  # Nacos服务地址,注意不带http://
NAMESPACE = "public"              # 命名空间
USERNAME = "nacos"                # 登录用户名
PASSWORD = "nacos"                # 登录密码

五、微服务代码实现

5.1 库存服务(inventorySvc.py)

库存服务负责管理商品信息,提供商品查询和库存扣减接口:

from flask import Flask, jsonify, request
from pymongo import MongoClient
from nacos import NacosClient
from nacos_config import NACOS_SERVER, NAMESPACE, USERNAME, PASSWORD

app = Flask(__name__)

# Nacos客户端初始化
client_nacos = NacosClient(
    NACOS_SERVER, 
    namespace=NAMESPACE, 
    username=USERNAME, 
    password=PASSWORD
)

# MongoDB连接
client_mongo = MongoClient('mongodb://localhost:27017/')
db = client_mongo['ecommerce_db']
products_collection = db['products']

SERVICE_NAME = "inventory-service"
SERVICE_PORT = 5002

@app.route('/products', methods=['GET'])
def get_products():
    """获取商品列表"""
    try:
        query_name = request.args.get('name')
        query = {}
        if query_name:
            query['name'] = {"$regex": query_name, "$options": "i"}
        products = list(products_collection.find(query))
        # 序列化处理...
        return jsonify({"code": 200, "data": products}), 200
    except Exception as e:
        return jsonify({"error": str(e)}), 500

def register_to_nacos():
    """注册服务到Nacos"""
    client_nacos.add_naming_instance(
        service_name=SERVICE_NAME,
        ip="127.0.0.1",
        port=SERVICE_PORT,
        ephemeral=True  # 临时实例,SDK自动心跳
    )
    print(f"✅ 服务 {SERVICE_NAME} 已注册")

if __name__ == '__main__':
    register_to_nacos()
    app.run(port=SERVICE_PORT, debug=True)

5.2 订单服务(orderSvc.py)

订单服务是业务核心,需要调用库存和支付两个服务完成完整业务流程:

def discover_service(service_name):
    """从Nacos发现服务实例"""
    try:
        instances = client_nacos.list_naming_instance(service_name)
        # 注意:v3.x版本返回字典,需要取hosts字段
        if instances and 'hosts' in instances and instances['hosts']:
            host = instances['hosts']
            ip = host.get('ip', '127.0.0.1')
            port = host.get('port', 5002)
            return f"http://{ip}:{port}"
    except Exception as e:
        print(f"服务发现失败: {e}")
    return None

5.3 支付服务(paymentSvc.py)

@app.route('/pay', methods=['POST'])
def process_payment():
    """处理支付请求(模拟)"""
    data = request.json
    order_id = data.get('order_id')
    amount = data.get('amount')
    
    payment_doc = {
        "order_id": order_id,
        "amount": amount,
        "status": "SUCCESS",
        "transaction_id": "TRANS" + ''.join(random.choices(string.digits, k=10))
    }
    payments_collection.insert_one(payment_doc)
    
    return jsonify({"message": "支付成功", "status": "SUCCESS"}), 200

5.4 网关服务(gateway.py)

API网关作为统一入口,负责请求路由和服务发现:

# 服务路由映射
SERVICE_ROUTES = {
    'order': 'order-service',
    'payment': 'payment-service',
    'inventory': 'inventory-service'
}

@app.route('/api/<service_type>/<path:path>', methods=['GET', 'POST'])
def api_gateway(service_type, path):
    """通用API网关转发"""
    service_name = SERVICE_ROUTES.get(service_type)
    if not service_name:
        return jsonify({"error": "未知服务类型"}), 404
    
    service_url = discover_service(service_name)
    if not service_url:
        return jsonify({"error": "服务不可用"}), 503
    
    # 转发请求...

六、MongoDB数据库部署

6.1 安装与启动MongoDB

从 MongoDB官网 下载社区版安装包。

启动方式一:命令行启动(开发测试推荐)

# 创建数据目录
mkdir C:\data\db

# 启动MongoDB
"C:\Program Files\MongoDB\Server\5.0\bin\mongod.exe" --dbpath C:\data\db

启动方式二:安装为Windows服务(生产环境推荐)

# 以管理员身份运行CMD
cd C:\Program Files\MongoDB\Server\5.0\bin
mongod --dbpath C:\data\db --logpath C:\data\log\mongod.log --install --serviceName "MongoDB"

# 启动服务
net start MongoDB

6.2 初始化示例数据

运行库存服务后,会自动插入示例商品数据:

def init_db_data():
    """初始化示例数据"""
    if products_collection.count_documents({}) == 0:
        sample_products = [
            {"name": "华为手机", "price": 2999.00, "stock": 100},
            {"name": "vivo手机", "price": 2599.00, "stock": 50},
            {"name": "Apple手机", "price": 5999.00, "stock": 80}
        ]
        products_collection.insert_many(sample_products)

七、完整部署与验证

7.1 启动顺序(重要)

为了保证服务注册成功,必须按以下顺序启动:

  1. 启动Nacos服务端
  2. 启动MongoDB数据库
  3. 启动库存服务python inventorySvc.py(端口5002)
  4. 启动支付服务python paymentSvc.py(端口5003)
  5. 启动订单服务python orderSvc.py(端口5001)
  6. 启动网关服务python gateway.py(端口8080)

7.2 启动验证

每个服务启动成功后,终端会输出类似信息:

✅ 服务 inventory-service 已注册到Nacos(自动心跳)
 * Running on http://127.0.0.1:5002

打开Nacos控制台(http://127.0.0.1:8848/nacos),在服务列表中将看到4个注册的服务。

7.3 业务功能测试

# 1. 查询商品列表
curl http://127.0.0.1:8080/api/inventory/products

# 2. 创建订单
curl -X POST http://127.0.0.1:8080/api/order/orders \
  -H "Content-Type: application/json" \
  -d '{"user_id": "user001", "product_id": "商品ID", "quantity": 1}'

八、常见问题与解决方案

问题原因解决方案
Nacos无法连接服务未启动或端口错误检查8848端口,确保startup.cmd已执行
服务注册失败SDK版本不兼容使用nacos-sdk-python==3.2.0
心跳丢失手动调用send_beat使用ephemeral=True自动心跳
服务发现返回空API格式错误v3.x返回字典,需取hosts字段
MongoDB连接失败数据库未启动执行net start MongoDB或手动启动mongod

九、总结与展望

本文详细介绍了如何使用 Nacos + Flask + MongoDB 构建一个完整的分布式电商微服务系统。通过实际代码演示和部署步骤讲解,帮助读者理解微服务架构的核心概念,包括服务注册与发现、API网关路由、分布式服务调用等关键技术点。

更多推荐