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

當前位置:首頁 > 科技  > 軟件

還不會部署微服務項目?保姆級教程來啦!

來源: 責編: 時間:2023-09-28 10:05:07 369觀看
導讀大家好,我是魚皮。項目上線是每位學編程同學必須掌握的基本技能。之前我已經給大家分享過很多種上線單體項目的方法了,今天再出一期微服務項目的部署教程,用一種最簡單的方法,帶大家輕松部署微服務項目。開始之前,先做個小

大家好,我是魚皮。sKo28資訊網——每日最新資訊28at.com

項目上線是每位學編程同學必須掌握的基本技能。之前我已經給大家分享過很多種上線單體項目的方法了,今天再出一期微服務項目的部署教程,用一種最簡單的方法,帶大家輕松部署微服務項目。sKo28資訊網——每日最新資訊28at.com

開始之前,先做個小調研啊,大家更喜歡看 “真實踩坑版” 的教程還是 “壓縮純凈版” 的教程呢?sKo28資訊網——每日最新資訊28at.com

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

更推薦看視頻版:https://www.bilibili.com/video/BV1Cp4y1F7eA/sKo28資訊網——每日最新資訊28at.com

項目介紹

這次的教程以我帶大家全程直播手把手開發的、基于 Spring Cloud + Docker 代碼沙箱的 在線判題系統 為例,進行演示。sKo28資訊網——每日最新資訊28at.com

這個項目的核心功能是讓用戶能夠在線選題和做題,然后由系統自動判題:sKo28資訊網——每日最新資訊28at.com

圖片sKo28資訊網——每日最新資訊28at.com

項目用到的核心依賴包括:MySQL 數據庫、Redis 緩存、RabbitMQ 消息隊列、Nacos 注冊中心sKo28資訊網——每日最新資訊28at.com

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

圖片sKo28資訊網——每日最新資訊28at.com

傳統部署

對于這樣一個項目,如果我們還用傳統單機項目的部署方式,一個個打 jar 包、用 Java 命令來啟動,會有哪些問題呢?sKo28資訊網——每日最新資訊28at.com

  1. 要一個個安裝依賴,比如 MySQL 數據庫、Redis、消息隊列、Nacos,非常麻煩!
  2. 要一個個打 jar 包、一個個手動運行 jar 包,非常麻煩!
  3. 不方便集中觀察所有服務的運行狀態和資源占用情況

所以,為了解決這些問題,我們會選用一種更高效的微服務部署方式 —— Docker Compose。sKo28資訊網——每日最新資訊28at.com

Docker Compose 介紹

在介紹 Docker Compose 前,先簡單介紹下 Docker。sKo28資訊網——每日最新資訊28at.com

Docker 是一種容器技術,允許開發者將應用程序和所有依賴項(如代碼、庫、配置等)制作為 鏡像。可以把鏡像簡單理解為軟件安裝包,可以在不同的計算機上通過它快速安裝和啟動應用程序(容器),這些程序獨立隔離地運行,不受外部環境的影響。sKo28資訊網——每日最新資訊28at.com

圖片sKo28資訊網——每日最新資訊28at.com

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

圖片sKo28資訊網——每日最新資訊28at.com

需要注意的是,Docker Compose 通常適用于把所有微服務部署在同一臺服務器的場景,在真實的企業級項目中,往往會使用 K8S 等更專業的容器編排和自動化部署工具,更方便地在多個服務器上部署容器。sKo28資訊網——每日最新資訊28at.com

部署流程

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

一、本地部署sKo28資訊網——每日最新資訊28at.com

  1. 梳理服務部署表格
  2. Maven 子父模塊打包
  3. Dockerfile 編寫
  4. 編寫環境依賴配置
  5. 編寫服務配置
  6. 調整程序配置
  7. 測試訪問

二、服務端部署sKo28資訊網——每日最新資訊28at.com

  1. 準備服務器
  2. Docker Compose 安裝
  3. 同步文件
  4. 獲取 jar 包
  5. 服務啟動
  6. 測試訪問

一、本地部署

第一階段是本地部署,也可以叫做部署準備。sKo28資訊網——每日最新資訊28at.com

強烈建議大家,比起直接操作線上服務器,最好是先在本地把所有的流程跑通,風險更低、效率更高。sKo28資訊網——每日最新資訊28at.com

這里我使用的是 Mac 操作系統,已經安裝了 Docker Desktop 軟件,管理 Docker 容器會更方便一些。sKo28資訊網——每日最新資訊28at.com

圖片sKo28資訊網——每日最新資訊28at.com

對于本地沒有 Docker 環境的同學,這一階段仔細看一遍有個印象就足夠了。可以直接拿我調試好的配置文件在服務器上部署,而不用自己調試。sKo28資訊網——每日最新資訊28at.com

怎么樣,夠貼心吧!可以叫我 “保姆魚皮”,簡稱 “保姆皮”。sKo28資訊網——每日最新資訊28at.com

圖片sKo28資訊網——每日最新資訊28at.com

1.1、梳理服務部署表格

在部署微服務項目前,首先要規劃好要部署哪些服務、以及各服務的關鍵信息,比如服務名稱、版本號、占用端口號、關鍵配置等。sKo28資訊網——每日最新資訊28at.com

對于我的在線判題項目,梳理好的服務表格如下:sKo28資訊網——每日最新資訊28at.com

服務名稱
sKo28資訊網——每日最新資訊28at.com

英文名
sKo28資訊網——每日最新資訊28at.com

端口號
sKo28資訊網——每日最新資訊28at.com

版本號
sKo28資訊網——每日最新資訊28at.com

服務類別
sKo28資訊網——每日最新資訊28at.com

數據庫
sKo28資訊網——每日最新資訊28at.com

mysql
sKo28資訊網——每日最新資訊28at.com

3306
sKo28資訊網——每日最新資訊28at.com

v8
sKo28資訊網——每日最新資訊28at.com

環境依賴
sKo28資訊網——每日最新資訊28at.com

緩存
sKo28資訊網——每日最新資訊28at.com

redis
sKo28資訊網——每日最新資訊28at.com

6379
sKo28資訊網——每日最新資訊28at.com

v6
sKo28資訊網——每日最新資訊28at.com

環境依賴
sKo28資訊網——每日最新資訊28at.com

消息隊列
sKo28資訊網——每日最新資訊28at.com

rabbitmq
sKo28資訊網——每日最新資訊28at.com

5672, 15672
sKo28資訊網——每日最新資訊28at.com

v3.12.6
sKo28資訊網——每日最新資訊28at.com

環境依賴
sKo28資訊網——每日最新資訊28at.com

注冊中心
sKo28資訊網——每日最新資訊28at.com

nacos
sKo28資訊網——每日最新資訊28at.com

8848
sKo28資訊網——每日最新資訊28at.com

v2.2.0
sKo28資訊網——每日最新資訊28at.com

環境依賴
sKo28資訊網——每日最新資訊28at.com

網關服務
sKo28資訊網——每日最新資訊28at.com

gateway
sKo28資訊網——每日最新資訊28at.com

8101
sKo28資訊網——每日最新資訊28at.com

java 8
sKo28資訊網——每日最新資訊28at.com

業務服務
sKo28資訊網——每日最新資訊28at.com

用戶服務
sKo28資訊網——每日最新資訊28at.com

yuoj-backend-user-service
sKo28資訊網——每日最新資訊28at.com

8102
sKo28資訊網——每日最新資訊28at.com

java 8
sKo28資訊網——每日最新資訊28at.com

業務服務
sKo28資訊網——每日最新資訊28at.com

題目服務
sKo28資訊網——每日最新資訊28at.com

yuoj-backend-question-service
sKo28資訊網——每日最新資訊28at.com

8103
sKo28資訊網——每日最新資訊28at.com

java 8
sKo28資訊網——每日最新資訊28at.com

業務服務
sKo28資訊網——每日最新資訊28at.com

判題服務
sKo28資訊網——每日最新資訊28at.com

yuoj-backend-judge-service
sKo28資訊網——每日最新資訊28at.com

8104
sKo28資訊網——每日最新資訊28at.com

java 8
sKo28資訊網——每日最新資訊28at.com

業務服務
sKo28資訊網——每日最新資訊28at.com

為什么這里我要劃分服務類別為 “環境依賴” 和 “業務服務” 呢?sKo28資訊網——每日最新資訊28at.com

因為在啟動服務時,必須要先啟動環境依賴,才能啟動業務服務,否則就會報類似 “無法連接數據庫” 之類的錯誤。sKo28資訊網——每日最新資訊28at.com

1.2、Maven 子父模塊打包

對于微服務項目,我們通常是使用 Maven 的子父模塊功能進行管理的。需要部署項目時,不用針對每個子服務單獨執行 mvn package 命令進行打包,而是可以一鍵打包所有服務。sKo28資訊網——每日最新資訊28at.com

想要實現這個功能,需要給子父模塊的依賴文件(pom.xml)進行一些配置,主要包括:sKo28資訊網——每日最新資訊28at.com

1)父模塊配置

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

示例代碼如下:sKo28資訊網——每日最新資訊28at.com

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

2)子模塊配置

修改所有需要啟動 Spring Boot 的服務(用戶服務、題目服務、判題服務、網關服務)的子模塊 pom.xml 文件。sKo28資訊網——每日最新資訊28at.com

主要是增加 executions 配置,使用 spring-boot-maven-plugin 的 repackage 命令來構建子模塊,從而自動在構建時將公共模塊的依賴打入 jar 包。sKo28資訊網——每日最新資訊28at.com

示例代碼如下:sKo28資訊網——每日最新資訊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 編寫

Dockerfile 是定義 Docker 容器鏡像構建過程的文件,包括容器鏡像使用的基礎環境、容器內的依賴和文件、容器的配置、啟動命令等。sKo28資訊網——每日最新資訊28at.com

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

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

這里魚皮給大家提供 2 種常用的 Spring Boot 項目的 Dockerfile。sKo28資訊網——每日最新資訊28at.com

1)復制 jar 包版

思路:在本地打好 jar 包后,復制 jar 包到容器中運行sKo28資訊網——每日最新資訊28at.com

示例代碼如下:sKo28資訊網——每日最新資訊28at.com

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

2)Maven 打包版

思路:復制本地代碼到容器中,在容器中使用 Maven 打包再運行sKo28資訊網——每日最新資訊28at.com

示例代碼如下:sKo28資訊網——每日最新資訊28at.com

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

此處由于我們的微服務項目可以一鍵打好所有子服務的 jar 包,就沒必要每個服務單獨在容器中打包了,所以選擇第一種方式的 Dockerfile。sKo28資訊網——每日最新資訊28at.com

我們需要給每個 Spring Boot 服務(用戶服務、題目服務、判題服務、網關服務)都編寫一個 Dockerfile,放到每個子服務的根目錄下。sKo28資訊網——每日最新資訊28at.com

以用戶服務為例,示例代碼如下:sKo28資訊網——每日最新資訊28at.com

# 基礎鏡像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  # 啟動命令ENTRYPOINT ["java","-jar","/app/yuoj-backend-user-service-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]

建議先在本地利用 IDEA 開發工具調通鏡像構建流程,確保每個 Dockerfile 都是可以成功制作鏡像的:sKo28資訊網——每日最新資訊28at.com

圖片sKo28資訊網——每日最新資訊28at.com

查看容器的啟動日志,發現能夠啟動服務、看到 Spring 圖標即可:sKo28資訊網——每日最新資訊28at.com

1.4、編寫環境依賴配置

接下來,我們就要編寫 Docker Compose 的配置文件了,可以根據配置文件快速啟動多個服務。sKo28資訊網——每日最新資訊28at.com

之前我們已經梳理了服務部署表格,將服務劃分為了 “環境依賴” 和 “業務服務”。sKo28資訊網——每日最新資訊28at.com

由于業務服務依賴 MySQL 等環境依賴,所以需要拆分 2 套 Docker Compose 的配置文件,分別為 docker-compose.env.yml 環境配置和 docker-compose.service.yml 業務服務配置,保證先成功啟動依賴,再啟動服務。sKo28資訊網——每日最新資訊28at.com

學過 Docker Compose 的同學可能聽說過 depends_on 配置,也能決定服務的啟動順序。但是千萬注意,depends_on 并不會等待服務完全就緒,只是確保它們在啟動時的順序,并不穩定。sKo28資訊網——每日最新資訊28at.com

如何編寫 Docker Compose 文件呢?sKo28資訊網——每日最新資訊28at.com

和 Dockerfile 一樣,直接去網上找現成的 Docker Compose file,復制粘貼過來略做修改就能使用了~sKo28資訊網——每日最新資訊28at.com

再配合以下 2 個網站,完全無需記憶 Docker Compose 的寫法!sKo28資訊網——每日最新資訊28at.com

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

當然,現在 AI 時代了,還有更簡單的方式!sKo28資訊網——每日最新資訊28at.com

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

示例 prompt:sKo28資訊網——每日最新資訊28at.com

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

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

圖片sKo28資訊網——每日最新資訊28at.com

由于這篇文章是教程嘛,我就帶大家通過調試的方式一步步完成 Docker Compose 文件,最后會把完整的 Docker Compose 文件給大家分享出來,大家直接用就行了~sKo28資訊網——每日最新資訊28at.com

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

1)MySQL

我們不僅要創建一個 MySQL 服務,還要在創建服務后自動創建我們需要的庫表結構。sKo28資訊網——每日最新資訊28at.com

所以需要先準備數據庫 SQL 腳本文件,里面包含了建庫、建表語句,我們把它放在微服務項目根目錄的 mysql-init 文件夾中:sKo28資訊網——每日最新資訊28at.com

魚皮帶大家做的每個項目都提供了現成的建表語句,這是一個非常好的開發習慣,便于其他人快速啟動你的項目。sKo28資訊網——每日最新資訊28at.com

由于要在本地啟動 MySQL,還需要定義一個文件夾 .mysql-data 來存放 MySQL 的持久化數據,防止容器重啟后數據丟失。sKo28資訊網——每日最新資訊28at.com

做好這兩點后,就可以編寫 docker-compose.env.yml 文件了,先只寫一個 MySQL 服務,示例代碼如下:sKo28資訊網——每日最新資訊28at.com

關鍵配置的含義我都寫到注釋里了sKo28資訊網——每日最新資訊28at.com

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 的運行:sKo28資訊網——每日最新資訊28at.com

圖片sKo28資訊網——每日最新資訊28at.com

運行成功后,我們可以在本地成功連接數據庫:sKo28資訊網——每日最新資訊28at.com

圖片sKo28資訊網——每日最新資訊28at.com

2)Redis

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

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:sKo28資訊網——每日最新資訊28at.com

3)RabbitMQ

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

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:      - mynetworknetworks:  mynetwork:

本地執行 Docker Compose 文件,啟動 RabbitMQ 服務,然后可以訪問 localhost:15672 查看到管理面板,就表示啟動成功了~sKo28資訊網——每日最新資訊28at.com

賬號密碼都是 guestsKo28資訊網——每日最新資訊28at.com

4)Nacos

和其他服務一樣,Nacos 也需要編寫 Docker Compose 配置。sKo28資訊網——每日最新資訊28at.com

但是在選擇 Nacos 鏡像時必須要注意,建議選擇支持 linux/arm64 架構的鏡像版本,比如 v2.2.0-slim,否則后面可能會無法運行:sKo28資訊網——每日最新資訊28at.com

Nacos 示例配置文件如下:sKo28資訊網——每日最新資訊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 # 單節點模式啟動      - PREFER_HOST_MODE=hostname # 支持 hostname      - TZ=Asia/Shanghai # 控制時區networks:  mynetwork:

然后在本地執行 Docker Compose 啟動 Nacos,訪問 localhost:8848/nacos 能夠看到管理頁面,就表示運行成功了~sKo28資訊網——每日最新資訊28at.com

管理頁面的賬號和密碼默認都是 nacossKo28資訊網——每日最新資訊28at.com

圖片sKo28資訊網——每日最新資訊28at.com

完整 Docker Compose 文件

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

完整代碼如下:sKo28資訊網——每日最新資訊28at.com

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.ymlsKo28資訊網——每日最新資訊28at.com

示例代碼如下,其中需要格外關注的配置是 build 和 depends_on:sKo28資訊網——每日最新資訊28at.com

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 業務服務,結果發現:報錯啦!依賴服務的地址訪問不通!sKo28資訊網——每日最新資訊28at.com

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

我們給每個 Spring Boot 服務都增加一套 prod 上線配置,在配置中更改服務調用地址。sKo28資訊網——每日最新資訊28at.com

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

# 生產環境配置文件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 網關服務的配置修改如下:sKo28資訊網——每日最新資訊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

然后執行 mvn package 命令重新打包、執行 Docker Compose。sKo28資訊網——每日最新資訊28at.com

結果發現大多數服務都啟動了,但是判題服務還有報錯。sKo28資訊網——每日最新資訊28at.com

圖片sKo28資訊網——每日最新資訊28at.com

這是因為程序在創建消息隊列時存在硬編碼的變量,指定了 host 為 "localhost",示例代碼如下:sKo28資訊網——每日最新資訊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");

舉這個例子是為了告訴大家,在程序中盡量不要寫固定 IP 或域名,全部改為動態讀取配置文件,便于修改。sKo28資訊網——每日最新資訊28at.com

示例修改后的代碼如下:sKo28資訊網——每日最新資訊28at.com

/** * 用于創建測試程序用到的交換機和隊列(只用在程序啟動前執行一次) */@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");            // 創建隊列,隨機分配一個隊列名稱            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 文件啟動了。sKo28資訊網——每日最新資訊28at.com

然后我們訪問 localhost:8101/doc.html 網關地址,能夠看到 Swagger 聚合接口文檔。sKo28資訊網——每日最新資訊28at.com

圖片sKo28資訊網——每日最新資訊28at.com

依次調用用戶注冊 => 登錄 => 獲取登錄用戶信息 => 創建題目接口,全部執行成功。sKo28資訊網——每日最新資訊28at.com

至此,第一階段就完成啦。sKo28資訊網——每日最新資訊28at.com

二、服務器部署

在第二階段,我們的目標就是在真實的 Linux 服務器上部署微服務項目。有了第一階段的準備,第二階段簡直可以說是易如反掌!sKo28資訊網——每日最新資訊28at.com

2.1、準備服務器

首先,我們要有一臺 Linux 服務器。sKo28資訊網——每日最新資訊28at.com

選擇服務器前,我們必須要評估下微服務項目的內存占用,千萬別把服務器的內存買小了!sKo28資訊網——每日最新資訊28at.com

可以使用 Docker Desktop 直接查看內存占用,虛擬機內存大概占用了 8 個 G、容器實際內存占用了 4 個 G:sKo28資訊網——每日最新資訊28at.com

圖片sKo28資訊網——每日最新資訊28at.com

那我們搞多少內存的服務器呢?sKo28資訊網——每日最新資訊28at.com

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

本文鏈接:http://www.www897cc.com/showinfo-26-11808-0.html還不會部署微服務項目?保姆級教程來啦!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 繼續聊聊云平臺運維規范

下一篇: 低代碼平臺組件間通信方案復盤

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 平乐县| 盱眙县| 桐乡市| 亚东县| 明光市| 阿尔山市| 新泰市| 元江| 桓台县| 德钦县| 七台河市| 沙洋县| 万全县| 苗栗县| 故城县| 山东省| 襄汾县| 安溪县| 竹溪县| 三穗县| 周至县| 册亨县| 合川市| 堆龙德庆县| 颍上县| 常山县| 招远市| 都昌县| 新乡县| 永修县| 洞头县| 东丽区| 囊谦县| 毕节市| 响水县| 拉孜县| 黎川县| 印江| 五莲县| 榕江县| 凌海市|