VortMall 微服务阿里云部署指南
本文档适用于小型业务场景(日订单 < 1000,日活用户 < 5000),采用 Docker Compose 单机部署方案。
目录
1. 概述
1.1 技术栈
| 组件 | 版本 | 说明 |
|---|---|---|
| Java | 21 | 运行环境 |
| Spring Boot | 3.2.2 | 基础框架 |
| Spring Cloud | 2023.0.0 | 微服务框架 |
| Spring Cloud Alibaba | 2023.0.1.2 | 阿里云微服务组件 |
| MySQL | 8.4 | 数据库 |
| Redis | Latest | 缓存 |
| Nacos | 2.5.1 | 注册中心/配置中心 |
| RocketMQ | 5.2.0 | 消息队列 |
| Seata | 2.0.0 | 分布式事务 |
| XXL-JOB | 2.4.1 | 分布式任务调度 |
| MinIO | Latest | 对象存储 |
| EMQX | 5.8.3 | MQTT 消息服务 |
| Elasticsearch | 8.12.0 | 搜索引擎 |
| SkyWalking | 10.0.1 | 链路追踪 |
1.2 微服务模块列表
| 服务名称 | 模块 | 端口 | 说明 |
|---|---|---|---|
| vortmall-gateway | 网关服务 | 8000 | API 网关,统一入口 |
| vortmall-auth | 认证服务 | 8001 | 用户认证授权 |
| vortmall-biz-product | 商品服务 | 19901 | 商品管理 |
| vortmall-biz-payment | 支付服务 | 19902 | 支付处理 |
| vortmall-biz-system | 系统服务 | 19903 | 系统配置管理 |
| vortmall-biz-marketing | 营销服务 | 19904 | 营销活动 |
| vortmall-biz-order | 订单服务 | 19905 | 订单管理 |
| vortmall-biz-content | 内容服务 | 19906 | 内容管理 |
| vortmall-biz-organize | 组织服务 | 19907 | 组织架构 |
| vortmall-biz-logistics | 物流服务 | 19908 | 物流管理 |
| vortmall-biz-aftersales | 售后服务 | 19909 | 售后处理 |
| vortmall-biz-distribution | 分销服务 | 19910 | 分销管理 |
| vortmall-biz-decoration | 装修服务 | 19911 | 店铺装修 |
| vortmall-biz-message | 消息服务 | 19912 | 消息通知 |
| vortmall-biz-user | 用户服务 | 19913 | 用户管理 |
| vortmall-biz-file | 文件服务 | 19914 | 文件上传 |
| vortmall-biz-pos | POS服务 | 19915 | 收银系统 |
1.3 部署架构图
┌─────────────────────────────────────────────────────────────┐
│ 阿里云 VPC │
│ │
用户请求 ──────▶ SLB/Nginx ────▶│ ┌─────────────────────────────────────────────────────┐ │
│ │ 应用服务器 (ECS 8核16G) │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────────────────────────┐ │ │
│ │ │ Gateway │───▶│ 业务微服务 (16个) │ │ │
│ │ │ :8000 │ │ Product, Order, User... │ │ │
│ │ └─────────┘ └─────────────────────────────┘ │ │
│ │ │ │ │ │
│ │ ▼ ▼ │ │
│ │ ┌─────────┐ ┌─────────────┐ │ │
│ │ │ Auth │ │ Feign │ │ │
│ │ │ :8001 │ │ 调用 │ │ │
│ │ └─────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 中间件服务器 (ECS 4核8G) │ │
│ │ │ │
│ │ ┌───────┐ ┌───────┐ ┌───────┐ ┌─────────┐ │ │
│ │ │ MySQL │ │ Redis │ │ Nacos │ │RocketMQ │ │ │
│ │ │ :3306 │ │ :6379 │ │ :8848 │ │ :9876 │ │ │
│ │ └───────┘ └───────┘ └───────┘ └─────────┘ │ │
│ │ │ │
│ │ ┌───────┐ ┌───────┐ ┌───────┐ ┌─────────┐ │ │
│ │ │ MinIO │ │XXL-JOB│ │ Seata │ │ EMQX │ │ │
│ │ │ :9000 │ │ :8082 │ │ :8091 │ │ :1883 │ │ │
│ │ └───────┘ └───────┘ └───────┘ └─────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
2. 阿里云服务器配置推荐
2.1 方案一:自建中间件(成本优先)
适合技术团队有运维能力,对成本敏感的场景。
| 资源类型 | 规格 | 数量 | 月费用(预估) |
|---|---|---|---|
| ECS 应用服务器 | ecs.c7.2xlarge (8核16G) | 1 | ¥400 |
| ECS 中间件服务器 | ecs.c7.xlarge (4核8G) | 1 | ¥200 |
| 系统盘 | ESSD PL0 100GB | 2 | ¥20 |
| 数据盘 | ESSD PL0 200GB | 1 | ¥30 |
| 公网带宽 | 5Mbps | 1 | ¥100 |
| 合计 | - | - | ¥750/月 |
2.2 方案二:托管服务(稳定优先,推荐)
利用阿里云托管服务,减少运维负担,提高稳定性。
| 资源类型 | 规格 | 数量 | 月费用(预估) |
|---|---|---|---|
| ECS 应用服务器 | ecs.c7.xlarge (4核8G) | 1 | ¥200 |
| RDS MySQL | 基础版 2核4G 100GB | 1 | ¥150 |
| Redis | 标准版 1G | 1 | ¥80 |
| MSE Nacos | 基础版 | 1 | ¥0(免费额度) |
| OSS 对象存储 | 标准存储 50GB | 1 | ¥10 |
| 公网带宽 | 5Mbps | 1 | ¥100 |
| 合计 | - | - | ¥540/月 |
建议:初期采用方案一快速上线,待业务稳定后逐步迁移到托管服务。
2.3 服务器选购建议
- 地域选择:选择目标用户最近的地域(如华东1-杭州、华东2-上海)
- 付费方式:预付费(包年包月)比按量付费便宜约 30-50%
- 镜像选择:推荐 Alibaba Cloud Linux 3 或 Ubuntu 22.04 LTS
- 安全组:创建时选择"Web Server Linux"模板
3. 服务器初始化
3.1 系统配置
# 更新系统
sudo yum update -y # CentOS/Alibaba Cloud Linux
# 或
sudo apt update && sudo apt upgrade -y # Ubuntu
# 设置时区
sudo timedatectl set-timezone Asia/Shanghai
# 设置主机名
sudo hostnamectl set-hostname vortmall-server
# 关闭 SELinux(如果启用)
sudo setenforce 0
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
3.2 安装 Docker
# 安装 Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 配置 Docker 镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
# 启动 Docker
sudo systemctl daemon-reload
sudo systemctl enable docker
sudo systemctl start docker
# 安装 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker --version
docker-compose --version
3.3 安装 JDK 21
# 下载并安装 OpenJDK 21
sudo yum install -y java-21-openjdk java-21-openjdk-devel
# 或使用 SDKMAN
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install java 21.0.2-tem
# 验证
java -version
3.4 创建部署目录
# 创建应用目录结构
sudo mkdir -p /opt/vortmall/{apps,middleware,logs,data,scripts}
sudo chown -R $USER:$USER /opt/vortmall
# 目录说明:
# /opt/vortmall/apps - 业务服务 JAR 包
# /opt/vortmall/middleware - 中间件 docker-compose 配置
# /opt/vortmall/logs - 应用日志
# /opt/vortmall/data - 数据持久化目录
# /opt/vortmall/scripts - 运维脚本
3.5 配置安全组
在阿里云控制台配置以下安全组规则:
| 方向 | 端口范围 | 协议 | 授权对象 | 说明 |
|---|---|---|---|---|
| 入方向 | 22 | TCP | 运维IP段 | SSH |
| 入方向 | 80 | TCP | 0.0.0.0/0 | HTTP |
| 入方向 | 443 | TCP | 0.0.0.0/0 | HTTPS |
| 入方向 | 8000 | TCP | 内网IP段 | Gateway(可选,建议走 Nginx) |
| 入方向 | 8848 | TCP | 内网IP段 | Nacos(仅内网) |
| 入方向 | 3306 | TCP | 内网IP段 | MySQL(仅内网) |
| 入方向 | 6379 | TCP | 内网IP段 | Redis(仅内网) |
安全提示:中间件端口不要暴露到公网,仅开放给内网访问。
4. 中间件部署
4.1 准备配置文件
将项目中的 deployment/DockerCompose 目录上传到服务器:
# 在本地执行
scp -r deployment/DockerCompose root@your-server-ip:/opt/vortmall/middleware/
4.2 修改配置
cd /opt/vortmall/middleware/DockerCompose
# 替换 PUBLIC_IP 为实际服务器内网 IP
export PUBLIC_IP=$(hostname -I | awk '{print $1}')
sed -i "s/{{PUBLIC_IP}}/$PUBLIC_IP/g" docker-compose.yml
4.3 创建环境变量文件
# 创建 .env 文件
cat > /opt/vortmall/middleware/DockerCompose/.env <<EOF
# MySQL
MYSQL_ROOT_PASSWORD=your_secure_password_here
MYSQL_DATABASE=vortmall
# MinIO
MINIO_ROOT_USER=vortmall
MINIO_ROOT_PASSWORD=your_secure_password_here
# EMQX
EMQX_DASHBOARD_PASSWORD=your_secure_password_here
# Elasticsearch
ELASTIC_PASSWORD=your_secure_password_here
EOF
4.4 启动核心中间件
建议分批启动,先启动核心组件:
cd /opt/vortmall/middleware/DockerCompose
# 第一批:基础组件(MySQL、Redis、Nacos)
docker-compose up -d mysql redis nacos
# 等待 MySQL 健康检查通过(约 30 秒)
docker-compose logs -f mysql
# 第二批:消息队列
docker-compose up -d namesrv broker rocketmq-dashboard
# 第三批:其他组件
docker-compose up -d xxl-job seata-server minio
4.5 可选组件
根据实际需求选择性部署:
# MQTT 消息服务(POS 收银、实时通知场景需要)
docker-compose up -d emqx
# 搜索引擎(商品搜索需要)
docker-compose up -d es kibana
# 日志收集
docker-compose up -d logstash
# 数据同步(ES 数据同步需要)
docker-compose up -d canal-server
# 链路追踪(性能分析需要)
docker-compose up -d skywalking-oap skywalking-ui
4.6 中间件端口清单
| 服务 | 端口 | 用途 |
|---|---|---|
| MySQL | 3306 | 数据库 |
| Redis | 6379 | 缓存 |
| Nacos | 8848, 9848 | 注册/配置中心 |
| RocketMQ NameServer | 9876 | 消息队列 |
| RocketMQ Broker | 10909, 10911 | 消息队列 |
| RocketMQ Dashboard | 8080 | 管理界面 |
| XXL-JOB | 8082 | 任务调度 |
| Seata | 7091, 8091 | 分布式事务 |
| MinIO | 9000, 9001 | 对象存储 |
| EMQX | 1883, 18083 | MQTT |
| Elasticsearch | 9200 | 搜索引擎 |
| Kibana | 5601 | ES 可视化 |
| Logstash | 5000, 5001 | 日志收集 |
| SkyWalking | 11800, 12800, 18080 | 链路追踪 |
4.7 初始化数据库
# 进入 MySQL 容器
docker exec -it mysql-8 mysql -uroot -p
# 创建业务数据库
CREATE DATABASE IF NOT EXISTS `vortmall-user` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `vortmall-product` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `vortmall-order` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `vortmall-payment` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `vortmall-system` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `vortmall-marketing` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `vortmall-content` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `vortmall-organize` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `vortmall-logistics` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `vortmall-aftersales` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `vortmall-distribution` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `vortmall-decoration` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `vortmall-message` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `vortmall-file` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `vortmall-pos` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 创建应用账号
CREATE USER 'vortmall'@'%' IDENTIFIED BY 'your_secure_password';
GRANT ALL PRIVILEGES ON `vortmall-%`.* TO 'vortmall'@'%';
FLUSH PRIVILEGES;
5. 业务服务部署
5.1 构建 Docker 镜像
在开发机器上构建镜像:
# 在项目根目录执行 Maven 打包
mvn clean package -DskipTests
# 创建 Dockerfile(放在每个服务模块下)
通用 Dockerfile 模板:
# Dockerfile
FROM eclipse-temurin:21-jre-alpine
LABEL maintainer="VortMall Team"
# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 创建应用目录
WORKDIR /app
# 复制 JAR 文件
COPY target/*.jar app.jar
# 暴露端口(根据服务修改)
EXPOSE 8000
# 启动命令
ENTRYPOINT ["java", \
"-Xms512m", \
"-Xmx512m", \
"-XX:+UseG1GC", \
"-XX:+HeapDumpOnOutOfMemoryError", \
"-XX:HeapDumpPath=/app/logs/heapdump.hprof", \
"-Djava.security.egd=file:/dev/./urandom", \
"-jar", \
"app.jar"]
5.2 业务服务 docker-compose.yml
创建 /opt/vortmall/apps/docker-compose.yml:
version: '3.8'
services:
vortmall-gateway:
image: vortmall/gateway:latest
container_name: vortmall-gateway
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms512m -Xmx512m
ports:
- "8000:8000"
volumes:
- /opt/vortmall/logs/gateway:/app/logs
restart: always
depends_on:
- vortmall-auth
networks:
- vortmall-network
vortmall-auth:
image: vortmall/auth:latest
container_name: vortmall-auth
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms256m -Xmx256m
ports:
- "8001:8001"
volumes:
- /opt/vortmall/logs/auth:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-user:
image: vortmall/biz-user:latest
container_name: vortmall-biz-user
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms512m -Xmx512m
ports:
- "19913:19913"
volumes:
- /opt/vortmall/logs/biz-user:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-product:
image: vortmall/biz-product:latest
container_name: vortmall-biz-product
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms512m -Xmx512m
ports:
- "19901:19901"
volumes:
- /opt/vortmall/logs/biz-product:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-order:
image: vortmall/biz-order:latest
container_name: vortmall-biz-order
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms512m -Xmx512m
ports:
- "19905:19905"
volumes:
- /opt/vortmall/logs/biz-order:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-payment:
image: vortmall/biz-payment:latest
container_name: vortmall-biz-payment
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms256m -Xmx256m
ports:
- "19902:19902"
volumes:
- /opt/vortmall/logs/biz-payment:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-system:
image: vortmall/biz-system:latest
container_name: vortmall-biz-system
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms256m -Xmx256m
ports:
- "19903:19903"
volumes:
- /opt/vortmall/logs/biz-system:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-marketing:
image: vortmall/biz-marketing:latest
container_name: vortmall-biz-marketing
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms256m -Xmx256m
ports:
- "19904:19904"
volumes:
- /opt/vortmall/logs/biz-marketing:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-content:
image: vortmall/biz-content:latest
container_name: vortmall-biz-content
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms256m -Xmx256m
ports:
- "19906:19906"
volumes:
- /opt/vortmall/logs/biz-content:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-organize:
image: vortmall/biz-organize:latest
container_name: vortmall-biz-organize
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms256m -Xmx256m
ports:
- "19907:19907"
volumes:
- /opt/vortmall/logs/biz-organize:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-logistics:
image: vortmall/biz-logistics:latest
container_name: vortmall-biz-logistics
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms256m -Xmx256m
ports:
- "19908:19908"
volumes:
- /opt/vortmall/logs/biz-logistics:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-aftersales:
image: vortmall/biz-aftersales:latest
container_name: vortmall-biz-aftersales
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms256m -Xmx256m
ports:
- "19909:19909"
volumes:
- /opt/vortmall/logs/biz-aftersales:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-distribution:
image: vortmall/biz-distribution:latest
container_name: vortmall-biz-distribution
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms256m -Xmx256m
ports:
- "19910:19910"
volumes:
- /opt/vortmall/logs/biz-distribution:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-decoration:
image: vortmall/biz-decoration:latest
container_name: vortmall-biz-decoration
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms256m -Xmx256m
ports:
- "19911:19911"
volumes:
- /opt/vortmall/logs/biz-decoration:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-message:
image: vortmall/biz-message:latest
container_name: vortmall-biz-message
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms256m -Xmx256m
ports:
- "19912:19912"
volumes:
- /opt/vortmall/logs/biz-message:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-file:
image: vortmall/biz-file:latest
container_name: vortmall-biz-file
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms256m -Xmx256m
ports:
- "19914:19914"
volumes:
- /opt/vortmall/logs/biz-file:/app/logs
restart: always
networks:
- vortmall-network
vortmall-biz-pos:
image: vortmall/biz-pos:latest
container_name: vortmall-biz-pos
environment:
- SPRING_PROFILES_ACTIVE=prod
- VORTMALL_HOST=${MIDDLEWARE_HOST}
- JAVA_OPTS=-Xms256m -Xmx256m
ports:
- "19915:19915"
volumes:
- /opt/vortmall/logs/biz-pos:/app/logs
restart: always
networks:
- vortmall-network
networks:
vortmall-network:
external: true
name: dockercompose_default
5.3 生产环境配置
在 Nacos 配置中心创建生产环境配置,命名空间建议使用 prod:
公共配置 application-common.properties:
# 数据库连接池
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
# Redis
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-idle=10
spring.redis.lettuce.pool.min-idle=5
# 日志级别
logging.level.root=INFO
logging.level.com.vortmall=INFO
# 关闭 Swagger(生产环境)
springdoc.api-docs.enabled=false
springdoc.swagger-ui.enabled=false
5.4 JVM 内存分配建议
基于 8核16G 服务器的内存分配:
| 服务 | 堆内存 | 说明 |
|---|---|---|
| Gateway | 512M | 网关流量大,需要较多内存 |
| Auth | 256M | 认证服务相对轻量 |
| Product | 512M | 商品数据量大 |
| Order | 512M | 订单处理核心服务 |
| User | 512M | 用户服务 |
| Payment | 256M | 支付服务 |
| 其他服务 | 256M | 根据实际情况调整 |
| 预留 | 4G | 系统和中间件 |
5.5 启动服务
cd /opt/vortmall/apps
# 设置中间件地址
export MIDDLEWARE_HOST=<中间件服务器内网IP>
# 启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f vortmall-gateway
6. Nginx 反向代理配置
6.1 安装 Nginx
# 安装 Nginx
sudo yum install -y nginx
# 或
sudo apt install -y nginx
# 启动并设置开机自启
sudo systemctl enable nginx
sudo systemctl start nginx
6.2 Nginx 配置
创建 /etc/nginx/conf.d/vortmall.conf:
# API 服务
upstream vortmall-gateway {
server 127.0.0.1:8000;
keepalive 32;
}
# HTTP 重定向到 HTTPS
server {
listen 80;
server_name api.yourdomain.com admin.yourdomain.com;
# Let's Encrypt 验证
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
# HTTPS API 服务
server {
listen 443 ssl http2;
server_name api.yourdomain.com;
# SSL 证书(使用 Let's Encrypt 或阿里云证书)
ssl_certificate /etc/nginx/ssl/api.yourdomain.com.pem;
ssl_certificate_key /etc/nginx/ssl/api.yourdomain.com.key;
# SSL 配置
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
# HSTS
add_header Strict-Transport-Security "max-age=63072000" always;
# 文件上传大小限制
client_max_body_size 500M;
# 代理配置
location / {
proxy_pass http://vortmall-gateway;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection "";
# 超时配置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# WebSocket 支持
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# 健康检查端点
location /health {
access_log off;
return 200 "healthy\n";
}
}
# 管理后台(前端静态文件)
server {
listen 443 ssl http2;
server_name admin.yourdomain.com;
ssl_certificate /etc/nginx/ssl/admin.yourdomain.com.pem;
ssl_certificate_key /etc/nginx/ssl/admin.yourdomain.com.key;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/vortmall-admin;
index index.html;
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# SPA 路由支持
location / {
try_files $uri $uri/ /index.html;
}
# API 代理
location /adminapi/ {
proxy_pass http://vortmall-gateway;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
6.3 申请 SSL 证书
方式一:阿里云免费证书
- 登录阿里云控制台 -> SSL 证书服务
- 申请免费 DV 证书(每年 20 个免费额度)
- 下载 Nginx 格式证书,上传到服务器
方式二:Let's Encrypt
# 安装 certbot
sudo yum install -y certbot python3-certbot-nginx
# 申请证书
sudo certbot --nginx -d api.yourdomain.com -d admin.yourdomain.com
# 自动续期
sudo certbot renew --dry-run
7. 运维监控
7.1 日志收集(ELK)
业务服务日志已配置输出到 /opt/vortmall/logs/ 目录。配合 Logstash 收集到 Elasticsearch。
Logstash 配置 /opt/vortmall/middleware/DockerCompose/logstash/pipeline/logstash.conf:
input {
tcp {
port => 5000
codec => json_lines
}
}
filter {
if [level] == "ERROR" {
mutate {
add_tag => ["error"]
}
}
}
output {
elasticsearch {
hosts => ["es:9200"]
user => "elastic"
password => "${ELASTIC_PASSWORD}"
index => "vortmall-logs-%{+YYYY.MM.dd}"
}
}
7.2 链路追踪(SkyWalking)
启动服务时添加 SkyWalking Agent:
# 下载 SkyWalking Agent
wget https://archive.apache.org/dist/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz
tar -xzf apache-skywalking-java-agent-9.0.0.tgz -C /opt/vortmall/
# 在启动命令中添加 Agent
java -javaagent:/opt/vortmall/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=vortmall-gateway \
-Dskywalking.collector.backend_service=127.0.0.1:11800 \
-jar app.jar
7.3 健康检查脚本
创建 /opt/vortmall/scripts/health-check.sh:
#!/bin/bash
# 服务健康检查
SERVICES=(
"http://localhost:8000/health:Gateway"
"http://localhost:8001/health:Auth"
"http://localhost:19901/health:Product"
"http://localhost:19905/health:Order"
)
echo "==================== 服务健康检查 ===================="
echo "检查时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo ""
for service in "${SERVICES[@]}"; do
url="${service%%:*}"
name="${service##*:}"
response=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 "$url")
if [ "$response" == "200" ]; then
echo "[OK] $name"
else
echo "[FAIL] $name (HTTP $response)"
fi
done
echo ""
echo "==================== Docker 容器状态 ===================="
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
7.4 监控告警
建议接入阿里云云监控:
- 安装云监控插件
- 配置进程监控(Java 进程)
- 配置端口监控
- 设置告警规则(CPU > 80%、内存 > 85%、磁盘 > 90%)
8. 安全配置
8.1 敏感信息管理
方式一:环境变量
# /etc/profile.d/vortmall.sh
export MYSQL_PASSWORD=your_secure_password
export REDIS_PASSWORD=your_secure_password
export MINIO_PASSWORD=your_secure_password
方式二:Nacos 配置中心(推荐)
将敏感配置存储在 Nacos,并开启配置加密:
# 数据库密码(加密存储)
spring.datasource.password=ENC(xxxxx)
8.2 防火墙配置
# 只开放必要端口
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
# 禁止公网访问中间件端口
# 通过安全组规则限制
8.3 定期备份
创建 /opt/vortmall/scripts/backup.sh:
#!/bin/bash
BACKUP_DIR="/opt/vortmall/backup"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# 备份 MySQL
docker exec mysql-8 mysqldump -uroot -p$MYSQL_ROOT_PASSWORD --all-databases > $BACKUP_DIR/mysql_$DATE.sql
# 备份 Nacos 配置
docker exec nacos sh -c 'cd /home/nacos && tar czf - data' > $BACKUP_DIR/nacos_$DATE.tar.gz
# 备份 MinIO 数据
tar czf $BACKUP_DIR/minio_$DATE.tar.gz /opt/vortmall/middleware/DockerCompose/minio/data
# 清理 7 天前的备份
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
echo "备份完成: $DATE"
添加定时任务:
# 每天凌晨 3 点执行备份
crontab -e
0 3 * * * /opt/vortmall/scripts/backup.sh >> /opt/vortmall/logs/backup.log 2>&1
9. 常见问题
9.1 服务启动失败
问题:服务无法连接 Nacos
排查:
# 检查 Nacos 是否正常
curl http://localhost:8848/nacos/v1/console/health/readiness
# 检查网络连通性
telnet <nacos-ip> 8848
问题:内存不足导致 OOM
解决:
# 调整 JVM 参数
-Xms256m -Xmx256m # 减小堆内存
-XX:MaxMetaspaceSize=128m # 限制元空间
9.2 性能优化
- 开启 GZIP 压缩(Nginx)
- 配置连接池(数据库、Redis)
- 启用本地缓存(Caffeine)
- 优化 SQL 查询(添加索引)
9.3 日志排查
# 查看服务日志
docker logs -f --tail 100 vortmall-gateway
# 查看指定时间段日志
docker logs --since="2024-01-01T00:00:00" --until="2024-01-01T01:00:00" vortmall-gateway
# 进入容器排查
docker exec -it vortmall-gateway sh
10. 扩展建议
10.1 升级到高可用架构
当业务增长到中型规模(日订单 1000-10000)时,建议:
- 数据库主从:MySQL 一主一从,读写分离
- Redis 集群:3 主 3 从集群模式
- Nacos 集群:3 节点集群
- 负载均衡:使用阿里云 SLB
预估成本增加:¥1000-2000/月
10.2 迁移到 Kubernetes
当业务规模进一步增长,建议迁移到阿里云 ACK(托管 Kubernetes):
优势:
- 弹性伸缩
- 滚动更新
- 自愈能力
- 资源隔离
准备工作:
- 将 Docker Compose 配置转换为 K8s YAML
- 配置 Helm Chart
- 使用阿里云镜像服务(ACR)
- 配置 Ingress 替代 Nginx
10.3 使用托管服务替代自建
| 自建组件 | 阿里云托管服务 | 优势 |
|---|---|---|
| MySQL | RDS MySQL | 自动备份、主从切换 |
| Redis | 云数据库 Redis | 高可用、免运维 |
| Nacos | MSE Nacos | 免费版可用 |
| RocketMQ | 消息队列 RocketMQ | 按量付费 |
| Elasticsearch | ES 服务 | 免运维、弹性扩展 |
| MinIO | OSS | 无限容量、低成本 |
附录
A. 快速部署脚本
创建一键部署脚本 /opt/vortmall/scripts/deploy.sh:
#!/bin/bash
set -e
echo "==================== VortMall 一键部署 ===================="
# 检查 Docker
if ! command -v docker &> /dev/null; then
echo "Docker 未安装,请先安装 Docker"
exit 1
fi
# 启动中间件
echo ">>> 启动中间件..."
cd /opt/vortmall/middleware/DockerCompose
docker-compose up -d mysql redis nacos
sleep 30
docker-compose up -d namesrv broker xxl-job seata-server minio
sleep 10
# 启动业务服务
echo ">>> 启动业务服务..."
cd /opt/vortmall/apps
docker-compose up -d
echo ">>> 等待服务启动..."
sleep 60
# 健康检查
echo ">>> 执行健康检查..."
/opt/vortmall/scripts/health-check.sh
echo "==================== 部署完成 ===================="
B. 服务管理命令速查
# 查看所有容器
docker ps -a
# 重启单个服务
docker-compose restart vortmall-gateway
# 查看服务日志
docker-compose logs -f vortmall-gateway
# 进入容器
docker exec -it vortmall-gateway sh
# 更新服务
docker-compose pull vortmall-gateway
docker-compose up -d vortmall-gateway
# 清理无用镜像
docker image prune -a
C. 联系方式
如有部署问题,请联系技术支持。







