分布式电商微服务系统实战部署指南
分布式电商微服务系统实战部署指南
一、项目背景与技术选型
在当今互联网电商领域,高并发、低延迟、稳定运行是系统架构设计的核心目标。随着业务规模的不断扩大,传统的单体架构已无法满足复杂的业务需求,分布式微服务架构成为主流解决方案。本文将基于一个实际的开源电商项目,详细介绍如何使用 Nacos + Flask + MongoDB 构建一个完整的分布式电商微服务系统。
二、系统架构设计
2.1 整体架构
本系统采用前后端分离 + 微服务架构设计,主要包含以下核心服务:
- API网关服务(gateway):作为系统的统一入口,负责请求路由、负载均衡和服务发现
- 库存服务(inventory-service):管理商品信息和库存数据
- 订单服务(order-service):处理订单创建、查询等业务逻辑
- 支付服务(payment-service):模拟支付流程,生成交易记录
2.2 技术栈说明
| 技术组件 | 用途 | 版本要求 |
|---|---|---|
| Python | 后端开发语言 | 3.8+ |
| Flask | Web框架 | 2.0+ |
| MongoDB | 数据库存储 | 4.0+ |
| Nacos | 服务注册与发现 | 2.x |
| Nacos-SDK | Python客户端 | 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 启动顺序(重要)
为了保证服务注册成功,必须按以下顺序启动:
- 启动Nacos服务端
- 启动MongoDB数据库
- 启动库存服务:
python inventorySvc.py(端口5002) - 启动支付服务:
python paymentSvc.py(端口5003) - 启动订单服务:
python orderSvc.py(端口5001) - 启动网关服务:
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网关路由、分布式服务调用等关键技术点。
更多推荐


所有评论(0)