Docker 部署微服務項目保姆級教程
簡介
這是一篇專門寫給編程新手的微服務部署全流程教程,不用糾結(jié)復雜概念,不用怕踩網(wǎng)絡或環(huán)境坑。我們從Docker環(huán)境一鍵搭建開始,用軒轅鏡像解決國內(nèi)拉取鏡像慢的問題,避開OpenJDK棄用的雷區(qū),全程手把手帶你完成「本地調(diào)試→服務器部署」,哪怕是2核4G的低配服務器,也能順利跑通包含MySQL、Redis、Nacos和4個電商場景業(yè)務服務的微服務項目。
前置準備:Docker及Docker Compose環(huán)境搭建
剛接觸微服務部署的同學,千萬別上來就懟服務器——先把本地Docker環(huán)境搞定,后續(xù)操作會少走90%的坑。而且這一步超級簡單,用腳本一鍵就能完成。
為什么選Docker部署微服務?
傳統(tǒng)部署微服務太折磨人了:要手動裝MySQL、Redis這些依賴,版本不對還會沖突;本地跑的好好的,一上服務器就報錯;啟動服務要敲一堆命令,忘了順序還得重來。而Docker能一次性解決這些問題:
- 環(huán)境一致:把應用和依賴打包成「鏡像」,就像帶配置的安裝包,本地、服務器跑起來完全一樣;
- 隔離安全:每個服務跑在獨立容器里,不會互相干擾,也不用擔心影響主機環(huán)境;
- 操作簡單:用Docker Compose寫個配置文件,一行命令就能啟動所有服務;
- 迭代方便:更新版本只需拉新鏡像,出問題回滾也快;
- 資源夠省:容器啟動秒級響應,2核4G服務器跑一套微服務完全夠用。
一鍵安裝Docker及Docker Compose
不管你用的是Linux、Mac還是Windows(需開啟WSL2),復制下面的命令到終端,回車就能自動安裝,還會配置好軒轅鏡像加速,不用手動調(diào)配置:
# 直接復制到終端執(zhí)行,Linux/Mac/WSL2通用
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
安裝完成后,一定要驗證一下環(huán)境是否可用,輸入兩個命令:
docker --version # 能看到版本號(比如Docker version 27.0.3)就對了
docker compose --version # 輸出類似Docker Compose version v2.27.0即可
如果是Windows或Mac用戶,想更直觀地管理容器,也可以裝Docker Desktop(官網(wǎng)直接搜就能下載),安裝后會自動關(guān)聯(lián)本地Docker環(huán)境,圖形化界面能看到容器啟動狀態(tài),新手友好度拉滿。
Maven安裝說明(本地/服務器雙方案)
打包微服務需要Maven環(huán)境,這里提供「容器免安裝」和「手動安裝」兩種方案,新手優(yōu)先選容器方案(無需配置環(huán)境變量,直接可用)。
方案1:Docker容器方案(推薦新手,免安裝)
無需手動安裝Maven,直接使用官方Maven鏡像運行打包命令,容器退出后不殘留環(huán)境,命令如下(后續(xù)打包會直接用此方式):
# 格式: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官網(wǎng),下載對應系統(tǒng)的壓縮包(如Linux選apache-maven-3.8.8-bin.tar.gz);
- 解壓安裝:
- Linux/Mac:終端執(zhí)行
tar -zxvf apache-maven-3.8.8-bin.tar.gz -C /usr/local/; - Windows:右鍵解壓到指定目錄(如D:\apache-maven-3.8.8);
- Linux/Mac:終端執(zhí)行
- 配置環(huán)境變量:
- Linux/Mac:編輯
/etc/profile,添加export MAVEN_HOME=/usr/local/apache-maven-3.8.8和export PATH=$MAVEN_HOME/bin:$PATH,執(zhí)行source /etc/profile生效; - Windows:右鍵「此電腦」→屬性→高級系統(tǒng)設(shè)置→環(huán)境變量,新增MAVEN_HOME變量(值為解壓路徑),在Path中添加
%MAVEN_HOME%\bin;
- Linux/Mac:編輯
- 驗證安裝:終端執(zhí)行
mvn -v,能看到Maven版本信息即成功。
核心概念:不用死記,理解就行
剛接觸Docker的同學,不用糾結(jié)復雜術(shù)語,記住兩個核心東西,后續(xù)操作就順了:
- 鏡像:相當于「帶環(huán)境的安裝包」,包含了應用運行需要的所有東西(如JDK、MySQL程序),我們從鏡像倉庫拉取后就能用;
- 容器:鏡像運行起來后的實例,就像裝好了軟件的虛擬機,能啟動、停止、刪除,刪除后數(shù)據(jù)不會殘留(除非配置了持久化)。
這里有個關(guān)鍵提醒:很多教程里用的OpenJDK鏡像已經(jīng)被棄用了,繼續(xù)用會出兼容性問題!給大家整理了5個官方推薦的替代鏡像,新手優(yōu)先選Amazon Corretto,體積小、適配性強,每個鏡像都能在軒轅鏡像平臺查到詳細用法(Amazon Corretto是構(gòu)建業(yè)務服務的基礎(chǔ)鏡像,屬于環(huán)境依賴范疇,并非業(yè)務服務本身):
- Amazon Corretto(推薦):AWS官方維護,兼容所有Java項目,https://xuanyuan.cloud/r/library/amazoncorretto
- Eclipse Temurin:Eclipse基金會維護,輕量適合容器環(huán)境,https://xuanyuan.cloud/r/library/eclipse-temurin
- IBM Semeru Runtimes:IBM出品,內(nèi)存占用低,適合微服務,https://xuanyuan.cloud/r/library/ibm-semeru-runtimes
- IBMJava:基于OpenJ9 JVM,啟動快,https://xuanyuan.cloud/r/library/ibmjava
- SapMachine:SAP維護,企業(yè)級穩(wěn)定性,https://xuanyuan.cloud/r/library/sapmachine
而Docker Compose,你可以把它理解成「容器管家」——不用一個個啟動MySQL、Redis、業(yè)務服務,寫個配置文件,告訴它要啟動哪些容器、容器之間的關(guān)系,它就能按順序一鍵啟動,還能統(tǒng)一管理。
部署流程概覽
整個部署分兩大步,邏輯超清晰:
- 本地部署:先在自己電腦上把所有服務調(diào)通,確認沒問題再上服務器,風險低、調(diào)試方便;
- 服務器部署:把本地調(diào)好的代碼和配置同步到服務器,一鍵啟動,完成線上部署。
每一步都有明確的目標,跟著做就行,不用自己瞎琢磨順序。
第一階段:本地部署(8步搞定,新手也能一次過)
本地部署的核心是「把所有服務跑起來,驗證功能正常」,我們以電商基礎(chǔ)場景為例(包含用戶、商品、訂單核心服務),一步步操作:
1. 梳理服務部署表格:先把要部署的東西列清楚
部署前先列個清單,避免漏服務或搞混啟動順序。我們把服務分成「環(huán)境依賴」和「業(yè)務服務」兩類——必須先啟動環(huán)境依賴,再啟動業(yè)務服務,不然會報“連接不上數(shù)據(jù)庫”之類的錯。表格中所有信息均與后續(xù)配置文件、命令嚴格對應,新手可直接復用。
| 服務名稱 | 英文名 | 端口號 | 版本/鏡像說明 | 服務類別 | 核心作用 | 軒轅鏡像詳情頁 |
|---|---|---|---|---|---|---|
| 數(shù)據(jù)庫 | mysql | 3306 | mysql:8 | 環(huán)境依賴 | 存儲用戶、商品、訂單數(shù)據(jù) | https://xuanyuan.cloud/r/library/mysql |
| 緩存服務 | redis | 6379 | redis:6 | 環(huán)境依賴 | 緩存熱點數(shù)據(jù)(如商品詳情) | https://xuanyuan.cloud/r/library/redis |
| 消息隊列 | rabbitmq | 5672(通信)/15672(管理) | rabbitmq:3.12.6-management | 環(huán)境依賴 | 異步處理訂單(如創(chuàng)建訂單后發(fā)通知) | https://xuanyuan.cloud/r/library/rabbitmq |
| 注冊中心 | nacos | 8848 | nacos/nacos-server:v2.2.0-slim | 環(huán)境依賴 | 服務注冊與發(fā)現(xiàn)(管理業(yè)務服務) | https://xuanyuan.cloud/r/nacos/nacos-server |
| 網(wǎng)關(guān)服務 | mall-gateway | 8080 | 基于Amazon Corretto:8-alpine構(gòu)建 | 業(yè)務服務 | 統(tǒng)一入口,路由請求到對應服務 | https://xuanyuan.cloud/r/library/amazoncorretto |
| 用戶中心服務 | mall-user-service | 8081 | 基于Amazon Corretto:8-alpine構(gòu)建 | 業(yè)務服務 | 處理用戶注冊、登錄、信息管理 | https://xuanyuan.cloud/r/library/amazoncorretto |
| 商品管理服務 | mall-product-service | 8082 | 基于Amazon Corretto:8-alpine構(gòu)建 | 業(yè)務服務 | 處理商品新增、查詢、庫存管理 | https://xuanyuan.cloud/r/library/amazoncorretto |
| 訂單服務 | mall-order-service | 8083 | 基于Amazon Corretto:8-alpine構(gòu)建 | 業(yè)務服務 | 處理訂單創(chuàng)建、支付狀態(tài)同步 | https://xuanyuan.cloud/r/library/amazoncorretto |
2. Docker環(huán)境下打包:不用本地裝Maven,容器內(nèi)搞定
微服務項目用Maven子父模塊管理,不用一個個打包,用Docker容器就能一鍵打包所有服務,還不會污染本地環(huán)境。
先確認你的項目是子父模塊結(jié)構(gòu)(父模塊mall-parent包含mall-gateway、mall-user-service等4個業(yè)務子模塊),然后給pom.xml加好配置:
- 父模塊(mall-parent)pom.xml:引入spring-boot-maven-plugin,注意別加configuration和repackage,統(tǒng)一管理插件版本:
<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> - 業(yè)務子模塊(如mall-user-service)pom.xml:加repackage配置,讓依賴自動打入jar包,每個業(yè)務子模塊都需添加:
<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),執(zhí)行下面的命令(用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
打包成功后,每個業(yè)務子模塊的target目錄里會出現(xiàn)xxx.jar文件(比如mall-user-service-0.0.1-SNAPSHOT.jar),這就是我們要部署的應用包。
3. 編寫Dockerfile:給每個業(yè)務服務做「安裝包」
Dockerfile是構(gòu)建鏡像的說明書,告訴Docker怎么用Amazon Corretto基礎(chǔ)鏡像打包我們的業(yè)務服務。新手不用自己寫,復制下面的模板,改改jar包名稱和端口就行。
我們選「復制jar包版」(本地已經(jīng)打好包,效率高),以「用戶中心服務」為例,在mall-user-service目錄下新建Dockerfile,內(nèi)容如下(所有業(yè)務服務的Dockerfile結(jié)構(gòu)一致,僅需修改jar包名稱和端口):
# 基礎(chǔ)鏡像:用軒轅加速的Amazon Corretto(OpenJDK替代方案,環(huán)境依賴)
FROM xxx.xuanyuan.run/library/amazoncorretto:8-alpine
# 指定容器內(nèi)的工作目錄,后續(xù)命令都在此目錄執(zhí)行
WORKDIR /app
# 把本地target目錄的jar包復制到容器的工作目錄(jar包名稱要和自己的一致)
ADD target/mall-user-service-0.0.1-SNAPSHOT.jar .
# 暴露服務端口(必須和服務配置的端口一致,用戶中心服務是8081)
EXPOSE 8081
# 啟動命令:指定生產(chǎn)環(huán)境配置文件(prod配置需提前編寫,后續(xù)步驟會講)
ENTRYPOINT ["java","-jar","/app/mall-user-service-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]
按同樣的方式,給另外3個業(yè)務服務編寫Dockerfile:
- 網(wǎng)關(guān)服務(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里調(diào)試:右鍵Dockerfile→Build Image,輸入鏡像名稱(比如mall-user-service),構(gòu)建成功后啟動容器,查看日志如果能看到Spring的圖標,說明Dockerfile沒問題。
4. 編寫環(huán)境依賴配置:一鍵啟動MySQL、Redis等服務
環(huán)境依賴(MySQL、Redis、RabbitMQ、Nacos)要單獨配置,避免和業(yè)務服務一起啟動時順序混亂。在項目根目錄(mall-parent)新建docker-compose.env.yml文件,內(nèi)容如下(所有鏡像都用軒轅加速地址,國內(nèi)拉取超快,配置與服務表格嚴格對應):
version: '3'
services:
# MySQL服務(對應表格中"數(shù)據(jù)庫"服務)
mysql:
image: xxx.xuanyuan.run/library/mysql:8 # 軒轅加速鏡像,拉取速度快
container_name: mall-mysql # 容器名稱,與服務名對應,好記
environment:
MYSQL_ROOT_PASSWORD: 123456 # 數(shù)據(jù)庫密碼,建議后續(xù)修改為復雜密碼
MYSQL_DATABASE: mall_db # 自動創(chuàng)建業(yè)務數(shù)據(jù)庫,無需手動建庫
ports:
- "3306:3306" # 端口映射:本地3306 ? 容器3306(與表格端口一致)
volumes:
- ./.mysql-data:/var/lib/mysql # 數(shù)據(jù)持久化:容器刪除后數(shù)據(jù)不丟失
- ./mysql-init:/docker-entrypoint-initdb.d # 初始化腳本目錄:啟動時自動執(zhí)行SQL
restart: always # 容器崩潰后自動重啟,提高穩(wěn)定性
networks:
- mall-network # 加入自定義網(wǎng)絡,確保與其他環(huán)境依賴互通
# Redis服務(對應表格中"緩存服務")
redis:
image: xxx.xuanyuan.run/library/redis:6 # 軒轅加速鏡像
container_name: mall-redis # 與表格服務名對應
ports:
- "6379:6379" # 端口映射(與表格一致)
volumes:
- ./.redis-data:/data # 持久化緩存數(shù)據(jù)
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 # 默認賬號(測試用,生產(chǎn)環(huán)境需修改)
RABBITMQ_DEFAULT_PASS: guest # 默認密碼
ports:
- "5672:5672" # 消息通信端口(與表格一致)
- "15672:15672" # 管理面板端口(與表格一致)
volumes:
- ./.rabbitmq-data:/var/lib/rabbitmq # 持久化消息數(shù)據(jù)
networks:
- mall-network
# Nacos服務(對應表格中"注冊中心")
nacos:
image: xxx.xuanyuan.run/library/nacos/nacos-server:v2.2.0-slim # 支持arm64架構(gòu),避免啟動失敗
container_name: mall-nacos # 與表格服務名對應
ports:
- "8848:8848" # 端口映射(與表格一致)
volumes:
- ./.nacos-data:/home/nacos/data # 持久化服務注冊信息
- ./.nacos-log:/home/nacos/logs # 日志持久化,方便排查問題
environment:
- MODE=standalone # 單節(jié)點模式:適合測試和小型生產(chǎn)環(huán)境
- PREFER_HOST_MODE=hostname # 支持主機名訪問
- TZ=Asia/Shanghai # 時區(qū)配置:避免日志時間錯亂
networks:
- mall-network
# 自定義網(wǎng)絡:所有環(huán)境依賴在同一網(wǎng)絡,確保互相訪問無阻礙
networks:
mall-network:
關(guān)鍵準備步驟:在項目根目錄新建mysql-init文件夾,里面放init.sql初始化腳本(創(chuàng)建業(yè)務表,以用戶表為例),啟動MySQL時會自動執(zhí)行,無需手動建表:
-- 切換到業(yè)務數(shù)據(jù)庫
USE mall_db;
-- 創(chuàng)建用戶表(用戶中心服務用)
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 '創(chuàng)建時間',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用戶表';
-- 可繼續(xù)添加商品表、訂單表...
配置好后,執(zhí)行下面的命令啟動環(huán)境依賴:
docker compose -f docker-compose.env.yml up
啟動后逐一驗證(確保與表格中服務一致):
- MySQL:用Navicat連接
localhost:3306,賬號root,密碼123456,能看到mall_db數(shù)據(jù)庫和user表就對了; - Redis:用Redis客戶端連接
localhost:6379,執(zhí)行set test 123能成功,說明正常; - RabbitMQ:瀏覽器打開
localhost:15672,賬號密碼都是guest,能登錄管理面板就行; - Nacos:瀏覽器打開
localhost:8848/nacos,賬號密碼都是nacos,能進入控制臺就沒問題。
5. 編寫業(yè)務服務配置:關(guān)聯(lián)環(huán)境依賴,一鍵啟動
環(huán)境依賴能正常運行后,編寫業(yè)務服務的配置文件docker-compose.service.yml(放在項目根目錄),配置與服務表格、環(huán)境依賴配置嚴格對應,確保服務間能正常通信:
version: '3'
services:
# 網(wǎng)關(guān)服務(對應表格中"網(wǎng)關(guān)服務",先啟動網(wǎng)關(guān),作為統(tǒng)一入口)
mall-gateway:
container_name: mall-gateway # 與表格服務名一致
build:
context: ./mall-gateway # 網(wǎng)關(guān)服務的根目錄(含Dockerfile)
dockerfile: Dockerfile
ports:
- "8080:8080" # 端口映射(與表格一致)
networks:
- mall-network # 與環(huán)境依賴用同一網(wǎng)絡,確保能訪問MySQL等服務
depends_on:
- nacos # 網(wǎng)關(guān)依賴注冊中心,確保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 # 依賴網(wǎng)關(guān)
- mysql # 依賴數(shù)據(jù)庫
- 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
# 與環(huán)境依賴共用同一網(wǎng)絡,確保業(yè)務服務能訪問所有環(huán)境依賴
networks:
mall-network:
這里的depends_on只是控制啟動順序,不會等服務完全就緒,所以一定要先確認環(huán)境依賴已經(jīng)正常運行,再啟動業(yè)務服務。
6. 調(diào)整程序配置:解決容器內(nèi)訪問問題
這是新手最容易踩的坑——本地用localhost能訪問MySQL,容器里就不行了!因為容器內(nèi)的localhost指向容器本身,不是你的電腦,要把配置里的localhost改成環(huán)境依賴的服務名(比如MySQL的服務名是mysql,與docker-compose.env.yml中的服務名一致)。
給每個業(yè)務服務新建src/main/resources/application-prod.yml(生產(chǎn)環(huán)境配置),配置與服務表格、環(huán)境依賴配置嚴格對應:
(1)用戶中心服務(mall-user-service)配置
spring:
profiles: prod # 指定為生產(chǎn)環(huán)境配置
# 數(shù)據(jù)庫配置(localhost改成mysql,與環(huán)境依賴服務名一致)
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,與環(huán)境依賴服務名一致)
redis:
host: redis
port: 6379 # 與表格中Redis端口一致
timeout: 5000 # 連接超時時間
# Nacos注冊中心配置(localhost改成nacos,與環(huán)境依賴服務名一致)
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,與環(huán)境依賴服務名一致)
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)網(wǎng)關(guān)服務(mall-gateway)配置
核心是路由配置,將請求轉(zhuǎn)發(fā)到對應業(yè)務服務:
spring:
profiles: prod
cloud:
# Nacos注冊中心配置
nacos:
discovery:
server-addr: nacos:8848 # 與環(huán)境依賴服務名一致
# 網(wǎng)關(guān)路由配置(與業(yè)務服務名對應)
gateway:
routes:
# 路由到用戶中心服務
- id: mall-user-service
uri: lb://mall-user-service # 負載均衡指向用戶服務
predicates:
- Path=/api/user/** # 匹配/api/user開頭的請求
filters:
- StripPrefix=1 # 去掉/api前綴后轉(zhuǎn)發(fā)
# 路由到商品管理服務
- 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 # 與表格一致
# 開啟網(wǎng)關(guān)Swagger文檔支持(方便接口測試)
knife4j:
gateway:
enabled: true
strategy: discover
discover:
enabled: true
version: swagger2
硬編碼修復提醒:如果代碼里有硬編碼的localhost(比如直接寫factory.setHost("localhost")連接RabbitMQ),一定要改成從配置文件讀取,示例:
@Slf4j
@Component
public class InitRabbitMqConfig {
// 從配置文件讀取RabbitMQ地址,默認值localhost(適配本地開發(fā))
@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();
// 后續(xù)創(chuàng)建交換機、隊列邏輯不變...
log.info("RabbitMQ交換機和隊列初始化成功");
} catch (Exception e) {
log.error("RabbitMQ初始化失敗", e);
}
}
}
改完配置后,重新執(zhí)行Maven打包命令,更新jar包:
docker run -v $(pwd):/app -w /app maven:3.8.1-jdk-8-slim mvn clean package -DskipTests
7. 本地啟動業(yè)務服務并驗證
確保環(huán)境依賴已經(jīng)啟動(后臺運行的話不用管),執(zhí)行下面的命令啟動業(yè)務服務:
docker compose -f docker-compose.service.yml up
啟動后,打開瀏覽器訪問localhost:8080/doc.html(網(wǎng)關(guān)的Swagger文檔地址),能看到用戶、商品、訂單三大類接口,說明啟動成功了。
接下來測試核心業(yè)務流程(模擬用戶下單):
- 用戶注冊:調(diào)用
/api/user/register接口,傳入username: testuser、password: 123456,返回成功; - 用戶登錄:調(diào)用
/api/user/login接口,傳入注冊的賬號密碼,獲取登錄令牌(token); - 新增商品:在請求頭添加token,調(diào)用
/api/product/add接口,傳入商品名稱、價格、庫存,返回成功; - 創(chuàng)建訂單:請求頭帶token,調(diào)用
/api/order/create接口,傳入商品ID和數(shù)量,返回訂單號; - 查詢訂單:調(diào)用
/api/order/get接口,傳入訂單號,能查到訂單詳情。
所有接口都能正常調(diào)用,說明本地部署沒問題了!
第二階段:服務器部署(7步搞定,和本地操作幾乎一樣)
本地調(diào)試通后,服務器部署就簡單了,核心是把本地的代碼、配置同步過去,一鍵啟動。
1. 準備服務器:2核4G就夠了
選一臺Linux服務器(推薦CentOS 7.9或Ubuntu 20.04),配置不用太高,2核4G完全夠用(后續(xù)會驗證資源占用)。
先做兩個關(guān)鍵準備工作:
- 開放端口:在云廠商控制臺的「安全組」里,開放以下端口(與服務表格一致):8080-8083(業(yè)務服務)、3306(MySQL)、6379(Redis)、8848(Nacos)、15672(RabbitMQ),允許外部訪問;
- 遠程連接:用Xshell或FinalShell連接服務器,使用root賬號登錄(權(quán)限足夠,操作方便)。
2. 服務器安裝Docker環(huán)境:和本地一樣一鍵搞定
登錄服務器后,執(zhí)行和本地相同的安裝命令,一鍵安裝Docker和Docker Compose,自動配置軒轅鏡像加速:
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
安裝完成后,執(zhí)行以下命令驗證,確保環(huán)境可用:
docker --version # 輸出Docker版本(如Docker version 27.0.3)
docker compose --version # 輸出Compose版本(如Docker Compose version v2.27.0)
systemctl enable docker # 設(shè)置Docker開機自啟,避免服務器重啟后服務中斷
systemctl status docker # 查看Docker運行狀態(tài),顯示"active (running)"即為正常
3. 同步本地文件到服務器:新手用IDEA遠程部署最省心
把本地調(diào)好的項目文件同步到服務器,推薦用IDEA的「遠程部署」功能——自動同步本地修改,不用手動傳文件,新手也能輕松操作:
步驟1:配置SFTP連接
- 打開IDEA,頂部菜單欄點擊「Tools」→「Deployment」→「Configuration」;
- 點擊左側(cè)「+」號,選擇「SFTP」,輸入配置名稱(比如“電商服務器”),點擊「OK」;
- 填寫服務器基礎(chǔ)信息:
- 「Host」:輸入服務器公網(wǎng)IP(如120.XX.XX.XX);
- 「Port」:默認22(SSH端口,未修改過無需改動);
- 「Username」:root(或自己的服務器賬號,需有目錄讀寫權(quán)限);
- 「Password」:輸入服務器登錄密碼;
點擊下方「Test Connection」,彈出“Successfully connected”說明連接成功。
步驟2:配置路徑映射(關(guān)鍵!避免文件放錯位置)
- 切換到「Mappings」標簽頁;
- 「Local path」:選擇本地項目根目錄(如
D:\code\mall-parent,Windows路徑)或/Users/xxx/code/mall-parent(Mac/Linux路徑); - 「Deployment path」:輸入服務器上的項目存放路徑(如
/code/mall-parent,建議放在/code目錄下,權(quán)限充足); - 「Web path」:留空即可(非Web項目無需配置);
- 勾選右上角「Automatic upload (always)」:本地修改文件后自動同步到服務器,避免手動重復上傳。
步驟3:首次同步本地文件
右鍵點擊本地項目根目錄(mall-parent)→「Deployment」→「Upload to 電商服務器」,IDEA會自動將所有文件同步到服務器的/code/mall-parent目錄。
同步完成后,在服務器終端執(zhí)行命令驗證:
ls /code/mall-parent # 能看到docker-compose.env.yml、各服務目錄即為同步成功
4. 服務器打包獲取jar包:復用容器方案,不用裝Maven
和本地打包邏輯完全一致,服務器無需手動安裝Maven,直接用Docker容器打包,避免環(huán)境配置麻煩:
- 登錄服務器后,先進入項目根目錄:
cd /code/mall-parent - 執(zhí)行容器打包命令(和本地命令完全相同):
打包過程會拉取Maven依賴(首次可能稍慢,后續(xù)會緩存),耐心等待至出現(xiàn)「BUILD SUCCESS」。docker run -v $(pwd):/app -w /app maven:3.8.1-jdk-8-slim mvn clean package -DskipTests - 驗證打包結(jié)果:
能看到# 查看用戶服務的target目錄是否有jar包 ls /code/mall-parent/mall-user-service/targetmall-user-service-0.0.1-SNAPSHOT.jar即打包成功,其他業(yè)務服務同理。
5. 啟動環(huán)境依賴服務:后臺運行,穩(wěn)定不中斷
服務器部署需讓服務在后臺運行(關(guān)閉終端不停止),執(zhí)行以下命令啟動環(huán)境依賴:
cd /code/mall-parent
# 加-d參數(shù)實現(xiàn)后臺啟動
docker compose -f docker-compose.env.yml up -d
啟動后執(zhí)行「狀態(tài)核查三連」,確保所有環(huán)境依賴正常運行:
- 查看容器運行狀態(tài):
docker ps # 能看到mall-mysql、mall-redis、mall-rabbitmq、mall-nacos均為"Up"狀態(tài) - 若某容器未啟動,查看日志排查問題:
docker logs -f 容器名 # 如docker logs -f mall-nacos,查看報錯信息 - 驗證Nacos注冊中心:
瀏覽器訪問http://服務器公網(wǎng)IP:8848/nacos,登錄后進入「服務管理→服務列表」,此時暫無業(yè)務服務注冊(正常,后續(xù)啟動業(yè)務服務后會自動注冊)。
6. 啟動業(yè)務服務并驗證:公網(wǎng)訪問測試
環(huán)境依賴確認正常后,啟動業(yè)務服務,同樣用后臺啟動模式:
cd /code/mall-parent
docker compose -f docker-compose.service.yml up -d
關(guān)鍵驗證步驟(公網(wǎng)訪問)
- 服務注冊驗證:
刷新Nacos控制臺的「服務列表」,能看到mall-gateway、mall-user-service等4個業(yè)務服務,狀態(tài)為「健康」,說明服務注冊成功。 - 接口功能驗證:
瀏覽器打開http://服務器公網(wǎng)IP:8080/doc.html(網(wǎng)關(guān)Swagger地址),重復本地的核心業(yè)務流程測試:- 調(diào)用
/api/user/register注冊用戶; - 調(diào)用
/api/user/login獲取token; - 調(diào)用
/api/product/add新增商品; - 調(diào)用
/api/order/create創(chuàng)建訂單;
所有接口返回「成功」狀態(tài),說明服務器部署完全可用!
- 調(diào)用
常見失敗排查
- 接口無法訪問:先檢查服務器安全組是否開放8080端口,再執(zhí)行
docker logs -f mall-gateway查看網(wǎng)關(guān)日志; - 服務注冊失敗:檢查Nacos地址配置是否為
nacos:8848,執(zhí)行docker network ls確認業(yè)務服務和環(huán)境依賴在同一mall-network網(wǎng)絡。
7. 新手必備運維操作:服務器環(huán)境特供版
服務器部署后需要基礎(chǔ)運維能力,整理6個高頻命令,新手直接復制使用:
- 查看服務資源占用(確認2核4G是否夠用):
docker stats # 實時顯示CPU、內(nèi)存占用,總內(nèi)存占用約2.5-3G,完全夠用 - 設(shè)置服務開機自啟(服務器重啟后自動恢復服務):
# 給環(huán)境依賴和業(yè)務服務的容器添加開機自啟 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 - 清理無用鏡像(釋放服務器磁盤空間):
# 刪除所有未使用的鏡像(謹慎操作,確保無用后執(zhí)行) docker image prune -a -f
結(jié)尾:部署完成!這些坑新手一定要記牢
至此,2核4G服務器上的電商微服務集群已經(jīng)部署完成——從Docker環(huán)境搭建到公網(wǎng)接口可用,全程沒有復雜配置,核心就是「本地調(diào)通再上服務器,配置保持一致」。最后再劃3個避坑重點,幫你少走彎路:
- 環(huán)境依賴≠業(yè)務服務:Amazon Corretto是基礎(chǔ)鏡像(環(huán)境依賴),用來打包網(wǎng)關(guān)、用戶服務等業(yè)務服務,千萬別混淆;
- 容器內(nèi)訪問用“服務名”:localhost只在本地生效,容器內(nèi)必須用
mysql、redis等服務名訪問依賴,這是新手最常踩的坑; - 服務器先開安全組:所有端口(8080-8083、3306等)必須在云廠商控制臺開放,否則公網(wǎng)根本訪問不到。
如果在操作中遇到具體問題,比如容器啟動失敗、接口調(diào)用報錯,歡迎在評論區(qū)留言,我會逐一回復解決。覺得這篇教程有用的話,點贊收藏再走,后續(xù)還會更新「微服務日志收集」「服務監(jiān)控搭建」等進階內(nèi)容,助力新手從小白變運維高手!
版權(quán)聲明:本文為原創(chuàng)保姆級教程,禁止未經(jīng)授權(quán)的商用轉(zhuǎn)載,歡迎個人學習轉(zhuǎn)發(fā),轉(zhuǎn)載請注明出處。

這是一篇專門寫給編程新手的微服務部署全流程教程,不用糾結(jié)復雜概念,不用怕踩網(wǎng)絡或環(huán)境坑。我們從Docker環(huán)境一鍵搭建開始,用軒轅鏡像解決國內(nèi)拉取鏡像慢的問題,避開OpenJDK棄用的雷區(qū),全程手把手帶你完成「本地調(diào)試→服務器部署」,哪怕是2核4G的低配服務器,也能順利跑通包含MySQL、Redis、Nacos和4個電商場景業(yè)務服務的微服務項目。
浙公網(wǎng)安備 33010602011771號