共计 16992 个字符,预计需要花费 43 分钟才能阅读完成。
简介
这是一篇专门写给编程新手的微服务部署全流程教程,不用纠结复杂概念,不用怕踩网络或环境坑。我们从 Docker 环境一键搭建开始,用轩辕镜像解决国内拉取镜像慢的问题,避开 OpenJDK 弃用的雷区,全程手把手带你完成「本地调试→服务器部署」,哪怕是 2 核 4G 的低配服务器,也能顺利跑通包含 MySQL、Redis、Nacos 和 4 个电商场景业务服务的微服务项目。
前置准备:Docker 及 Docker Compose 环境搭建
刚接触微服务部署的同学,千万别上来就怼服务器——先把本地 Docker 环境搞定,后续操作会少走 90% 的坑。而且这一步超级简单,用脚本一键就能完成。
为什么选 Docker 部署微服务?
传统部署微服务太折磨人了:要手动装 MySQL、Redis 这些依赖,版本不对还会冲突;本地跑的好好的,一上服务器就报错;启动服务要敲一堆命令,忘了顺序还得重来。而 Docker 能一次性解决这些问题:
- 环境一致:把应用和依赖打包成「镜像」,就像带配置的安装包,本地、服务器跑起来完全一样;
- 隔离安全:每个服务跑在独立容器里,不会互相干扰,也不用担心影响主机环境;
- 操作简单:用 Docker Compose 写个配置文件,一行命令就能启动所有服务;
- 迭代方便:更新版本只需拉新镜像,出问题回滚也快;
- 资源够省:容器启动秒级响应,2 核 4G 服务器跑一套微服务完全够用。
一键安装 Docker 及 Docker Compose
不管你用的是 Linux、Mac 还是 Windows(需开启 WSL2),复制下面的命令到终端,回车就能自动安装,还会配置好轩辕镜像加速,不用手动调配置:
# 直接复制到终端执行,Linux/Mac/WSL2 通用
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
安装完成后,一定要验证一下环境是否可用,输入两个命令:
docker --version # 能看到版本号(比如 Docker version 27.0.3)就对了
docker compose --version # 输出类似 Docker Compose version v2.27.0 即可
如果是 Windows 或 Mac 用户,想更直观地管理容器,也可以装 Docker Desktop(官网直接搜就能下载),安装后会自动关联本地 Docker 环境,图形化界面能看到容器启动状态,新手友好度拉满。
Maven 安装说明(本地 / 服务器双方案)
打包微服务需要 Maven 环境,这里提供「容器免安装」和「手动安装」两种方案,新手优先选容器方案(无需配置环境变量,直接可用)。
方案 1:Docker 容器方案(推荐新手,免安装)
无需手动安装 Maven,直接使用官方 Maven 镜像运行打包命令,容器退出后不残留环境,命令如下(后续打包会直接用此方式):
# 格式:docker run -v 本地项目路径:/app -w /app maven: 版本 打包命令
docker run -v $(pwd):/app -w /app maven:3.8.1-jdk-8-slim mvn clean package -DskipTests
方案 2:手动安装(本地 / 服务器通用)
若需本地长期使用 Maven,可手动安装,步骤如下:
- 下载 Maven:访问Maven 官网,下载对应系统的压缩包(如 Linux 选 apache-maven-3.8.8-bin.tar.gz);
- 解压安装:
- Linux/Mac:终端执行
tar -zxvf apache-maven-3.8.8-bin.tar.gz -C /usr/local/; - Windows:右键解压到指定目录(如 D:\apache-maven-3.8.8);
- Linux/Mac:终端执行
- 配置环境变量:
- Linux/Mac:编辑
/etc/profile,添加export MAVEN_HOME=/usr/local/apache-maven-3.8.8和export PATH=$MAVEN_HOME/bin:$PATH,执行source /etc/profile生效; - Windows:右键「此电脑」→属性→高级系统设置→环境变量,新增 MAVEN_HOME 变量(值为解压路径),在 Path 中添加
%MAVEN_HOME%\bin;
- Linux/Mac:编辑
- 验证安装:终端执行
mvn -v,能看到 Maven 版本信息即成功。
核心概念:不用死记,理解就行
刚接触 Docker 的同学,不用纠结复杂术语,记住两个核心东西,后续操作就顺了:
- 镜像:相当于「带环境的安装包」,包含了应用运行需要的所有东西(如 JDK、MySQL 程序),我们从镜像仓库拉取后就能用;
- 容器:镜像运行起来后的实例,就像装好了软件的虚拟机,能启动、停止、删除,删除后数据不会残留(除非配置了持久化)。
这里有个关键提醒:很多教程里用的 OpenJDK 镜像已经被弃用了,继续用会出兼容性问题!给大家整理了 5 个官方推荐的替代镜像,新手优先选 Amazon Corretto,体积小、适配性强,每个镜像都能在轩辕镜像平台查到详细用法(Amazon Corretto 是构建业务服务的基础镜像,属于环境依赖范畴,并非业务服务本身):
- Amazon Corretto(推荐):AWS 官方维护,兼容所有 Java 项目,https://xuanyuan.cloud/r/library/amazoncorretto
- Eclipse Temurin:Eclipse 基金会维护,轻量适合容器环境,https://xuanyuan.cloud/r/library/eclipse-temurin
- IBM Semeru Runtimes:IBM 出品,内存占用低,适合微服务,https://xuanyuan.cloud/r/library/ibm-semeru-runtimes
- IBMJava:基于 OpenJ9 JVM,启动快,https://xuanyuan.cloud/r/library/ibmjava
- SapMachine:SAP 维护,企业级稳定性,https://xuanyuan.cloud/r/library/sapmachine
而 Docker Compose,你可以把它理解成「容器管家」——不用一个个启动 MySQL、Redis、业务服务,写个配置文件,告诉它要启动哪些容器、容器之间的关系,它就能按顺序一键启动,还能统一管理。
部署流程概览
整个部署分两大步,逻辑超清晰:
- 本地部署:先在自己电脑上把所有服务调通,确认没问题再上服务器,风险低、调试方便;
- 服务器部署:把本地调好的代码和配置同步到服务器,一键启动,完成线上部署。
每一步都有明确的目标,跟着做就行,不用自己瞎琢磨顺序。
第一阶段:本地部署(8 步搞定,新手也能一次过)
本地部署的核心是「把所有服务跑起来,验证功能正常」,我们以 电商基础场景 为例(包含用户、商品、订单核心服务),一步步操作:
1. 梳理服务部署表格:先把要部署的东西列清楚
部署前先列个清单,避免漏服务或搞混启动顺序。我们把服务分成「环境依赖」和「业务服务」两类——必须先启动环境依赖,再启动业务服务,不然会报“连接不上数据库”之类的错。表格中所有信息均与后续配置文件、命令严格对应,新手可直接复用。
| 服务名称 | 英文名 | 端口号 | 版本 / 镜像说明 | 服务类别 | 核心作用 | 轩辕镜像详情页 |
|---|---|---|---|---|---|---|
| 数据库 | mysql | 3306 | mysql:8 | 环境依赖 | 存储用户、商品、订单数据 | https://xuanyuan.cloud/r/library/mysql |
| 缓存服务 | redis | 6379 | redis:6 | 环境依赖 | 缓存热点数据(如商品详情) | https://xuanyuan.cloud/r/library/redis |
| 消息队列 | rabbitmq | 5672(通信)/15672(管理) | rabbitmq:3.12.6-management | 环境依赖 | 异步处理订单(如创建订单后发通知) | https://xuanyuan.cloud/r/library/rabbitmq |
| 注册中心 | nacos | 8848 | nacos/nacos-server:v2.2.0-slim | 环境依赖 | 服务注册与发现(管理业务服务) | https://xuanyuan.cloud/r/nacos/nacos-server |
| 网关服务 | mall-gateway | 8080 | 基于 Amazon Corretto:8-alpine 构建 | 业务服务 | 统一入口,路由请求到对应服务 | https://xuanyuan.cloud/r/library/amazoncorretto |
| 用户中心服务 | mall-user-service | 8081 | 基于 Amazon Corretto:8-alpine 构建 | 业务服务 | 处理用户注册、登录、信息管理 | https://xuanyuan.cloud/r/library/amazoncorretto |
| 商品管理服务 | mall-product-service | 8082 | 基于 Amazon Corretto:8-alpine 构建 | 业务服务 | 处理商品新增、查询、库存管理 | https://xuanyuan.cloud/r/library/amazoncorretto |
| 订单服务 | mall-order-service | 8083 | 基于 Amazon Corretto:8-alpine 构建 | 业务服务 | 处理订单创建、支付状态同步 | https://xuanyuan.cloud/r/library/amazoncorretto |
2. Docker 环境下打包:不用本地装 Maven,容器内搞定
微服务项目用 Maven 子父模块管理,不用一个个打包,用 Docker 容器就能一键打包所有服务,还不会污染本地环境。
先确认你的项目是子父模块结构(父模块 mall-parent 包含 mall-gateway、mall-user-service 等 4 个业务子模块),然后给 pom.xml 加好配置:
- 父模块(mall-parent)pom.xml:引入 spring-boot-maven-plugin,注意别加 configuration 和 repackage,统一管理插件版本:
<build> <pluginManagement> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.10</version> <!-- 与 Spring Boot 版本对应 --> </plugin> </plugins> </pluginManagement> </build> - 业务子模块(如 mall-user-service)pom.xml:加 repackage 配置,让依赖自动打入 jar 包,每个业务子模块都需添加:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
配置好后,打开终端进入项目根目录(mall-parent),执行下面的命令(用 Maven 容器打包,不用本地装 Maven):
# Windows 用户把 $(pwd)改成自己的项目路径,比如 /c/Users/xxx/mall-parent
docker run -v $(pwd):/app -w /app maven:3.8.1-jdk-8-slim mvn clean package -DskipTests
打包成功后,每个业务子模块的 target 目录里会出现 xxx.jar 文件(比如 mall-user-service-0.0.1-SNAPSHOT.jar),这就是我们要部署的应用包。
3. 编写 Dockerfile:给每个业务服务做「安装包」
Dockerfile 是构建镜像的说明书,告诉 Docker 怎么用 Amazon Corretto 基础镜像打包我们的业务服务。新手不用自己写,复制下面的模板,改改 jar 包名称和端口就行。
我们选「复制 jar 包版」(本地已经打好包,效率高),以「用户中心服务」为例,在 mall-user-service 目录下新建 Dockerfile,内容如下(所有业务服务的 Dockerfile 结构一致,仅需修改 jar 包名称和端口):
# 基础镜像:用轩辕加速的 Amazon Corretto(OpenJDK 替代方案,环境依赖)FROM xxx.xuanyuan.run/library/amazoncorretto:8-alpine
# 指定容器内的工作目录,后续命令都在此目录执行
WORKDIR /app
# 把本地 target 目录的 jar 包复制到容器的工作目录(jar 包名称要和自己的一致)ADD target/mall-user-service-0.0.1-SNAPSHOT.jar .
# 暴露服务端口(必须和服务配置的端口一致,用户中心服务是 8081)EXPOSE 8081
# 启动命令:指定生产环境配置文件(prod 配置需提前编写,后续步骤会讲)ENTRYPOINT ["java","-jar","/app/mall-user-service-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]
按同样的方式,给另外 3 个业务服务编写 Dockerfile:
- 网关服务(mall-gateway):修改 jar 包为
mall-gateway-0.0.1-SNAPSHOT.jar,端口为 8080; - 商品管理服务(mall-product-service):jar 包为
mall-product-service-0.0.1-SNAPSHOT.jar,端口 8082; - 订单服务(mall-order-service):jar 包为
mall-order-service-0.0.1-SNAPSHOT.jar,端口 8083。
写完后可以在 IDEA 里调试:右键 Dockerfile→Build Image,输入镜像名称(比如 mall-user-service),构建成功后启动容器,查看日志如果能看到 Spring 的图标,说明 Dockerfile 没问题。
4. 编写环境依赖配置:一键启动 MySQL、Redis 等服务
环境依赖(MySQL、Redis、RabbitMQ、Nacos)要单独配置,避免和业务服务一起启动时顺序混乱。在项目根目录(mall-parent)新建 docker-compose.env.yml 文件,内容如下(所有镜像都用轩辕加速地址,国内拉取超快,配置与服务表格严格对应):
version: '3'
services:
# MySQL 服务(对应表格中 "数据库" 服务)mysql:
image: xxx.xuanyuan.run/library/mysql:8 # 轩辕加速镜像,拉取速度快
container_name: mall-mysql # 容器名称,与服务名对应,好记
environment:
MYSQL_ROOT_PASSWORD: 123456 # 数据库密码,建议后续修改为复杂密码
MYSQL_DATABASE: mall_db # 自动创建业务数据库,无需手动建库
ports:
- "3306:3306" # 端口映射:本地 3306 ↔ 容器 3306(与表格端口一致)volumes:
- ./.mysql-data:/var/lib/mysql # 数据持久化:容器删除后数据不丢失
- ./mysql-init:/docker-entrypoint-initdb.d # 初始化脚本目录:启动时自动执行 SQL
restart: always # 容器崩溃后自动重启,提高稳定性
networks:
- mall-network # 加入自定义网络,确保与其他环境依赖互通
# Redis 服务(对应表格中 "缓存服务")redis:
image: xxx.xuanyuan.run/library/redis:6 # 轩辕加速镜像
container_name: mall-redis # 与表格服务名对应
ports:
- "6379:6379" # 端口映射(与表格一致)volumes:
- ./.redis-data:/data # 持久化缓存数据
command: redis-server --appendonly yes # 开启 AOF 持久化,防止缓存丢失
networks:
- mall-network
# RabbitMQ 服务(对应表格中 "消息队列")rabbitmq:
image: xxx.xuanyuan.run/library/rabbitmq:3.12.6-management # 带管理面板的镜像
container_name: mall-rabbitmq # 与表格服务名对应
environment:
RABBITMQ_DEFAULT_USER: guest # 默认账号(测试用,生产环境需修改)RABBITMQ_DEFAULT_PASS: guest # 默认密码
ports:
- "5672:5672" # 消息通信端口(与表格一致)- "15672:15672" # 管理面板端口(与表格一致)volumes:
- ./.rabbitmq-data:/var/lib/rabbitmq # 持久化消息数据
networks:
- mall-network
# Nacos 服务(对应表格中 "注册中心")nacos:
image: xxx.xuanyuan.run/library/nacos/nacos-server:v2.2.0-slim # 支持 arm64 架构,避免启动失败
container_name: mall-nacos # 与表格服务名对应
ports:
- "8848:8848" # 端口映射(与表格一致)volumes:
- ./.nacos-data:/home/nacos/data # 持久化服务注册信息
- ./.nacos-log:/home/nacos/logs # 日志持久化,方便排查问题
environment:
- MODE=standalone # 单节点模式:适合测试和小型生产环境
- PREFER_HOST_MODE=hostname # 支持主机名访问
- TZ=Asia/Shanghai # 时区配置:避免日志时间错乱
networks:
- mall-network
# 自定义网络:所有环境依赖在同一网络,确保互相访问无阻碍
networks:
mall-network:
关键准备步骤 :在项目根目录新建mysql-init 文件夹,里面放 init.sql 初始化脚本(创建业务表,以用户表为例),启动 MySQL 时会自动执行,无需手动建表:
-- 切换到业务数据库
USE mall_db;
-- 创建用户表(用户中心服务用)CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户 ID',
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '加密密码',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- 可继续添加商品表、订单表...
配置好后,执行下面的命令启动环境依赖:
docker compose -f docker-compose.env.yml up
启动后逐一验证(确保与表格中服务一致):
- MySQL:用 Navicat 连接
localhost:3306,账号 root,密码 123456,能看到mall_db数据库和user表就对了; - Redis:用 Redis 客户端连接
localhost:6379,执行set test 123能成功,说明正常; - RabbitMQ:浏览器打开
localhost:15672,账号密码都是 guest,能登录管理面板就行; - Nacos:浏览器打开
localhost:8848/nacos,账号密码都是 nacos,能进入控制台就没问题。
5. 编写业务服务配置:关联环境依赖,一键启动
环境依赖能正常运行后,编写业务服务的配置文件docker-compose.service.yml(放在项目根目录),配置与服务表格、环境依赖配置严格对应,确保服务间能正常通信:
version: '3'
services:
# 网关服务(对应表格中 "网关服务",先启动网关,作为统一入口)mall-gateway:
container_name: mall-gateway # 与表格服务名一致
build:
context: ./mall-gateway # 网关服务的根目录(含 Dockerfile)dockerfile: Dockerfile
ports:
- "8080:8080" # 端口映射(与表格一致)networks:
- mall-network # 与环境依赖用同一网络,确保能访问 MySQL 等服务
depends_on:
- nacos # 网关依赖注册中心,确保 Nacos 先启动
# 用户中心服务(对应表格中 "用户中心服务")mall-user-service:
container_name: mall-user-service # 与表格一致
build:
context: ./mall-user-service
dockerfile: Dockerfile
ports:
- "8081:8081" # 与表格端口一致
networks:
- mall-network
depends_on:
- mall-gateway # 依赖网关
- mysql # 依赖数据库
- redis # 依赖缓存
- nacos # 依赖注册中心
# 商品管理服务(对应表格中 "商品管理服务")mall-product-service:
container_name: mall-product-service # 与表格一致
build:
context: ./mall-product-service
dockerfile: Dockerfile
ports:
- "8082:8082" # 与表格端口一致
networks:
- mall-network
depends_on:
- mall-gateway
- mysql
- redis
- nacos
# 订单服务(对应表格中 "订单服务")mall-order-service:
container_name: mall-order-service # 与表格一致
build:
context: ./mall-order-service
dockerfile: Dockerfile
ports:
- "8083:8083" # 与表格端口一致
networks:
- mall-network
depends_on:
- mall-gateway
- mysql
- redis
- rabbitmq # 订单服务依赖消息队列
- nacos
# 与环境依赖共用同一网络,确保业务服务能访问所有环境依赖
networks:
mall-network:
这里的 depends_on 只是控制启动顺序,不会等服务完全就绪,所以一定要先确认环境依赖已经正常运行,再启动业务服务。
6. 调整程序配置:解决容器内访问问题
这是新手最容易踩的坑——本地用 localhost 能访问 MySQL,容器里就不行了!因为容器内的 localhost 指向容器本身,不是你的电脑,要把配置里的 localhost 改成 环境依赖的服务名 (比如 MySQL 的服务名是mysql,与docker-compose.env.yml 中的服务名一致)。
给每个业务服务新建src/main/resources/application-prod.yml(生产环境配置),配置与服务表格、环境依赖配置严格对应:
(1)用户中心服务(mall-user-service)配置
spring:
profiles: prod # 指定为生产环境配置
# 数据库配置(localhost 改成 mysql,与环境依赖服务名一致)datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql:3306/mall_db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123456 # 与 MySQL 的密码一致
# Redis 配置(localhost 改成 redis,与环境依赖服务名一致)redis:
host: redis
port: 6379 # 与表格中 Redis 端口一致
timeout: 5000 # 连接超时时间
# Nacos 注册中心配置(localhost 改成 nacos,与环境依赖服务名一致)cloud:
nacos:
discovery:
server-addr: nacos:8848 # 与表格中 Nacos 端口一致
service: mall-user-service # 服务名,与表格一致
application:
name: mall-user-service # 应用名,与服务名一致
server:
port: 8081 # 服务端口,与表格一致
(2)商品管理服务(mall-product-service)配置
仅需修改服务名和端口,其他与用户服务一致:
spring:
profiles: prod
datasource:
url: jdbc:mysql://mysql:3306/mall_db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123456
redis:
host: redis
port: 6379
cloud:
nacos:
discovery:
server-addr: nacos:8848
service: mall-product-service # 与表格服务名一致
application:
name: mall-product-service
server:
port: 8082 # 与表格一致
(3)订单服务(mall-order-service)配置
新增 RabbitMQ 配置(依赖消息队列),其他与上述服务一致:
spring:
profiles: prod
datasource:
url: jdbc:mysql://mysql:3306/mall_db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123456
redis:
host: redis
port: 6379
# RabbitMQ 配置(localhost 改成 rabbitmq,与环境依赖服务名一致)rabbitmq:
host: rabbitmq
port: 5672 # 与表格中 RabbitMQ 通信端口一致
username: guest
password: guest
cloud:
nacos:
discovery:
server-addr: nacos:8848
service: mall-order-service # 与表格服务名一致
application:
name: mall-order-service
server:
port: 8083 # 与表格一致
(4)网关服务(mall-gateway)配置
核心是路由配置,将请求转发到对应业务服务:
spring:
profiles: prod
cloud:
# Nacos 注册中心配置
nacos:
discovery:
server-addr: nacos:8848 # 与环境依赖服务名一致
# 网关路由配置(与业务服务名对应)gateway:
routes:
# 路由到用户中心服务
- id: mall-user-service
uri: lb://mall-user-service # 负载均衡指向用户服务
predicates:
- Path=/api/user/** # 匹配 /api/user 开头的请求
filters:
- StripPrefix=1 # 去掉 /api 前缀后转发
# 路由到商品管理服务
- id: mall-product-service
uri: lb://mall-product-service
predicates:
- Path=/api/product/**
filters:
- StripPrefix=1
# 路由到订单服务
- id: mall-order-service
uri: lb://mall-order-service
predicates:
- Path=/api/order/**
filters:
- StripPrefix=1
application:
name: mall-gateway # 与表格服务名一致
server:
port: 8080 # 与表格一致
# 开启网关 Swagger 文档支持(方便接口测试)knife4j:
gateway:
enabled: true
strategy: discover
discover:
enabled: true
version: swagger2
硬编码修复提醒 :如果代码里有硬编码的localhost(比如直接写factory.setHost("localhost") 连接 RabbitMQ),一定要改成从配置文件读取,示例:
@Slf4j
@Component
public class InitRabbitMqConfig {
// 从配置文件读取 RabbitMQ 地址,默认值 localhost(适配本地开发)@Value("${spring.rabbitmq.host:localhost}")
private String rabbitmqHost;
@PostConstruct
public void initExchangeAndQueue() {
try {ConnectionFactory factory = new ConnectionFactory();
factory.setHost(rabbitmqHost); // 用配置的地址,不是硬编码
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// 后续创建交换机、队列逻辑不变...
log.info("RabbitMQ 交换机和队列初始化成功");
} catch (Exception e) {log.error("RabbitMQ 初始化失败", e);
}
}
}
改完配置后,重新执行 Maven 打包命令,更新 jar 包:
docker run -v $(pwd):/app -w /app maven:3.8.1-jdk-8-slim mvn clean package -DskipTests
7. 本地启动业务服务并验证
确保环境依赖已经启动(后台运行的话不用管),执行下面的命令启动业务服务:
docker compose -f docker-compose.service.yml up
启动后,打开浏览器访问localhost:8080/doc.html(网关的 Swagger 文档地址),能看到用户、商品、订单三大类接口,说明启动成功了。
接下来测试核心业务流程(模拟用户下单):
- 用户注册 :调用
/api/user/register接口,传入username: testuser、password: 123456,返回成功; - 用户登录 :调用
/api/user/login接口,传入注册的账号密码,获取登录令牌(token); - 新增商品 :在请求头添加 token,调用
/api/product/add接口,传入商品名称、价格、库存,返回成功; - 创建订单 :请求头带 token,调用
/api/order/create接口,传入商品 ID 和数量,返回订单号; - 查询订单 :调用
/api/order/get接口,传入订单号,能查到订单详情。
所有接口都能正常调用,说明本地部署没问题了!
第二阶段:服务器部署(7 步搞定,和本地操作几乎一样)
本地调试通后,服务器部署就简单了,核心是把本地的代码、配置同步过去,一键启动。
1. 准备服务器:2 核 4G 就够了
选一台 Linux 服务器(推荐 CentOS 7.9 或 Ubuntu 20.04),配置不用太高, 2 核 4G 完全够用(后续会验证资源占用)。
先做两个关键准备工作:
- 开放端口:在云厂商控制台的「安全组」里,开放以下端口(与服务表格一致):8080-8083(业务服务)、3306(MySQL)、6379(Redis)、8848(Nacos)、15672(RabbitMQ),允许外部访问;
- 远程连接:用 Xshell 或 FinalShell 连接服务器,使用 root 账号登录(权限足够,操作方便)。
2. 服务器安装 Docker 环境:和本地一样一键搞定
登录服务器后,执行和本地相同的安装命令,一键安装 Docker 和 Docker Compose,自动配置轩辕镜像加速:
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
安装完成后,执行以下命令验证,确保环境可用:
docker --version # 输出 Docker 版本(如 Docker version 27.0.3)docker compose --version # 输出 Compose 版本(如 Docker Compose version v2.27.0)systemctl enable docker # 设置 Docker 开机自启,避免服务器重启后服务中断
systemctl status docker # 查看 Docker 运行状态,显示 "active (running)" 即为正常
3. 同步本地文件到服务器:新手用 IDEA 远程部署最省心
把本地调好的项目文件同步到服务器,推荐用 IDEA 的「远程部署」功能——自动同步本地修改,不用手动传文件,新手也能轻松操作:
步骤 1:配置 SFTP 连接
- 打开 IDEA,顶部菜单栏点击「Tools」→「Deployment」→「Configuration」;
- 点击左侧「+」号,选择「SFTP」,输入配置名称(比如“电商服务器”),点击「OK」;
- 填写服务器基础信息:
- 「Host」:输入服务器公网 IP(如 120.XX.XX.XX);
- 「Port」:默认 22(SSH 端口,未修改过无需改动);
- 「Username」:root(或自己的服务器账号,需有目录读写权限);
- 「Password」:输入服务器登录密码;
点击下方「Test Connection」,弹出“Successfully connected”说明连接成功。
步骤 2:配置路径映射(关键!避免文件放错位置)
- 切换到「Mappings」标签页;
- 「Local path」:选择本地项目根目录(如
D:\code\mall-parent,Windows 路径)或/Users/xxx/code/mall-parent(Mac/Linux 路径); - 「Deployment path」:输入服务器上的项目存放路径(如
/code/mall-parent,建议放在 /code 目录下,权限充足); - 「Web path」:留空即可(非 Web 项目无需配置);
- 勾选右上角「Automatic upload (always)」:本地修改文件后自动同步到服务器,避免手动重复上传。
步骤 3:首次同步本地文件
右键点击本地项目根目录(mall-parent)→「Deployment」→「Upload to 电商服务器」,IDEA 会自动将所有文件同步到服务器的 /code/mall-parent 目录。
同步完成后,在服务器终端执行命令验证:
ls /code/mall-parent # 能看到 docker-compose.env.yml、各服务目录即为同步成功
4. 服务器打包获取 jar 包:复用容器方案,不用装 Maven
和本地打包逻辑完全一致,服务器无需手动安装 Maven,直接用 Docker 容器打包,避免环境配置麻烦:
- 登录服务器后,先进入项目根目录:
cd /code/mall-parent - 执行容器打包命令(和本地命令完全相同):
docker run -v $(pwd):/app -w /app maven:3.8.1-jdk-8-slim mvn clean package -DskipTests打包过程会拉取 Maven 依赖(首次可能稍慢,后续会缓存),耐心等待至出现「BUILD SUCCESS」。 - 验证打包结果:
# 查看用户服务的 target 目录是否有 jar 包 ls /code/mall-parent/mall-user-service/target能看到mall-user-service-0.0.1-SNAPSHOT.jar即打包成功,其他业务服务同理。
5. 启动环境依赖服务:后台运行,稳定不中断
服务器部署需让服务在后台运行(关闭终端不停止),执行以下命令启动环境依赖:
cd /code/mall-parent
# 加 - d 参数实现后台启动
docker compose -f docker-compose.env.yml up -d
启动后执行「状态核查三连」,确保所有环境依赖正常运行:
- 查看容器运行状态:
docker ps # 能看到 mall-mysql、mall-redis、mall-rabbitmq、mall-nacos 均为 "Up" 状态 - 若某容器未启动,查看日志排查问题:
docker logs -f 容器名 # 如 docker logs -f mall-nacos,查看报错信息 - 验证 Nacos 注册中心:
浏览器访问http:// 服务器公网 IP:8848/nacos,登录后进入「服务管理→服务列表」,此时暂无业务服务注册(正常,后续启动业务服务后会自动注册)。
6. 启动业务服务并验证:公网访问测试
环境依赖确认正常后,启动业务服务,同样用后台启动模式:
cd /code/mall-parent
docker compose -f docker-compose.service.yml up -d
关键验证步骤(公网访问)
- 服务注册验证 :
刷新 Nacos 控制台的「服务列表」,能看到mall-gateway、mall-user-service等 4 个业务服务,状态为「健康」,说明服务注册成功。 - 接口功能验证 :
浏览器打开http:// 服务器公网 IP:8080/doc.html(网关 Swagger 地址),重复本地的核心业务流程测试:- 调用
/api/user/register注册用户; - 调用
/api/user/login获取 token; - 调用
/api/product/add新增商品; - 调用
/api/order/create创建订单;
所有接口返回「成功」状态,说明服务器部署完全可用!
- 调用
常见失败排查
- 接口无法访问:先检查服务器安全组是否开放 8080 端口,再执行
docker logs -f mall-gateway查看网关日志; - 服务注册失败:检查 Nacos 地址配置是否为
nacos:8848,执行docker network ls确认业务服务和环境依赖在同一mall-network网络。
7. 新手必备运维操作:服务器环境特供版
服务器部署后需要基础运维能力,整理 6 个高频命令,新手直接复制使用:
- 查看服务资源占用(确认 2 核 4G 是否够用):
docker stats # 实时显示 CPU、内存占用,总内存占用约 2.5-3G,完全够用 - 设置服务开机自启(服务器重启后自动恢复服务):
# 给环境依赖和业务服务的容器添加开机自启 docker update --restart=always mall-mysql mall-redis mall-rabbitmq mall-nacos docker update --restart=always mall-gateway mall-user-service mall-product-service mall-order-service - 重启单个服务(如用户服务故障):
docker restart mall-user-service - 查看服务日志(排查接口报错):
# 查看订单服务最新 100 行日志,实时刷新 docker logs -f --tail 100 mall-order-service - 批量停止所有服务(如服务器维护):
docker compose -f docker-compose.service.yml down docker compose -f docker-compose.env.yml down - 清理无用镜像(释放服务器磁盘空间):
# 删除所有未使用的镜像(谨慎操作,确保无用后执行)docker image prune -a -f
结尾:部署完成!这些坑新手一定要记牢
至此,2 核 4G 服务器上的电商微服务集群已经部署完成——从 Docker 环境搭建到公网接口可用,全程没有复杂配置,核心就是「本地调通再上服务器,配置保持一致」。最后再划 3 个避坑重点,帮你少走弯路:
- 环境依赖≠业务服务:Amazon Corretto 是基础镜像(环境依赖),用来打包网关、用户服务等业务服务,千万别混淆;
- 容器内访问用“服务名”:localhost 只在本地生效,容器内必须用
mysql、redis等服务名访问依赖,这是新手最常踩的坑; - 服务器先开安全组:所有端口(8080-8083、3306 等)必须在云厂商控制台开放,否则公网根本访问不到。
如果在操作中遇到具体问题,比如容器启动失败、接口调用报错,欢迎在评论区留言,我会逐一回复解决。觉得这篇教程有用的话,点赞收藏再走,后续还会更新「微服务日志收集」「服务监控搭建」等进阶内容,助力新手从小白变运维高手!
版权声明:本文为原创保姆级教程,禁止未经授权的商用转载,欢迎个人学习转发,转载请注明出处。







很久没更新了。
大佬,不知道过了这么久这个脚本还有没有在…
被投诉下线了。
点了那个链接?
被投诉下线了。
https://idea.hacks.t…