VortMall 微服务阿里云部署指南
13
类别: 
生产部署

VortMall 微服务阿里云部署指南

本文档适用于小型业务场景(日订单 < 1000,日活用户 < 5000),采用 Docker Compose 单机部署方案。

目录


1. 概述

1.1 技术栈

组件版本说明
Java21运行环境
Spring Boot3.2.2基础框架
Spring Cloud2023.0.0微服务框架
Spring Cloud Alibaba2023.0.1.2阿里云微服务组件
MySQL8.4数据库
RedisLatest缓存
Nacos2.5.1注册中心/配置中心
RocketMQ5.2.0消息队列
Seata2.0.0分布式事务
XXL-JOB2.4.1分布式任务调度
MinIOLatest对象存储
EMQX5.8.3MQTT 消息服务
Elasticsearch8.12.0搜索引擎
SkyWalking10.0.1链路追踪

1.2 微服务模块列表

服务名称模块端口说明
vortmall-gateway网关服务8000API 网关,统一入口
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-posPOS服务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 100GB2¥20
数据盘ESSD PL0 200GB1¥30
公网带宽5Mbps1¥100
合计--¥750/月

2.2 方案二:托管服务(稳定优先,推荐)

利用阿里云托管服务,减少运维负担,提高稳定性。

资源类型规格数量月费用(预估)
ECS 应用服务器ecs.c7.xlarge (4核8G)1¥200
RDS MySQL基础版 2核4G 100GB1¥150
Redis标准版 1G1¥80
MSE Nacos基础版1¥0(免费额度)
OSS 对象存储标准存储 50GB1¥10
公网带宽5Mbps1¥100
合计--¥540/月

建议:初期采用方案一快速上线,待业务稳定后逐步迁移到托管服务。

2.3 服务器选购建议

  1. 地域选择:选择目标用户最近的地域(如华东1-杭州、华东2-上海)
  2. 付费方式:预付费(包年包月)比按量付费便宜约 30-50%
  3. 镜像选择:推荐 Alibaba Cloud Linux 3 或 Ubuntu 22.04 LTS
  4. 安全组:创建时选择"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 配置安全组

在阿里云控制台配置以下安全组规则:

方向端口范围协议授权对象说明
入方向22TCP运维IP段SSH
入方向80TCP0.0.0.0/0HTTP
入方向443TCP0.0.0.0/0HTTPS
入方向8000TCP内网IP段Gateway(可选,建议走 Nginx)
入方向8848TCP内网IP段Nacos(仅内网)
入方向3306TCP内网IP段MySQL(仅内网)
入方向6379TCP内网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 中间件端口清单

服务端口用途
MySQL3306数据库
Redis6379缓存
Nacos8848, 9848注册/配置中心
RocketMQ NameServer9876消息队列
RocketMQ Broker10909, 10911消息队列
RocketMQ Dashboard8080管理界面
XXL-JOB8082任务调度
Seata7091, 8091分布式事务
MinIO9000, 9001对象存储
EMQX1883, 18083MQTT
Elasticsearch9200搜索引擎
Kibana5601ES 可视化
Logstash5000, 5001日志收集
SkyWalking11800, 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 服务器的内存分配:

服务堆内存说明
Gateway512M网关流量大,需要较多内存
Auth256M认证服务相对轻量
Product512M商品数据量大
Order512M订单处理核心服务
User512M用户服务
Payment256M支付服务
其他服务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 证书

方式一:阿里云免费证书

  1. 登录阿里云控制台 -> SSL 证书服务
  2. 申请免费 DV 证书(每年 20 个免费额度)
  3. 下载 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 监控告警

建议接入阿里云云监控:

  1. 安装云监控插件
  2. 配置进程监控(Java 进程)
  3. 配置端口监控
  4. 设置告警规则(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 性能优化

  1. 开启 GZIP 压缩(Nginx)
  2. 配置连接池(数据库、Redis)
  3. 启用本地缓存(Caffeine)
  4. 优化 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)时,建议:

  1. 数据库主从:MySQL 一主一从,读写分离
  2. Redis 集群:3 主 3 从集群模式
  3. Nacos 集群:3 节点集群
  4. 负载均衡:使用阿里云 SLB

预估成本增加:¥1000-2000/月

10.2 迁移到 Kubernetes

当业务规模进一步增长,建议迁移到阿里云 ACK(托管 Kubernetes):

优势

  • 弹性伸缩
  • 滚动更新
  • 自愈能力
  • 资源隔离

准备工作

  1. 将 Docker Compose 配置转换为 K8s YAML
  2. 配置 Helm Chart
  3. 使用阿里云镜像服务(ACR)
  4. 配置 Ingress 替代 Nginx

10.3 使用托管服务替代自建

自建组件阿里云托管服务优势
MySQLRDS MySQL自动备份、主从切换
Redis云数据库 Redis高可用、免运维
NacosMSE Nacos免费版可用
RocketMQ消息队列 RocketMQ按量付费
ElasticsearchES 服务免运维、弹性扩展
MinIOOSS无限容量、低成本

附录

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. 联系方式

如有部署问题,请联系技术支持。

评论 0
/ 1000
0
0
收藏