大家好,我是魚皮。
計畫上線是每位學編程同學必須掌握的基本技能。之前我已經給大家分享過很多種上線單體計畫的方法了,今天再出一期微服務計畫的部署教程,用一種最簡單的方法,帶大家輕松部署微服務計畫。
開始之前,先做個小調研啊,大家更喜歡看 「真實踩坑版」 的教程還是 「壓縮純凈版」 的教程呢?
本期教程我還是保持自己一貫的風格,依然是保姆級教程,包含了一些踩坑過程和解決方案,大家跟著做就完事兒~
更推薦看視訊版:https://www.bilibili.com/video/BV1Cp4y1F7eA/
計畫介紹
這次的教程以我帶大家全程直播手把手開發的、基於 Spring Cloud + Docker 程式碼沙箱的 為例,進行演示。
> 線上判題系統教程:https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd(復制到瀏覽器開啟)
這個計畫的核心功能是讓使用者能夠線上選題和做題,然後由系統自動判題:
計畫用到的核心依賴包括:MySQL 資料庫、Redis 緩存、RabbitMQ 訊息佇列、Nacos 註冊中心
涉及的核心服務包括:使用者服務、題目服務、判題服務(程式碼沙箱)、Gateway 閘道器服務
傳統部署
對於這樣一個計畫,如果我們還用傳統單機計畫的部署方式,一個個打 jar 包、用 Java 命令來啟動,會有哪些問題呢?
要一個個安裝依賴,比如 MySQL 資料庫、Redis、訊息佇列、Nacos,非常麻煩!
要一個個打 jar 包、一個個手動執行 jar 包,非常麻煩!
不方便集中觀察所有服務的執行狀態和資源占用情況
所以,為了解決這些問題,我們會選用一種更高效的微服務部署方式 —— Docker Compose。
Docker Compose 介紹
在介紹 Docker Compose 前,先簡單介紹下 Docker。
Docker 是一種容器技術,允許開發者將應用程式和所有依賴項(如程式碼、庫、配置等)制作為
映像
。可以把映像簡單理解為軟體安裝包,可以在不同的電腦上透過它快速安裝和啟動應用程式(容器),這些程式獨立隔離地執行,不受外部環境的影響。
如果要部署微服務計畫,可能要啟動多個 Docker 容器,比如 MySQL 容器、使用者服務容器等。這時就需要 Docker Compose 了。它是一個容器編排助手,用於集中管理多個 Docker 容器的啟動和協同工作。可以在一個配置檔中集中定義所有容器以及它們的關系。然後,可以使用一行命令啟動所有容器,而不需要手動執行多個命令。
需要註意的是,Docker Compose 通常適用於把所有微服務部署在同一台伺服器的場景,在真實的企業級計畫中,往往會使用 K8S 等更專業的容器編排和自動化部署工具,更方便地在多個伺服器上部署容器。
部署流程
了解了 Docker 和 Docker Compose 的作用後,我們來快速了解下部署流程,分為 2 大階段 —— 本地部署和伺服器部署。
一、本地部署
梳理服務部署表格
Maven 子父模組打包
Dockerfile 編寫
編寫環境依賴配置
編寫服務配置
調整程式配置
測試存取
二、伺服端部署
準備伺服器
Docker Compose 安裝
同步檔
獲取 jar 包
服務啟動
測試存取
一、本地部署
第一階段是本地部署,也可以叫做部署準備。
強烈建議大家,比起直接操作線上伺服器,最好是先在本地把所有的流程跑通,風險更低、效率更高。
這裏我使用的是 Mac 作業系統,已經安裝了 Docker Desktop 軟體,管理 Docker 容器會更方便一些。
對於本地沒有 Docker 環境的同學,這一階段仔細看一遍有個印象就足夠了。可以直接拿我偵錯好的配置檔在伺服器上部署,而不用自己偵錯。
怎麽樣,夠貼心吧!可以叫我 「保姆魚皮」,簡稱 「保姆皮」。
1.1、梳理服務部署表格
在部署微服務計畫前,首先要規劃好要部署哪些服務、以及各服務的關鍵資訊,比如服務名稱、版本號、占用埠號、關鍵配置等。
對於我的線上判題計畫,梳理好的服務表格如下:
服務名稱 | 英文名 | 埠號 | 版本號 | 服務類別 |
---|---|---|---|---|
資料庫 | mysql | 3306 | v8 | 環境依賴 |
緩存 | redis | 6379 | v6 | 環境依賴 |
訊息佇列 | rabbitmq | 5672, 15672 | v3.12.6 | 環境依賴 |
註冊中心 | nacos | 8848 | v2.2.0 | 環境依賴 |
閘道器服務 | gateway | 8101 | java 8 | 業務服務 |
使用者服務 | yuoj-backend-user-service | 8102 | java 8 | 業務服務 |
題目服務 | yuoj-backend-question-service | 8103 | java 8 | 業務服務 |
判題服務 | yuoj-backend-judge-service | 8104 | java 8 | 業務服務 |
為什麽這裏我要劃分服務類別為 「環境依賴」 和 「業務服務」 呢?
因為在啟動服務時,必須要先啟動環境依賴,才能啟動業務服務,否則就會報類似 「無法連線資料庫」 之類的錯誤。
1.2、Maven 子父模組打包
對於微服務計畫,我們通常是使用 Maven 的子父模組功能進行管理的。需要部署計畫時,不用針對每個子服務單獨執行
mvn package
命令進行打包,而是可以一鍵打包所有服務。
想要實作這個功能,需要給子父模組的依賴檔(pom.xml)進行一些配置,主要包括:
1)父模組配置
在父模組的 pom.xml 檔中引入
spring-boot-maven-plugin
即可,註意一定不要配置 configuration 和 repackage!
範例程式碼如下:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
2)子模組配置
修改所有需要啟動 Spring Boot 的服務(使用者服務、題目服務、判題服務、閘道器服務)的子模組 pom.xml 檔。
主要是增加 executions 配置,使用 spring-boot-maven-plugin 的 repackage 命令來構建子模組,從而自動在構建時將公共模組的依賴打入 jar 包。
範例程式碼如下:
<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>
1.3、Dockerfile 編寫
Dockerfile 是定義 Docker 容器映像構建過程的檔,包括容器映像使用的基礎環境、容器內的依賴和檔、容器的配置、啟動命令等。
有了 Dockerfile,我們就能很輕松地制作出自己的容器映像。
雖然 Dockerfile 的寫法並不復雜,但我還是建議大家盡量不要自己寫,直接去網上找個差不多的計畫,復制貼上別人的 Dockerfile 就足夠了!
這裏魚皮給大家提供 2 種常用的 Spring Boot 計畫的 Dockerfile。
1)復制 jar 包版
思路:在本地打好 jar 包後,復制 jar 包到容器中執行
範例程式碼如下:
# 基礎映像
FROMopenjdk:8-jdk-alpine
# 指定工作目錄
WORKDIR/app
# 將 jar 包添加到工作目錄,比如 target/yuoj-backend-user-service-0.0.1-SNAPSHOT.jar
ADD{本地jar包路徑}.
# 暴露埠
EXPOSE{伺服端口號}
# 啟動命令
ENTRYPOINT["java","-jar","/app/{jar包名稱}","--spring.profiles.active=prod"]
2)Maven 打包版
思路:復制本地程式碼到容器中,在容器中使用 Maven 打包再執行
範例程式碼如下:
# 基礎映像
FROMmaven:3.8.1-jdk-8-slimasbuilder
# 指定工作目錄
WORKDIR/app
# 添加源碼檔
COPYpom.xml.
COPYsrc./src
# 構建 jar 包,跳過測試
RUNmvnpackage-DskipTests
# 啟動命令
ENTRYPOINT["java","-jar","/app/target/{jar包名稱}","--spring.profiles.active=prod"]
此處由於我們的微服務計畫可以一鍵打好所有子服務的 jar 包,就沒必要每個服務單獨在容器中打包了,所以選擇第一種方式的 Dockerfile。
我們需要給每個 Spring Boot 服務(使用者服務、題目服務、判題服務、閘道器服務)都編寫一個 Dockerfile,放到每個子服務的根目錄下。
以使用者服務為例,範例程式碼如下:
# 基礎映像
FROMopenjdk:8-jdk-alpine
# 指定工作目錄
WORKDIR/app
# 將 jar 包添加到工作目錄,比如 target/yuoj-backend-user-service-0.0.1-SNAPSHOT.jar
ADDtarget/yuoj-backend-user-service-0.0.1-SNAPSHOT.jar.
# 暴露埠
EXPOSE8102
# 啟動命令
ENTRYPOINT["java","-jar","/app/yuoj-backend-user-service-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]
建議先在本地利用 IDEA 開發工具調通映像構建流程,確保每個 Dockerfile 都是可以成功制作映像的:
檢視容器的啟動日誌,發現能夠啟動服務、看到 Spring 圖示即可:
1.4、編寫環境依賴配置
接下來,我們就要編寫 Docker Compose 的配置檔了,可以根據配置檔快速啟動多個服務。
之前我們已經梳理了服務部署表格,將服務劃分為了 「環境依賴」 和 「業務服務」。
由於業務服務依賴 MySQL 等環境依賴,所以需要拆分 2 套 Docker Compose 的配置檔,分別為
docker-compose.env.yml
環境配置和
docker-compose.service.yml
業務服務配置,保證先成功啟動依賴,再啟動服務。
學過 Docker Compose 的同學可能聽說過 depends_on 配置,也能決定服務的啟動順序。但是千萬註意,depends_on 並不會等待服務完全就緒,只是確保它們在啟動時的順序,並不穩定。
如何編寫 Docker Compose 檔呢?
和 Dockerfile 一樣,直接去網上找現成的 Docker Compose file,復制貼上過來略做修改就能使用了~
再配合以下 2 個網站,完全無需記憶 Docker Compose 的寫法!
Docker Compose file 官方文件:https://docs.docker.com/compose/compose-file/
搜尋現成的 Docker 映像:https://hub.docker.com/
當然,現在 AI 時代了,還有更簡單的方式!
直接把我們整理好的服務部署需要餵給 GPT,讓 AI 幫我們生成配置即可~
範例 prompt:
現在我需要用dockercompose來部署mysql8(3306埠)username=root,password=123456
redis6(無密碼,6379埠)、rabbitmqv.3.12.6(5672埠password:guest,username:guest)、nacos2.2.0(8848埠);還有4個原生的springboot服務(名稱分別為:yuoj-backend-user-service8102埠、yuoj-backend-question-service8103埠、yuoj-backend-judge-service8104埠、yuoj-backend-gateway8101埠),每個服務本地目錄都有一個Dockerfile,請幫我自動生成dockercompose的yml配置檔,要求這些服務網路能夠連通
效果還是非常不錯的,只要你描述地足夠清楚,生成的配置完全可用!
由於這篇文章是教程嘛,我就帶大家透過偵錯的方式一步步完成 Docker Compose 檔,最後會把完整的 Docker Compose 檔給大家分享出來,大家直接用就行了~
我們要分別在 Docker Compose 中定義 4 大基礎依賴,包括 MySQL、Redis、RabbitMQ 和 Nacos。
1)MySQL
我們不僅要建立一個 MySQL 服務,還要在建立服務後自動建立我們需要的庫表結構。
所以需要先準備資料庫 SQL 指令碼檔,裏麵包含了建庫、建表語句,我們把它放在微服務計畫根目錄的
mysql-init
資料夾中:
魚皮帶大家做的每個計畫都提供了現成的建表語句,這是一個非常好的開發習慣,便於其他人快速啟動你的計畫。
由於要在本地啟動 MySQL,還需要定義一個資料夾
.mysql-data
來存放 MySQL 的持久化數據,防止容器重新開機後數據遺失。
做好這兩點後,就可以編寫
docker-compose.env.yml
檔了,先只寫一個 MySQL 服務,範例程式碼如下:
關鍵配置的含義我都寫到註釋裏了
version:'3'
services:
mysql:
image:mysql:8# 使用的映像
container_name:yuoj-mysql# 啟動的例項名稱
environment:
MYSQL_ROOT_PASSWORD:123456# root 使用者密碼
ports:
-"3306:3306"# 埠對映
volumes:
-./.mysql-data:/var/lib/mysql# 將數據目錄掛載到本地目錄以進行持久化
-./mysql-init:/docker-entrypoint-initdb.d# 自動執行啟動指令碼
restart:always# 崩潰後自動重新開機
networks:
-mynetwork# 指定網路
networks:
mynetwork:# 自訂網路,實作網路互通和隔離
寫好配置檔後,可以直接在 IDEA 裏執行 Docker Compose 檔,偵錯 MySQL 的執行:
執行成功後,我們可以在本地成功連線資料庫:
2)Redis
Redis 服務的定義和啟動操作和 MySQL 服務幾乎一致,Redis 的 Docker Compose 配置範例程式碼如下:
version:'3'
services:
redis:
image:redis:6
container_name:yuoj-redis
ports:
-"6379:6379"
networks:
-mynetwork
volumes:
-./.redis-data:/data# 持久化
networks:
mynetwork:
然後在本地執行 Docker Compose 檔,啟動 Redis 服務,並且嘗試進入 Terminal 來偵錯 Redis:
3)RabbitMQ
同 MySQL 和 Redis,RabbitMQ 的 Docker Compose 配置範例程式碼如下:
version:'3'
services:
rabbitmq:
image:rabbitmq:3.12.6-management# 支持管理面板的訊息佇列
container_name:yuoj-rabbitmq
environment:
RABBITMQ_DEFAULT_USER:guest
RABBITMQ_DEFAULT_PASS:guest
ports:
-"5672:5672"
-"15672:15672"# RabbitMQ Dashboard 埠
volumes:
-./.rabbitmq-data:/var/lib/rabbitmq# 持久化
networks:
-mynetwork
networks:
mynetwork:
本地執行 Docker Compose 檔,啟動 RabbitMQ 服務,然後可以存取
localhost:15672
檢視到管理面板,就表示啟動成功了~
帳號密碼都是 guest
4)Nacos
和其他服務一樣,Nacos 也需要編寫 Docker Compose 配置。
但是在選擇 Nacos 映像時必須要註意,建議選擇支持 linux/arm64 架構的映像版本,比如
v2.2.0-slim
,否則後面可能會無法執行:
Nacos 範例配置檔如下:
version:'3'
services:
nacos:
image:nacos/nacos-server:v2.2.0-slim
container_name:yuoj-nacos
ports:
-"8848:8848"
volumes:
-./.nacos-data:/home/nacos/data
networks:
-mynetwork
environment:
-MODE=standalone# 單節點模式啟動
-PREFER_HOST_MODE=hostname# 支持 hostname
-TZ=Asia/Shanghai# 控制時區
networks:
mynetwork:
然後在本地執行 Docker Compose 啟動 Nacos,存取
localhost:8848/nacos
能夠看到管理頁面,就表示執行成功了~
管理頁面的帳號和密碼預設都是 nacos
完整 Docker Compose 檔
分別偵錯完上述服務後,我們把所有的配置拼在一起,就得到了完整的檔,檔名為
docker-compose.env.yml
。
完整程式碼如下:
version:'3'
services:
mysql:
image:mysql:8# 使用的映像
container_name:yuoj-mysql# 啟動的例項名稱
environment:
MYSQL_ROOT_PASSWORD:123456# root 使用者密碼
ports:
-"3306:3306"# 埠對映
volumes:
-./.mysql-data:/var/lib/mysql# 將數據目錄掛載到本地目錄以進行持久化
-./mysql-init:/docker-entrypoint-initdb.d# 啟動指令碼
restart:always# 崩潰後自動重新開機
networks:
-mynetwork# 指定網路
redis:
image:redis:6
container_name:yuoj-redis
ports:
-"6379:6379"
networks:
-mynetwork
volumes:
-./.redis-data:/data# 持久化
rabbitmq:
image:rabbitmq:3.12.6-management# 支持管理面板的訊息佇列
container_name:yuoj-rabbitmq
environment:
RABBITMQ_DEFAULT_USER:guest
RABBITMQ_DEFAULT_PASS:guest
ports:
-"5672:5672"
-"15672:15672"# RabbitMQ Dashboard 埠
volumes:
-./.rabbitmq-data:/var/lib/rabbitmq# 持久化
networks:
-mynetwork
nacos:
image:nacos/nacos-server:v2.2.0-slim
container_name:yuoj-nacos
ports:
-"8848:8848"
volumes:
-./.nacos-data:/home/nacos/data
networks:
-mynetwork
environment:
-MODE=standalone# 單節點模式啟動
-PREFER_HOST_MODE=hostname# 支持 hostname
-TZ=Asia/Shanghai# 控制時區
networks:
mynetwork:
1.5、編寫業務服務配置
用同樣的方式,我們可以編寫業務服務的 Docker Compose 檔,檔名稱
docker-compose.service.yml
。
範例程式碼如下,其中需要格外關註的配置是 build 和 depends_on:
version:'3'
services:
yuoj-backend-gateway:
container_name:yuoj-backend-gateway
build:# 服務的 Docker 構建檔位置
context:./yuoj-backend-gateway
dockerfile:Dockerfile
ports:
-"8101:8101"
networks:
-mynetwork
yuoj-backend-user-service:
container_name:yuoj-backend-user-service
build:
context:./yuoj-backend-user-service
dockerfile:Dockerfile
ports:
-"8102:8102"
networks:
-mynetwork
depends_on:# 本服務依賴的服務,控制啟動先後順序
-yuoj-backend-gateway
yuoj-backend-question-service:
container_name:yuoj-backend-question-service
build:
context:./yuoj-backend-question-service
dockerfile:Dockerfile
ports:
-"8103:8103"
networks:
-mynetwork
depends_on:
-yuoj-backend-user-service
-yuoj-backend-gateway
yuoj-backend-judge-service:
container_name:yuoj-backend-judge-service
build:
context:./yuoj-backend-judge-service
dockerfile:Dockerfile
ports:
-"8104:8104"
networks:
-mynetwork
depends_on:
-yuoj-backend-user-service
-yuoj-backend-question-service
-yuoj-backend-gateway
# 網路,不定義的話就是預設網路
networks:
mynetwork:
1.6、調整程式配置
編寫好上述配置檔後,本地嘗試執行 Docker Compose 業務服務,結果發現:報錯啦!依賴服務的地址存取不通!
這是由於之前我們的計畫存取依賴服務時,全部是使用了固定的 IP 地址(比如 localhost),而容器內部的 localhost(或 127.0.0.1)通常指向容器本身,而不是宿主主機。所以為了在容器內存取其他服務,程式中應該使用服務名稱而不是 localhost。
我們給每個 Spring Boot 服務都增加一套 prod 上線配置,在配置中更改服務呼叫地址。
使用者服務、題目服務和判題服務的
application-prod.yml
配置修改如下:
# 生產環境配置檔
spring:
# 資料庫配置
datasource:
driver- class-name:com.mysql.cj.jdbc.Driver
url:jdbc:mysql://mysql:3306/yuoj# localhost 改為 mysql
username:root
password:123456
# Redis 配置
redis:
database:1
host:redis# localhost 改為 redis
port:6379
timeout:5000
cloud:
nacos:
discovery:
server-addr:nacos:8848# localhost 改為 nacos
rabbitmq:
host:rabbitmq# localhost 改為 rabbitmq
port:5672
password:guest
username:guest
Gateway 閘道器服務的配置修改如下:
spring:
cloud:
nacos:
discovery:
server-addr:nacos:8848# localhost 改為 nacos
gateway:
routes:
-id:yuoj-backend-user-service
uri:lb://yuoj-backend-user-service
predicates:
-Path=/api/user/**
-id:yuoj-backend-question-service
uri:lb://yuoj-backend-question-service
predicates:
-Path=/api/question/**
-id:yuoj-backend-judge-service
uri:lb://yuoj-backend-judge-service
predicates:
-Path=/api/judge/**
application:
name:yuoj-backend-gateway
main:
web-application-type:reactive
server:
port:8101
knife4j:
gateway:
enabled:true
strategy:discover
discover:
enabled:true
version:swagger2
然後執行
mvn package
命令重新打包、執行 Docker Compose。
結果發現大多數服務都啟動了,但是判題服務還有報錯。
這是因為程式在建立訊息佇列時存在寫死的變量,指定了 host 為 "localhost",範例程式碼如下:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
String EXCHANGE_NAME = "code_exchange";
channel.exchangeDeclare(EXCHANGE_NAME, "direct");
舉這個例子是為了告訴大家,在程式中盡量不要寫固定 IP 或網域名稱,全部改為動態讀取配置檔,便於修改。
範例修改後的程式碼如下:
/**
* 用於建立測試程式用到的交換機和佇列(只用在程式啟動前執行一次)
*/
@Slf4j
@Component
public classInitRabbitMqBean{
@Value("${spring.rabbitmq.host:localhost}")
private String host;
@PostConstruct
publicvoidinit(){
try {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(host);
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
String EXCHANGE_NAME = "code_exchange";
channel.exchangeDeclare(EXCHANGE_NAME, "direct");
// 建立佇列,隨機分配一個佇列名稱
String queueName = "code_queue";
channel.queueDeclare(queueName, true, false, false, null);
channel.queueBind(queueName, EXCHANGE_NAME, "my_routingKey");
log.info("訊息佇列啟動成功");
} catch (Exception e) {
log.error("訊息佇列啟動失敗");
}
}
}
1.7、測試存取
修復上述問題後,所有服務都可以透過 Docker Compose 檔啟動了。
然後我們存取
localhost:8101/doc.html
閘道器地址,能夠看到 Swagger 聚合介面文件。
依次呼叫使用者註冊 => 登入 => 獲取登入使用者資訊 => 建立題目介面,全部執行成功。
至此,第一階段就完成啦。
二、伺服器部署
在第二階段,我們的目標就是在真實的 Linux 伺服器上部署微服務計畫。有了第一階段的準備,第二階段簡直可以說是易如反掌!
2.1、準備伺服器
首先,我們要有一台 Linux 伺服器。
選擇伺服器前,我們必須要評估下微服務計畫的記憶體占用,千萬別把伺服器的記憶體買小了!
可以使用 Docker Desktop 直接檢視記憶體占用,虛擬機器記憶體大概占用了 8 個 G、容器實際記憶體占用了 4 個 G:
那我們搞多少記憶體的伺服器呢?
我猜很多同學會說 8 G,奈何我天生反骨,明知山有虎偏向虎山行(主要是想省 💰),我就搞一台 2 核 4 G 的伺服器吧(發行版是 CentOS 7.9 Linux),咱們來猜一猜它夠不夠部署這套有 4 個業務服務的微服務計畫呢?
咱們一起來見證下!
2.2、Docker Compose 安裝
有了伺服器後,直接參考 Docker Compose 官方文件來安裝。這裏我們使用 Docker Compose V2 版本,相比 V1 版本統一了命令,使用更方便:
Docker Compose V2 地址:https://docs.docker.com/compose/migrate/
Docker Compose Linux 安裝:https://docs.docker.com/compose/install/linux/#install-using-the-repository
安裝過程很簡單,跟著官方文件來就行了,主要包括以下幾個步驟:
1)設定安裝來源:
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2)安裝 Docker 和 Docker Compose:
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3)啟動 Docker:
sudo systemctl start docker
4)測試 Docker:
systemctl status docker
sudo docker run hello-world
2.3、同步檔
接下來,我們需要把本地折騰好的微服務計畫源碼上傳到伺服器上,可以選擇用 FTP 或 SSH 連線檔手動上傳檔。
我這裏使用 JetBrains 開發工具的遠端部署功能,可以配置檔自動上傳,步驟如下:
1)進入遠端部署配置
2)添加遠端部署配置:
這裏建議大家不要暴露自己的伺服器 IP 啊,當你看到本文的時候,其實我已經把伺服器的 IP 更換掉了哈哈哈哈哈哈哈哈!
3)指定連線的伺服器配置:
4)配置本地檔和伺服器檔路徑對映:
5)開啟自動上傳:
6)首次需要手動上傳檔。
上傳前記得先刪除無用的檔,然後右鍵計畫根目錄,點選部署上傳程式碼:
上傳成功,在伺服器對應路徑(/code/yuoj-backend-microservice)下能看到已上傳的檔列表:
2.4、獲取 jar 包
光把程式碼上傳到伺服器還是不夠的,因為我們構建 Docker 映像需要 jar 包。
有 2 種方式得到 jar 包:
本地執行
mvn package
打好 jar 包,然後再上傳伺服器上裝 Maven,在伺服器上打包
但是因為 jar 包比較大,頻繁改動的話同步速度會比較慢,所以更建議第二種方式,步驟如下:
1)安裝 Maven:
sudo yum install maven
2)安裝好後,執行打包:
sudo mvn package
打包成功:
2.5、服務啟動
所有一切準備就緒,接下來就是使用 Docker Compose 命令分別啟動環境依賴和業務服務啦。
1)啟動環境依賴
先使用 docker compose 一行命令啟動環境依賴:
docker compose -f docker-compose.env.yml up
註意:
老版本使用 "docker-compose" 替代 "docker compose"
如果沒有許可權,命令前加上 "sudo"
然後喝杯咖啡,等待啟動即可~
啟動成功後,我們可以透過公網 IP 來嘗試存取服務。
先進入到雲服務商的伺服器配置頁,修改伺服器的防火墻配置,放通以下埠:
然後像存取本地服務一樣分別去存取 MySQL、Redis、RabbitMQ、Nacos 即可,應該都是成功的。
由於行程在前台啟動會影響我們的操作,所以先按
ctrl + c
結束,加上
-d
參數讓容器在後台啟動:
sudo docker compose -f docker-compose.env.yml up -d
試著檢視下 docker 容器的狀態:
sudo docker stats
能夠檢視到所有容器的資源占用情況:
實話說,我開始緊張了,不知道 4 G 的記憶體夠不夠撐。。。
2)啟動業務服務
確保環境依賴都啟動成功後,接下來啟動業務服務:
docker compose -f docker-compose.service.yml up
計畫全部啟動,看得很爽:
正常來說,應該會啟動成功;但如果運氣背,可能會有失敗,比如我這的閘道器服務就啟動失敗了。
如果某個服務啟動失敗,可以再次單獨只啟動它,比如閘道器服務:
sudo docker compose -f docker-compose.service.yml up yuoj-backend-gateway
2.6、測試存取
最後,像驗證本地微服務計畫部署一樣,存取線上閘道器的介面文件( http://你的伺服器 IP:8101/doc.html ),依次呼叫使用者註冊 => 登入 => 獲取登入使用者資訊 => 建立題目,全部成功~
最後使用
docker stats
命令檢視 Docker 容器的狀態,發現總共的記憶體占用大概 3 G,也就是說 4 G 記憶體的伺服器是完全足夠小型微服務計畫的部署了~
至此,微服務計畫部署教程就結束了。
最後
最後我再問個問題,如果我只有一台 2 G 記憶體的伺服器,能否成功部署這套有 4 個業務服務的計畫呢?如果能的話,又應該怎麽部署呢?歡迎大家討論。
下圖是個小提示:
終於寫完了這篇 6000 多字的教程,如果覺得本期內容有幫助的話,也歡迎點贊、收藏三連支持,謝謝大家!
👇🏻 點選下方閱讀原文,獲取魚皮往期編程幹貨
往期推薦