mall4cloud 微服务商城阿里云部署实战:一台 ECS 跑通全链路(含避坑清单)
环境:阿里云 ECS 8C16G / Alibaba Cloud Linux 3 / Docker Compose / JDK 17
项目:mall4cloud 开源版(Spring Boot 4 + Spring Cloud + Nacos + Seata + MySQL + Redis + RocketMQ + Elasticsearch + MinIO)
一、先想清楚:mall4cloud 不是"小商城"
mall4cloud 是 B2B2C 微服务商城,中间件全家桶包括 Nacos、Seata、MySQL、Redis、RocketMQ、Elasticsearch、Canal、MinIO,后端还有网关、认证、权限、商品、订单、支付等十几个服务。
所以它的部署成本天生比单体商城高。先根据自己的目的选路径:
| 方案 | 配置参考 | 月成本参考 | 适合场景 |
|---|---|---|---|
| 单机轻量 | ECS 4C8G + 100G ESSD | 200–400 元 | 学习、演示、跑通链路 |
| 单机全链路 | ECS 8C16G + 100G ESSD + 5M 带宽 | 400–800 元 | 小客户上线、测试环境 |
| 生产可用 | ECS + RDS MySQL + Tair/Redis + MSE Nacos + SLB | 1500 元起 | 正式对外经营 |
价格随阿里云活动波动很大,以控制台为准。新用户和活动机价格差异可能有几倍,别按官网原价做预算。
下面走的是"单机全链路",目标是一台 ECS 把网关、后台和中间件全部跑起来。
二、阿里云资源准备与安全组
- ECS:8C16G 起步,系统盘 100G ESSD,操作系统选 Ubuntu 22.04 或 Alibaba Cloud Linux 3,公网带宽 5Mbps(按量或固定带宽都行)。
- 安全组只开放必要端口:
- 22(SSH,最好限制为自己的办公 IP)
- 80、443(网站)
- 8000(网关,调试期临时开放)
- 8080(Nacos 控制台,限制为自己的 IP)
- 9001(MinIO 控制台,限制为自己的 IP)
- 以下端口不要对 0.0.0.0/0 开放:3306、6379、9200、9876、8091、11111、8180。生产环境全部走内网。
- 域名如果解析到大陆节点,需要先完成 ICP 备案;SSL 证书可以用阿里云免费证书。
三、服务器基础环境
以 Alibaba Cloud Linux 3 为例:
# Git 和 Mavensudodnfinstall-ygitmaven# Docker 与 Compose 插件curl-fsSLhttps://get.docker.com|shsudosystemctlenable--nowdockerdockercompose version# JDK 17(项目使用 JDK 17,不要用 JDK 8)sudodnfinstall-yjava-17-openjdk-develjava-version# 前端需要 Node 18+ 和 pnpmnode-v||echo"请先安装 Node 18+"npmi-gpnpm四、拉代码和改地址(最容易翻车的一步)
gitclone https://github.com/gz-yami/mall4cloud.gitgitclone https://github.com/gz-yami/mall4cloud-platform.gitgitclone https://github.com/gz-yami/mall4cloud-multishop.gitgitclone https://github.com/gz-yami/mall4cloud-uniapp.git仓库里的示例 IP 是192.168.1.46,需要换成你自己的服务器地址。注意:不要无脑全仓替换,重点核对下面这些位置:
- 中间件目录下的
docker-compose.yaml/docker-compose-native.yaml:Nacos、MinIO、Seata、RocketMQ 地址。 mysql/initdb/mall4cloud_nacos.sql:Nacos 配置中心里写死的 Redis、Seata、OSS、RocketMQ、各服务 MySQL 地址。seata/application.yml:Seata 数据库地址。canal/conf/example/instance.properties:MySQL 地址和账号。- 前端
.env.*:VITE_APP_BASE_API只指向网关,VITE_APP_RESOURCES_URL指向 MinIO。 - 后端各服务的
bootstrap.yml:NACOS_HOST、NACOS_PORT。
还有一个高频坑:Nacos 账号密码必须三处一致——各服务 bootstrap 里的默认值、Nacos 服务端账号、初始化 SQL 写入的账号。仓库默认口令是公开的,上线前必须全部改成强密码,并同步修改 Nacos 里的配置。
五、启动中间件
进入中间件 Compose 目录(位于doc/8-部署运维/2-中间件-docker-compose),先处理权限:
chmod-R777./rocketmqchmod-R666./minio/datachmod-R777./elasticsearch/data启动。国内网络优先用处理过镜像地址的版本:
dockercompose-fdocker-compose.yaml up-d--builddockerps如果服务器访问 Docker Hub 很稳定,也可以换docker-compose-native.yaml。首次拉取 ES、RocketMQ 镜像体积很大,等待十几分钟是正常的。
中间件端口对照:
| 中间件 | 端口 / 地址 |
|---|---|
| MySQL | 3306 |
| Redis | 6379 |
| Nacos 控制台 | 8080(客户端走 8848,另需 9848/9849) |
| MinIO API / 控制台 | 9000 / 9001 |
| Elasticsearch | 9200 |
| RocketMQ namesrv / dashboard | 9876 / 8180 |
| Canal | 11111 |
| Seata | 8091 |
启动完成后检查三件事:
- Nacos 能登录,配置列表里能看到
application.yml、mall4cloud-gateway.yml等配置。 - MySQL 里存在
mall4cloud_auth、mall4cloud_rbac、mall4cloud_product、mall4cloud_order等库(不动搜索可以先不建 ES 索引)。 - MinIO 控制台里建好
mall4cloud桶,并确认桶策略允许读取,否则前端图片全部 404。
六、启动后端最小链路
不要一上来把十几个服务全启动。先跑"登录 + 权限 + 一个管理后台":
mall4cloud-gatewaymall4cloud-authmall4cloud-rbacmall4cloud-bizmall4cloud-platform(平台端)或mall4cloud-multishop(商家端)
需要商品、订单页面时,再补mall4cloud-product、mall4cloud-order等。
服务端口速查:
| 服务 | 端口 |
|---|---|
| gateway | 8000 |
| leaf | 9100 |
| auth | 9101 |
| rbac | 9102 |
| multishop | 9103 |
| product | 9104 |
| user | 9105 |
| order | 9106 |
| search | 9108 |
| platform | 9112 |
| payment | 9113 |
| biz | 9000 |
打包并启动示例(内存紧张时单服务给 512M–1G 堆):
mvn clean package-DskipTestsexportNACOS_HOST=127.0.0.1exportNACOS_PORT=8848nohupjava-Xms512m-Xmx1g-jarmall4cloud-gateway.jar>gateway.log2>&1&生产环境建议用 systemd 托管,或者直接上容器编排,不要长期靠 nohup。
验收方法:访问http://服务器IP:8000/mall4cloud_rbac/menu/route,如果返回未授权,说明网关路由已经通了,这是正常现象,登录后带 token 再请求才会返回菜单数据。
七、前端部署
平台端和商家端分别构建:
pnpminstallpnpmbuild构建产物交给 Nginx。核心原则只有一条:前端只请求网关,不要直连 9102 之类的业务端口。网关的mall4cloud-gateway.yml里配置了/mall4cloud_rbac/**等路由。
Nginx 参考配置:
server { listen 443 ssl http2; server_name mall.example.com; ssl_certificate /etc/nginx/cert/mall.pem; ssl_certificate_key /etc/nginx/cert/mall.key; root /opt/mall4cloud/platform/dist; index index.html; location / { try_files $uri $uri/ /index.html; } # 网关路由前缀是 /mall4cloud_xxx,proxy_pass 不要加结尾斜杠,避免丢路径 location /mall4cloud_ { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }小程序端还有两个硬条件:域名必须 HTTPS 且已备案,并在微信公众平台配置 request、uploadFile、downloadFile 的合法域名。
八、上线前必做的 8 项加固
- 改掉仓库里公开的默认口令:MySQL、Redis、Nacos、MinIO、Elasticsearch,并同步更新 Nacos 配置。
- 中间件全部走内网,安全组只保留 80/443 和必要端口。
- RocketMQ dashboard(8180)当前没有登录保护,绝对不能暴露公网。
- Nacos 控制台加 IP 白名单,或用 Nginx 加一层认证。
- 备份:MySQL 每天 mysqldump 到 OSS,ECS 和 MinIO 数据盘开自动快照。
- 监控告警:云监控 + SLS 日志,重要服务接 ARMS,告警发到钉钉或短信。
- 平台端和商家端默认账号
admin/123456立即修改。 - 有正式业务时,用 RDS MySQL、Tair/Redis、MSE Nacos 替换自建中间件,把运维复杂度降下来。
九、常见报错排查表
| 现象 | 原因 | 处理 |
|---|---|---|
RocketMQ 报No route info of this topic | broker.conf 未挂载或权限不足 | 检查挂载和rocketmq/目录权限,重建 broker、dashboard、namesrv |
| 服务注册不上 Nacos | 只开了 8080,没开 8848/9848/9849 | 客户端端口也要放通;账号密码三处保持一致 |
| 前端图片 404 | MinIO 桶不存在或策略不允许读 | 建mall4cloud桶,检查 Nacos 中biz.oss.resources-url |
| 接口返回未授权 | 正常,说明网关路由通了 | 登录获取 token 后再请求 |
| 页面能开但接口 404 | 前端直连业务端口,或 Nginx 丢了路径前缀 | 只连网关 8000,检查location与proxy_pass |
| Seata 连不上 | 8091 未放通 | 同时核对seata/application.yml和 Compose 端口 |
| 启动报内存不足 | 微服务多开 | 先只启动最小链路,单服务配置 512M 堆起步 |
十、关于开源协议,提前说清楚
mall4cloud 开源版使用 AGPLv3:允许学习和商用,也允许二次开发;但如果你修改后通过网络对外提供服务,使用者有权获得你修改后的源码。
所以:
- 自己学习、内部使用、按 AGPL 向客户交付源码:没有问题;
- 要做闭源商用、申请软著、上架云市场:走官方商业授权。
这条提前写进合同和客户沟通里,能省掉后面 90% 的扯皮。
十一、总结
mall4cloud 在阿里云上的部署难点不在敲命令,而在三件事:地址配置的一致性、中间件的资源与安全、前端只走网关。把最小链路跑通,再逐步加服务,比一上来全量启动高效得多。
如果部署过程中卡在某个报错,可以把日志贴到评论区,我挑典型问题回复。下一篇准备写:mall4cloud 后台功能二开的完整流程(菜单、权限、接口、数据表怎么串)。