日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

還不會(huì)部署微服務(wù)項(xiàng)目?保姆級(jí)教程來(lái)啦!

來(lái)源: 責(zé)編: 時(shí)間:2023-09-28 10:05:07 336觀看
導(dǎo)讀大家好,我是魚(yú)皮。項(xiàng)目上線是每位學(xué)編程同學(xué)必須掌握的基本技能。之前我已經(jīng)給大家分享過(guò)很多種上線單體項(xiàng)目的方法了,今天再出一期微服務(wù)項(xiàng)目的部署教程,用一種最簡(jiǎn)單的方法,帶大家輕松部署微服務(wù)項(xiàng)目。開(kāi)始之前,先做個(gè)小

大家好,我是魚(yú)皮。IrR28資訊網(wǎng)——每日最新資訊28at.com

項(xiàng)目上線是每位學(xué)編程同學(xué)必須掌握的基本技能。之前我已經(jīng)給大家分享過(guò)很多種上線單體項(xiàng)目的方法了,今天再出一期微服務(wù)項(xiàng)目的部署教程,用一種最簡(jiǎn)單的方法,帶大家輕松部署微服務(wù)項(xiàng)目。IrR28資訊網(wǎng)——每日最新資訊28at.com

開(kāi)始之前,先做個(gè)小調(diào)研啊,大家更喜歡看 “真實(shí)踩坑版” 的教程還是 “壓縮純凈版” 的教程呢?IrR28資訊網(wǎng)——每日最新資訊28at.com

本期教程我還是保持自己一貫的風(fēng)格,依然是保姆級(jí)教程,包含了一些踩坑過(guò)程和解決方案,大家跟著做就完事兒~IrR28資訊網(wǎng)——每日最新資訊28at.com

更推薦看視頻版:https://www.bilibili.com/video/BV1Cp4y1F7eA/IrR28資訊網(wǎng)——每日最新資訊28at.com

項(xiàng)目介紹

這次的教程以我?guī)Т蠹胰讨辈ナ职咽珠_(kāi)發(fā)的、基于 Spring Cloud + Docker 代碼沙箱的 在線判題系統(tǒng) 為例,進(jìn)行演示。IrR28資訊網(wǎng)——每日最新資訊28at.com

這個(gè)項(xiàng)目的核心功能是讓用戶能夠在線選題和做題,然后由系統(tǒng)自動(dòng)判題:IrR28資訊網(wǎng)——每日最新資訊28at.com

圖片IrR28資訊網(wǎng)——每日最新資訊28at.com

項(xiàng)目用到的核心依賴包括:MySQL 數(shù)據(jù)庫(kù)、Redis 緩存、RabbitMQ 消息隊(duì)列、Nacos 注冊(cè)中心IrR28資訊網(wǎng)——每日最新資訊28at.com

涉及的核心服務(wù)包括:用戶服務(wù)、題目服務(wù)、判題服務(wù)(代碼沙箱)、Gateway 網(wǎng)關(guān)服務(wù)IrR28資訊網(wǎng)——每日最新資訊28at.com

圖片IrR28資訊網(wǎng)——每日最新資訊28at.com

傳統(tǒng)部署

對(duì)于這樣一個(gè)項(xiàng)目,如果我們還用傳統(tǒng)單機(jī)項(xiàng)目的部署方式,一個(gè)個(gè)打 jar 包、用 Java 命令來(lái)啟動(dòng),會(huì)有哪些問(wèn)題呢?IrR28資訊網(wǎng)——每日最新資訊28at.com

  1. 要一個(gè)個(gè)安裝依賴,比如 MySQL 數(shù)據(jù)庫(kù)、Redis、消息隊(duì)列、Nacos,非常麻煩!
  2. 要一個(gè)個(gè)打 jar 包、一個(gè)個(gè)手動(dòng)運(yùn)行 jar 包,非常麻煩!
  3. 不方便集中觀察所有服務(wù)的運(yùn)行狀態(tài)和資源占用情況

所以,為了解決這些問(wèn)題,我們會(huì)選用一種更高效的微服務(wù)部署方式 —— Docker Compose。IrR28資訊網(wǎng)——每日最新資訊28at.com

Docker Compose 介紹

在介紹 Docker Compose 前,先簡(jiǎn)單介紹下 Docker。IrR28資訊網(wǎng)——每日最新資訊28at.com

Docker 是一種容器技術(shù),允許開(kāi)發(fā)者將應(yīng)用程序和所有依賴項(xiàng)(如代碼、庫(kù)、配置等)制作為 鏡像。可以把鏡像簡(jiǎn)單理解為軟件安裝包,可以在不同的計(jì)算機(jī)上通過(guò)它快速安裝和啟動(dòng)應(yīng)用程序(容器),這些程序獨(dú)立隔離地運(yùn)行,不受外部環(huán)境的影響。IrR28資訊網(wǎng)——每日最新資訊28at.com

圖片IrR28資訊網(wǎng)——每日最新資訊28at.com

如果要部署微服務(wù)項(xiàng)目,可能要啟動(dòng)多個(gè) Docker 容器,比如 MySQL 容器、用戶服務(wù)容器等。這時(shí)就需要 Docker Compose 了。它是一個(gè)容器編排助手,用于集中管理多個(gè) Docker 容器的啟動(dòng)和協(xié)同工作。可以在一個(gè)配置文件中集中定義所有容器以及它們的關(guān)系。然后,可以使用一行命令啟動(dòng)所有容器,而不需要手動(dòng)運(yùn)行多個(gè)命令。IrR28資訊網(wǎng)——每日最新資訊28at.com

圖片IrR28資訊網(wǎng)——每日最新資訊28at.com

需要注意的是,Docker Compose 通常適用于把所有微服務(wù)部署在同一臺(tái)服務(wù)器的場(chǎng)景,在真實(shí)的企業(yè)級(jí)項(xiàng)目中,往往會(huì)使用 K8S 等更專業(yè)的容器編排和自動(dòng)化部署工具,更方便地在多個(gè)服務(wù)器上部署容器。IrR28資訊網(wǎng)——每日最新資訊28at.com

部署流程

了解了 Docker 和 Docker Compose 的作用后,我們來(lái)快速了解下部署流程,分為 2 大階段 —— 本地部署和服務(wù)器部署。IrR28資訊網(wǎng)——每日最新資訊28at.com

一、本地部署IrR28資訊網(wǎng)——每日最新資訊28at.com

  1. 梳理服務(wù)部署表格
  2. Maven 子父模塊打包
  3. Dockerfile 編寫(xiě)
  4. 編寫(xiě)環(huán)境依賴配置
  5. 編寫(xiě)服務(wù)配置
  6. 調(diào)整程序配置
  7. 測(cè)試訪問(wèn)

二、服務(wù)端部署IrR28資訊網(wǎng)——每日最新資訊28at.com

  1. 準(zhǔn)備服務(wù)器
  2. Docker Compose 安裝
  3. 同步文件
  4. 獲取 jar 包
  5. 服務(wù)啟動(dòng)
  6. 測(cè)試訪問(wèn)

一、本地部署

第一階段是本地部署,也可以叫做部署準(zhǔn)備。IrR28資訊網(wǎng)——每日最新資訊28at.com

強(qiáng)烈建議大家,比起直接操作線上服務(wù)器,最好是先在本地把所有的流程跑通,風(fēng)險(xiǎn)更低、效率更高。IrR28資訊網(wǎng)——每日最新資訊28at.com

這里我使用的是 Mac 操作系統(tǒng),已經(jīng)安裝了 Docker Desktop 軟件,管理 Docker 容器會(huì)更方便一些。IrR28資訊網(wǎng)——每日最新資訊28at.com

圖片IrR28資訊網(wǎng)——每日最新資訊28at.com

對(duì)于本地沒(méi)有 Docker 環(huán)境的同學(xué),這一階段仔細(xì)看一遍有個(gè)印象就足夠了。可以直接拿我調(diào)試好的配置文件在服務(wù)器上部署,而不用自己調(diào)試。IrR28資訊網(wǎng)——每日最新資訊28at.com

怎么樣,夠貼心吧!可以叫我 “保姆魚(yú)皮”,簡(jiǎn)稱 “保姆皮”。IrR28資訊網(wǎng)——每日最新資訊28at.com

圖片IrR28資訊網(wǎng)——每日最新資訊28at.com

1.1、梳理服務(wù)部署表格

在部署微服務(wù)項(xiàng)目前,首先要規(guī)劃好要部署哪些服務(wù)、以及各服務(wù)的關(guān)鍵信息,比如服務(wù)名稱、版本號(hào)、占用端口號(hào)、關(guān)鍵配置等。IrR28資訊網(wǎng)——每日最新資訊28at.com

對(duì)于我的在線判題項(xiàng)目,梳理好的服務(wù)表格如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

服務(wù)名稱
IrR28資訊網(wǎng)——每日最新資訊28at.com

英文名
IrR28資訊網(wǎng)——每日最新資訊28at.com

端口號(hào)
IrR28資訊網(wǎng)——每日最新資訊28at.com

版本號(hào)
IrR28資訊網(wǎng)——每日最新資訊28at.com

服務(wù)類別
IrR28資訊網(wǎng)——每日最新資訊28at.com

數(shù)據(jù)庫(kù)
IrR28資訊網(wǎng)——每日最新資訊28at.com

mysql
IrR28資訊網(wǎng)——每日最新資訊28at.com

3306
IrR28資訊網(wǎng)——每日最新資訊28at.com

v8
IrR28資訊網(wǎng)——每日最新資訊28at.com

環(huán)境依賴
IrR28資訊網(wǎng)——每日最新資訊28at.com

緩存
IrR28資訊網(wǎng)——每日最新資訊28at.com

redis
IrR28資訊網(wǎng)——每日最新資訊28at.com

6379
IrR28資訊網(wǎng)——每日最新資訊28at.com

v6
IrR28資訊網(wǎng)——每日最新資訊28at.com

環(huán)境依賴
IrR28資訊網(wǎng)——每日最新資訊28at.com

消息隊(duì)列
IrR28資訊網(wǎng)——每日最新資訊28at.com

rabbitmq
IrR28資訊網(wǎng)——每日最新資訊28at.com

5672, 15672
IrR28資訊網(wǎng)——每日最新資訊28at.com

v3.12.6
IrR28資訊網(wǎng)——每日最新資訊28at.com

環(huán)境依賴
IrR28資訊網(wǎng)——每日最新資訊28at.com

注冊(cè)中心
IrR28資訊網(wǎng)——每日最新資訊28at.com

nacos
IrR28資訊網(wǎng)——每日最新資訊28at.com

8848
IrR28資訊網(wǎng)——每日最新資訊28at.com

v2.2.0
IrR28資訊網(wǎng)——每日最新資訊28at.com

環(huán)境依賴
IrR28資訊網(wǎng)——每日最新資訊28at.com

網(wǎng)關(guān)服務(wù)
IrR28資訊網(wǎng)——每日最新資訊28at.com

gateway
IrR28資訊網(wǎng)——每日最新資訊28at.com

8101
IrR28資訊網(wǎng)——每日最新資訊28at.com

java 8
IrR28資訊網(wǎng)——每日最新資訊28at.com

業(yè)務(wù)服務(wù)
IrR28資訊網(wǎng)——每日最新資訊28at.com

用戶服務(wù)
IrR28資訊網(wǎng)——每日最新資訊28at.com

yuoj-backend-user-service
IrR28資訊網(wǎng)——每日最新資訊28at.com

8102
IrR28資訊網(wǎng)——每日最新資訊28at.com

java 8
IrR28資訊網(wǎng)——每日最新資訊28at.com

業(yè)務(wù)服務(wù)
IrR28資訊網(wǎng)——每日最新資訊28at.com

題目服務(wù)
IrR28資訊網(wǎng)——每日最新資訊28at.com

yuoj-backend-question-service
IrR28資訊網(wǎng)——每日最新資訊28at.com

8103
IrR28資訊網(wǎng)——每日最新資訊28at.com

java 8
IrR28資訊網(wǎng)——每日最新資訊28at.com

業(yè)務(wù)服務(wù)
IrR28資訊網(wǎng)——每日最新資訊28at.com

判題服務(wù)
IrR28資訊網(wǎng)——每日最新資訊28at.com

yuoj-backend-judge-service
IrR28資訊網(wǎng)——每日最新資訊28at.com

8104
IrR28資訊網(wǎng)——每日最新資訊28at.com

java 8
IrR28資訊網(wǎng)——每日最新資訊28at.com

業(yè)務(wù)服務(wù)
IrR28資訊網(wǎng)——每日最新資訊28at.com

為什么這里我要?jiǎng)澐址?wù)類別為 “環(huán)境依賴” 和 “業(yè)務(wù)服務(wù)” 呢?IrR28資訊網(wǎng)——每日最新資訊28at.com

因?yàn)樵趩?dòng)服務(wù)時(shí),必須要先啟動(dòng)環(huán)境依賴,才能啟動(dòng)業(yè)務(wù)服務(wù),否則就會(huì)報(bào)類似 “無(wú)法連接數(shù)據(jù)庫(kù)” 之類的錯(cuò)誤。IrR28資訊網(wǎng)——每日最新資訊28at.com

1.2、Maven 子父模塊打包

對(duì)于微服務(wù)項(xiàng)目,我們通常是使用 Maven 的子父模塊功能進(jìn)行管理的。需要部署項(xiàng)目時(shí),不用針對(duì)每個(gè)子服務(wù)單獨(dú)執(zhí)行 mvn package 命令進(jìn)行打包,而是可以一鍵打包所有服務(wù)。IrR28資訊網(wǎng)——每日最新資訊28at.com

想要實(shí)現(xiàn)這個(gè)功能,需要給子父模塊的依賴文件(pom.xml)進(jìn)行一些配置,主要包括:IrR28資訊網(wǎng)——每日最新資訊28at.com

1)父模塊配置

在父模塊的 pom.xml 文件中引入 spring-boot-maven-plugin 即可,注意一定不要配置 configuration 和 repackage!IrR28資訊網(wǎng)——每日最新資訊28at.com

示例代碼如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

<plugin>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-maven-plugin</artifactId>    <version>${spring-boot.version}</version></plugin>

2)子模塊配置

修改所有需要啟動(dòng) Spring Boot 的服務(wù)(用戶服務(wù)、題目服務(wù)、判題服務(wù)、網(wǎng)關(guān)服務(wù))的子模塊 pom.xml 文件。IrR28資訊網(wǎng)——每日最新資訊28at.com

主要是增加 executions 配置,使用 spring-boot-maven-plugin 的 repackage 命令來(lái)構(gòu)建子模塊,從而自動(dòng)在構(gòu)建時(shí)將公共模塊的依賴打入 jar 包。IrR28資訊網(wǎng)——每日最新資訊28at.com

示例代碼如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

<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 編寫(xiě)

Dockerfile 是定義 Docker 容器鏡像構(gòu)建過(guò)程的文件,包括容器鏡像使用的基礎(chǔ)環(huán)境、容器內(nèi)的依賴和文件、容器的配置、啟動(dòng)命令等。IrR28資訊網(wǎng)——每日最新資訊28at.com

有了 Dockerfile,我們就能很輕松地制作出自己的容器鏡像。IrR28資訊網(wǎng)——每日最新資訊28at.com

雖然 Dockerfile 的寫(xiě)法并不復(fù)雜,但我還是建議大家盡量不要自己寫(xiě),直接去網(wǎng)上找個(gè)差不多的項(xiàng)目,復(fù)制粘貼別人的 Dockerfile 就足夠了!IrR28資訊網(wǎng)——每日最新資訊28at.com

這里魚(yú)皮給大家提供 2 種常用的 Spring Boot 項(xiàng)目的 Dockerfile。IrR28資訊網(wǎng)——每日最新資訊28at.com

1)復(fù)制 jar 包版

思路:在本地打好 jar 包后,復(fù)制 jar 包到容器中運(yùn)行IrR28資訊網(wǎng)——每日最新資訊28at.com

示例代碼如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

# 基礎(chǔ)鏡像FROM openjdk:8-jdk-alpine# 指定工作目錄WORKDIR /app# 將 jar 包添加到工作目錄,比如 target/yuoj-backend-user-service-0.0.1-SNAPSHOT.jarADD {本地 jar 包路徑} . # 暴露端口EXPOSE {服務(wù)端口號(hào)}# 啟動(dòng)命令ENTRYPOINT ["java","-jar","/app/{jar 包名稱}","--spring.profiles.active=prod"]

2)Maven 打包版

思路:復(fù)制本地代碼到容器中,在容器中使用 Maven 打包再運(yùn)行IrR28資訊網(wǎng)——每日最新資訊28at.com

示例代碼如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

# 基礎(chǔ)鏡像FROM maven:3.8.1-jdk-8-slim as builder# 指定工作目錄WORKDIR /app# 添加源碼文件COPY pom.xml .COPY src ./src# 構(gòu)建 jar 包,跳過(guò)測(cè)試RUN mvn package -DskipTests# 啟動(dòng)命令ENTRYPOINT ["java","-jar","/app/target/{jar 包名稱}","--spring.profiles.active=prod"]

此處由于我們的微服務(wù)項(xiàng)目可以一鍵打好所有子服務(wù)的 jar 包,就沒(méi)必要每個(gè)服務(wù)單獨(dú)在容器中打包了,所以選擇第一種方式的 Dockerfile。IrR28資訊網(wǎng)——每日最新資訊28at.com

我們需要給每個(gè) Spring Boot 服務(wù)(用戶服務(wù)、題目服務(wù)、判題服務(wù)、網(wǎng)關(guān)服務(wù))都編寫(xiě)一個(gè) Dockerfile,放到每個(gè)子服務(wù)的根目錄下。IrR28資訊網(wǎng)——每日最新資訊28at.com

以用戶服務(wù)為例,示例代碼如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

# 基礎(chǔ)鏡像FROM openjdk:8-jdk-alpine  # 指定工作目錄WORKDIR /app  # 將 jar 包添加到工作目錄,比如 target/yuoj-backend-user-service-0.0.1-SNAPSHOT.jarADD target/yuoj-backend-user-service-0.0.1-SNAPSHOT.jar .  # 暴露端口EXPOSE 8102  # 啟動(dòng)命令ENTRYPOINT ["java","-jar","/app/yuoj-backend-user-service-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]

建議先在本地利用 IDEA 開(kāi)發(fā)工具調(diào)通鏡像構(gòu)建流程,確保每個(gè) Dockerfile 都是可以成功制作鏡像的:IrR28資訊網(wǎng)——每日最新資訊28at.com

圖片IrR28資訊網(wǎng)——每日最新資訊28at.com

查看容器的啟動(dòng)日志,發(fā)現(xiàn)能夠啟動(dòng)服務(wù)、看到 Spring 圖標(biāo)即可:IrR28資訊網(wǎng)——每日最新資訊28at.com

1.4、編寫(xiě)環(huán)境依賴配置

接下來(lái),我們就要編寫(xiě) Docker Compose 的配置文件了,可以根據(jù)配置文件快速啟動(dòng)多個(gè)服務(wù)。IrR28資訊網(wǎng)——每日最新資訊28at.com

之前我們已經(jīng)梳理了服務(wù)部署表格,將服務(wù)劃分為了 “環(huán)境依賴” 和 “業(yè)務(wù)服務(wù)”。IrR28資訊網(wǎng)——每日最新資訊28at.com

由于業(yè)務(wù)服務(wù)依賴 MySQL 等環(huán)境依賴,所以需要拆分 2 套 Docker Compose 的配置文件,分別為 docker-compose.env.yml 環(huán)境配置和 docker-compose.service.yml 業(yè)務(wù)服務(wù)配置,保證先成功啟動(dòng)依賴,再啟動(dòng)服務(wù)。IrR28資訊網(wǎng)——每日最新資訊28at.com

學(xué)過(guò) Docker Compose 的同學(xué)可能聽(tīng)說(shuō)過(guò) depends_on 配置,也能決定服務(wù)的啟動(dòng)順序。但是千萬(wàn)注意,depends_on 并不會(huì)等待服務(wù)完全就緒,只是確保它們?cè)趩?dòng)時(shí)的順序,并不穩(wěn)定。IrR28資訊網(wǎng)——每日最新資訊28at.com

如何編寫(xiě) Docker Compose 文件呢?IrR28資訊網(wǎng)——每日最新資訊28at.com

和 Dockerfile 一樣,直接去網(wǎng)上找現(xiàn)成的 Docker Compose file,復(fù)制粘貼過(guò)來(lái)略做修改就能使用了~IrR28資訊網(wǎng)——每日最新資訊28at.com

再配合以下 2 個(gè)網(wǎng)站,完全無(wú)需記憶 Docker Compose 的寫(xiě)法!IrR28資訊網(wǎng)——每日最新資訊28at.com

  • Docker Compose file 官方文檔:https://docs.docker.com/compose/compose-file/
  • 搜索現(xiàn)成的 Docker 鏡像:https://hub.docker.com/

當(dāng)然,現(xiàn)在 AI 時(shí)代了,還有更簡(jiǎn)單的方式!IrR28資訊網(wǎng)——每日最新資訊28at.com

直接把我們整理好的服務(wù)部署需要喂給 GPT,讓 AI 幫我們生成配置即可~IrR28資訊網(wǎng)——每日最新資訊28at.com

示例 prompt:IrR28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在我需要用 docker compose 來(lái)部署 mysql 8(3306 端口)username=root,password=123456redis 6(無(wú)密碼,6379端口)、rabbitmq v.3.12.6( 5672 端口   password: guest,username: guest)、nacos 2.2.0(8848端口);還有 4 個(gè)本地的 springboot 服務(wù)(名稱分別為:yuoj-backend-user-service 8102端口、yuoj-backend-question-service 8103端口、yuoj-backend-judge-service 8104端口、yuoj-backend-gateway 8101 端口),每個(gè)服務(wù)本地目錄都有一個(gè) Dockerfile,請(qǐng)幫我自動(dòng)生成 docker compose 的 yml 配置文件,要求這些服務(wù)網(wǎng)絡(luò)能夠連通

效果還是非常不錯(cuò)的,只要你描述地足夠清楚,生成的配置完全可用!IrR28資訊網(wǎng)——每日最新資訊28at.com

圖片IrR28資訊網(wǎng)——每日最新資訊28at.com

由于這篇文章是教程嘛,我就帶大家通過(guò)調(diào)試的方式一步步完成 Docker Compose 文件,最后會(huì)把完整的 Docker Compose 文件給大家分享出來(lái),大家直接用就行了~IrR28資訊網(wǎng)——每日最新資訊28at.com

我們要分別在 Docker Compose 中定義 4 大基礎(chǔ)依賴,包括 MySQL、Redis、RabbitMQ 和 Nacos。IrR28資訊網(wǎng)——每日最新資訊28at.com

1)MySQL

我們不僅要?jiǎng)?chuàng)建一個(gè) MySQL 服務(wù),還要在創(chuàng)建服務(wù)后自動(dòng)創(chuàng)建我們需要的庫(kù)表結(jié)構(gòu)。IrR28資訊網(wǎng)——每日最新資訊28at.com

所以需要先準(zhǔn)備數(shù)據(jù)庫(kù) SQL 腳本文件,里面包含了建庫(kù)、建表語(yǔ)句,我們把它放在微服務(wù)項(xiàng)目根目錄的 mysql-init 文件夾中:IrR28資訊網(wǎng)——每日最新資訊28at.com

魚(yú)皮帶大家做的每個(gè)項(xiàng)目都提供了現(xiàn)成的建表語(yǔ)句,這是一個(gè)非常好的開(kāi)發(fā)習(xí)慣,便于其他人快速啟動(dòng)你的項(xiàng)目。IrR28資訊網(wǎng)——每日最新資訊28at.com

由于要在本地啟動(dòng) MySQL,還需要定義一個(gè)文件夾 .mysql-data 來(lái)存放 MySQL 的持久化數(shù)據(jù),防止容器重啟后數(shù)據(jù)丟失。IrR28資訊網(wǎng)——每日最新資訊28at.com

做好這兩點(diǎn)后,就可以編寫(xiě) docker-compose.env.yml 文件了,先只寫(xiě)一個(gè) MySQL 服務(wù),示例代碼如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

關(guān)鍵配置的含義我都寫(xiě)到注釋里了IrR28資訊網(wǎng)——每日最新資訊28at.com

version: '3'services:  mysql:    image: mysql:8 # 使用的鏡像    container_name: yuoj-mysql # 啟動(dòng)的實(shí)例名稱    environment:      MYSQL_ROOT_PASSWORD: 123456 # root 用戶密碼    ports:      - "3306:3306" # 端口映射    volumes:      - ./.mysql-data:/var/lib/mysql # 將數(shù)據(jù)目錄掛載到本地目錄以進(jìn)行持久化      - ./mysql-init:/docker-entrypoint-initdb.d # 自動(dòng)執(zhí)行啟動(dòng)腳本    restart: always # 崩潰后自動(dòng)重啟    networks:      - mynetwork # 指定網(wǎng)絡(luò)networks:  mynetwork: # 自定義網(wǎng)絡(luò),實(shí)現(xiàn)網(wǎng)絡(luò)互通和隔離

寫(xiě)好配置文件后,可以直接在 IDEA 里執(zhí)行 Docker Compose 文件,調(diào)試 MySQL 的運(yùn)行:IrR28資訊網(wǎng)——每日最新資訊28at.com

圖片IrR28資訊網(wǎng)——每日最新資訊28at.com

運(yùn)行成功后,我們可以在本地成功連接數(shù)據(jù)庫(kù):IrR28資訊網(wǎng)——每日最新資訊28at.com

圖片IrR28資訊網(wǎng)——每日最新資訊28at.com

2)Redis

Redis 服務(wù)的定義和啟動(dòng)操作和 MySQL 服務(wù)幾乎一致,Redis 的 Docker Compose 配置示例代碼如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

version: '3'services:  redis:    image: redis:6    container_name: yuoj-redis    ports:      - "6379:6379"    networks:      - mynetwork    volumes:      - ./.redis-data:/data # 持久化networks:  mynetwork:

然后在本地執(zhí)行 Docker Compose 文件,啟動(dòng) Redis 服務(wù),并且嘗試進(jìn)入 Terminal 來(lái)調(diào)試 Redis:IrR28資訊網(wǎng)——每日最新資訊28at.com

3)RabbitMQ

同 MySQL 和 Redis,RabbitMQ 的 Docker Compose 配置示例代碼如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

version: '3'services:  rabbitmq:    image: rabbitmq:3.12.6-management # 支持管理面板的消息隊(duì)列    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:      - mynetworknetworks:  mynetwork:

本地執(zhí)行 Docker Compose 文件,啟動(dòng) RabbitMQ 服務(wù),然后可以訪問(wèn) localhost:15672 查看到管理面板,就表示啟動(dòng)成功了~IrR28資訊網(wǎng)——每日最新資訊28at.com

賬號(hào)密碼都是 guestIrR28資訊網(wǎng)——每日最新資訊28at.com

4)Nacos

和其他服務(wù)一樣,Nacos 也需要編寫(xiě) Docker Compose 配置。IrR28資訊網(wǎng)——每日最新資訊28at.com

但是在選擇 Nacos 鏡像時(shí)必須要注意,建議選擇支持 linux/arm64 架構(gòu)的鏡像版本,比如 v2.2.0-slim,否則后面可能會(huì)無(wú)法運(yùn)行:IrR28資訊網(wǎng)——每日最新資訊28at.com

Nacos 示例配置文件如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

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 # 單節(jié)點(diǎn)模式啟動(dòng)      - PREFER_HOST_MODE=hostname # 支持 hostname      - TZ=Asia/Shanghai # 控制時(shí)區(qū)networks:  mynetwork:

然后在本地執(zhí)行 Docker Compose 啟動(dòng) Nacos,訪問(wèn) localhost:8848/nacos 能夠看到管理頁(yè)面,就表示運(yùn)行成功了~IrR28資訊網(wǎng)——每日最新資訊28at.com

管理頁(yè)面的賬號(hào)和密碼默認(rèn)都是 nacosIrR28資訊網(wǎng)——每日最新資訊28at.com

圖片IrR28資訊網(wǎng)——每日最新資訊28at.com

完整 Docker Compose 文件

分別調(diào)試完上述服務(wù)后,我們把所有的配置拼在一起,就得到了完整的文件,文件名為 docker-compose.env.ymlIrR28資訊網(wǎng)——每日最新資訊28at.com

完整代碼如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

version: '3'services:  mysql:    image: mysql:8 # 使用的鏡像    container_name: yuoj-mysql # 啟動(dòng)的實(shí)例名稱    environment:      MYSQL_ROOT_PASSWORD: 123456 # root 用戶密碼    ports:      - "3306:3306" # 端口映射    volumes:      - ./.mysql-data:/var/lib/mysql # 將數(shù)據(jù)目錄掛載到本地目錄以進(jìn)行持久化      - ./mysql-init:/docker-entrypoint-initdb.d # 啟動(dòng)腳本    restart: always # 崩潰后自動(dòng)重啟    networks:      - mynetwork # 指定網(wǎng)絡(luò)  redis:    image: redis:6    container_name: yuoj-redis    ports:      - "6379:6379"    networks:      - mynetwork    volumes:      - ./.redis-data:/data # 持久化  rabbitmq:    image: rabbitmq:3.12.6-management # 支持管理面板的消息隊(duì)列    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 # 單節(jié)點(diǎn)模式啟動(dòng)      - PREFER_HOST_MODE=hostname # 支持 hostname      - TZ=Asia/Shanghai # 控制時(shí)區(qū)networks:  mynetwork:

1.5、編寫(xiě)業(yè)務(wù)服務(wù)配置

用同樣的方式,我們可以編寫(xiě)業(yè)務(wù)服務(wù)的 Docker Compose 文件,文件名稱 docker-compose.service.ymlIrR28資訊網(wǎng)——每日最新資訊28at.com

示例代碼如下,其中需要格外關(guān)注的配置是 build 和 depends_on:IrR28資訊網(wǎng)——每日最新資訊28at.com

version: '3'services:  yuoj-backend-gateway:    container_name: yuoj-backend-gateway    build: # 服務(wù)的 Docker 構(gòu)建文件位置      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: # 本服務(wù)依賴的服務(wù),控制啟動(dòng)先后順序      - 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# 網(wǎng)絡(luò),不定義的話就是默認(rèn)網(wǎng)絡(luò)networks:  mynetwork:

1.6、調(diào)整程序配置

編寫(xiě)好上述配置文件后,本地嘗試運(yùn)行 Docker Compose 業(yè)務(wù)服務(wù),結(jié)果發(fā)現(xiàn):報(bào)錯(cuò)啦!依賴服務(wù)的地址訪問(wèn)不通!IrR28資訊網(wǎng)——每日最新資訊28at.com

這是由于之前我們的項(xiàng)目訪問(wèn)依賴服務(wù)時(shí),全部是使用了固定的 IP 地址(比如 localhost),而容器內(nèi)部的 localhost(或 127.0.0.1)通常指向容器本身,而不是宿主主機(jī)。所以為了在容器內(nèi)訪問(wèn)其他服務(wù),程序中應(yīng)該使用服務(wù)名稱而不是 localhost。IrR28資訊網(wǎng)——每日最新資訊28at.com

我們給每個(gè) Spring Boot 服務(wù)都增加一套 prod 上線配置,在配置中更改服務(wù)調(diào)用地址。IrR28資訊網(wǎng)——每日最新資訊28at.com

用戶服務(wù)、題目服務(wù)和判題服務(wù)的 application-prod.yml 配置修改如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

# 生產(chǎn)環(huán)境配置文件spring:  # 數(shù)據(jù)庫(kù)配置  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 網(wǎng)關(guān)服務(wù)的配置修改如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

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: reactiveserver:  port: 8101knife4j:  gateway:    enabled: true    strategy: discover    discover:      enabled: true      version: swagger2

然后執(zhí)行 mvn package 命令重新打包、執(zhí)行 Docker Compose。IrR28資訊網(wǎng)——每日最新資訊28at.com

結(jié)果發(fā)現(xiàn)大多數(shù)服務(wù)都啟動(dòng)了,但是判題服務(wù)還有報(bào)錯(cuò)。IrR28資訊網(wǎng)——每日最新資訊28at.com

圖片IrR28資訊網(wǎng)——每日最新資訊28at.com

這是因?yàn)槌绦蛟趧?chuàng)建消息隊(duì)列時(shí)存在硬編碼的變量,指定了 host 為 "localhost",示例代碼如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

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");

舉這個(gè)例子是為了告訴大家,在程序中盡量不要寫(xiě)固定 IP 或域名,全部改為動(dòng)態(tài)讀取配置文件,便于修改。IrR28資訊網(wǎng)——每日最新資訊28at.com

示例修改后的代碼如下:IrR28資訊網(wǎng)——每日最新資訊28at.com

/** * 用于創(chuàng)建測(cè)試程序用到的交換機(jī)和隊(duì)列(只用在程序啟動(dòng)前執(zhí)行一次) */@Slf4j@Componentpublic class InitRabbitMqBean {    @Value("${spring.rabbitmq.host:localhost}")    private String host;    @PostConstruct    public void init() {        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");            // 創(chuàng)建隊(duì)列,隨機(jī)分配一個(gè)隊(duì)列名稱            String queueName = "code_queue";            channel.queueDeclare(queueName, true, false, false, null);            channel.queueBind(queueName, EXCHANGE_NAME, "my_routingKey");            log.info("消息隊(duì)列啟動(dòng)成功");        } catch (Exception e) {            log.error("消息隊(duì)列啟動(dòng)失敗");        }    }}

1.7、測(cè)試訪問(wèn)

修復(fù)上述問(wèn)題后,所有服務(wù)都可以通過(guò) Docker Compose 文件啟動(dòng)了。IrR28資訊網(wǎng)——每日最新資訊28at.com

然后我們?cè)L問(wèn) localhost:8101/doc.html 網(wǎng)關(guān)地址,能夠看到 Swagger 聚合接口文檔。IrR28資訊網(wǎng)——每日最新資訊28at.com

圖片IrR28資訊網(wǎng)——每日最新資訊28at.com

依次調(diào)用用戶注冊(cè) => 登錄 => 獲取登錄用戶信息 => 創(chuàng)建題目接口,全部執(zhí)行成功。IrR28資訊網(wǎng)——每日最新資訊28at.com

至此,第一階段就完成啦。IrR28資訊網(wǎng)——每日最新資訊28at.com

二、服務(wù)器部署

在第二階段,我們的目標(biāo)就是在真實(shí)的 Linux 服務(wù)器上部署微服務(wù)項(xiàng)目。有了第一階段的準(zhǔn)備,第二階段簡(jiǎn)直可以說(shuō)是易如反掌!IrR28資訊網(wǎng)——每日最新資訊28at.com

2.1、準(zhǔn)備服務(wù)器

首先,我們要有一臺(tái) Linux 服務(wù)器。IrR28資訊網(wǎng)——每日最新資訊28at.com

選擇服務(wù)器前,我們必須要評(píng)估下微服務(wù)項(xiàng)目的內(nèi)存占用,千萬(wàn)別把服務(wù)器的內(nèi)存買小了!IrR28資訊網(wǎng)——每日最新資訊28at.com

可以使用 Docker Desktop 直接查看內(nèi)存占用,虛擬機(jī)內(nèi)存大概占用了 8 個(gè) G、容器實(shí)際內(nèi)存占用了 4 個(gè) G:IrR28資訊網(wǎng)——每日最新資訊28at.com

圖片IrR28資訊網(wǎng)——每日最新資訊28at.com

那我們搞多少內(nèi)存的服務(wù)器呢?IrR28資訊網(wǎng)——每日最新資訊28at.com

我猜很多同學(xué)會(huì)說(shuō) 8 G,奈何我天生反骨,明知山有虎偏向虎山行(主要是想省

本文鏈接:http://www.www897cc.com/showinfo-26-11808-0.html還不會(huì)部署微服務(wù)項(xiàng)目?保姆級(jí)教程來(lái)啦!

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 繼續(xù)聊聊云平臺(tái)運(yùn)維規(guī)范

下一篇: 低代碼平臺(tái)組件間通信方案復(fù)盤

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 消息稱迪士尼要拍真人版《魔發(fā)奇緣》:女主可能也找黑人演員

    8月5日消息,迪士尼確實(shí)有點(diǎn)忙,忙著將不少動(dòng)畫(huà)改成真人版,繼《美人魚(yú)》后,真人版《白雪公主》、《魔發(fā)奇緣》也在路上了。據(jù)外媒消息稱,迪士尼將打造真人版
  • 掘力計(jì)劃第 20 期:Flutter 混合開(kāi)發(fā)的混亂之治

    在掘力計(jì)劃系列活動(dòng)第20場(chǎng),《Flutter 開(kāi)發(fā)實(shí)戰(zhàn)詳解》作者,掘金優(yōu)秀作者,Github GSY 系列目負(fù)責(zé)人戀貓的小郭分享了Flutter 混合開(kāi)發(fā)的混亂之治。Flutter 基于自研的 Skia 引擎
  • 一篇聊聊Go錯(cuò)誤封裝機(jī)制

    %w 是用于錯(cuò)誤包裝(Error Wrapping)的格式化動(dòng)詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數(shù)中的一個(gè)特殊格式化動(dòng)詞,用于將一個(gè)錯(cuò)誤(或其他可打印的值)包裝在一個(gè)新的錯(cuò)誤中。使
  • 得物效率前端微應(yīng)用推進(jìn)過(guò)程與思考

    一、背景效率工程隨著業(yè)務(wù)的發(fā)展,組織規(guī)模的擴(kuò)大,越來(lái)越多的企業(yè)開(kāi)始意識(shí)到協(xié)作效率對(duì)于企業(yè)團(tuán)隊(duì)的重要性,甚至是決定其在某個(gè)行業(yè)競(jìng)爭(zhēng)中突圍的關(guān)鍵,是企業(yè)長(zhǎng)久生存的根本。得物
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個(gè)人開(kāi)發(fā)仿造稿定設(shè)計(jì)的圖片編輯器到現(xiàn)在,不知不覺(jué)已過(guò)去一年時(shí)間了,期間我經(jīng)歷了裁員失業(yè)、面試找工作碰壁,寒冬下一直沒(méi)有很好地履行計(jì)劃.....這些就放在日
  • 網(wǎng)紅炒股不為了賺錢,那就是耍流氓!

    來(lái)源:首席商業(yè)評(píng)論6月26日高調(diào)宣布入市,網(wǎng)絡(luò)名嘴大v胡錫進(jìn)居然進(jìn)軍了股市。在一次財(cái)經(jīng)媒體峰會(huì)上,幾個(gè)財(cái)經(jīng)圈媒體大佬就&ldquo;胡錫進(jìn)炒股是否知道認(rèn)真報(bào)道&rdquo;展開(kāi)討論。有
  • 攜眾多高端產(chǎn)品亮相ChinaJoy,小米帶來(lái)一場(chǎng)科技與人文的視聽(tīng)盛宴

    7月28日,全球數(shù)字娛樂(lè)領(lǐng)域最具知名度與影響力的年度盛會(huì)中國(guó)國(guó)際數(shù)碼互動(dòng)娛樂(lè)展覽會(huì)(簡(jiǎn)稱ChinaJoy)在上海新國(guó)際博覽中心盛大開(kāi)幕。作為全球領(lǐng)先的科
  • 蘋(píng)果公司要求三星和LG Display生產(chǎn)「無(wú)邊框」OLED iPhone顯示屏

    據(jù) The Elec 報(bào)道,蘋(píng)果已要求其供應(yīng)商為未來(lái)的 iPhone 型號(hào)開(kāi)發(fā)「無(wú)邊框」OLED 顯示面板。蘋(píng)果顯然已要求三星和 LG Display 開(kāi)發(fā)新的 OLED 顯示面
  • 蘋(píng)果MacBook Pro 2021測(cè)試:仍不支持平滑滾動(dòng)

    據(jù)10月30日9to5 Mac 消息報(bào)道,蘋(píng)果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯(cuò)的評(píng)價(jià),亮點(diǎn)包括行業(yè)領(lǐng)先的性能,令人印象深刻的電池續(xù)航,精美豐
Top 主站蜘蛛池模板: 新邵县| 阿拉善左旗| 大理市| 屏山县| 聂拉木县| 平乐县| 古浪县| 洛隆县| 库尔勒市| 鹤岗市| 中牟县| 克拉玛依市| 扎赉特旗| 闽侯县| 泽普县| 五河县| 全南县| 射洪县| 武川县| 武宣县| 邯郸县| 航空| 郧西县| 宜都市| 荣成市| 福贡县| 天镇县| 南陵县| 泰安市| 瑞昌市| 冷水江市| 台江县| 武胜县| 沭阳县| 济宁市| 瑞安市| 友谊县| 宁远县| 天长市| 太白县| 明溪县|