如何快速部署上線項目

CSDN 的小伙伴們,大家好呀,我是蒼何。

今天在群里面看到有小伙伴反饋說,面試的時候一被問到簡歷中的項目還沒上線,就不繼續問了,感覺挺奇葩的,要知道就校招來說,項目本身大部分都是練手的項目,上線也得花費很多的成本啊。

群友反饋項目沒上線就沒下文

就 Java 應用來說本身是很吃內存的,再者現在不拿個微服務項目掛簡歷又拿不出手,但一上線微服務,服務器資源耗費將會是之前的好幾倍。就拿 PmHub 來說,之前單體的時候,1 核 2G 的服務器,跑的還可以。

但一換上微服務,即使升級為 4 核 8G, 服務還沒全開的情況下,內存一樣被打滿,不得已把運行 CI/CD 的 Jenkins 給關了才得以「保命」。

我的服務器資源占用整體情況

我的服務器資源占用細節

而且該說不說,現在的云服務器續費也是貴的離譜,省下好幾個月的余糧才咬牙升級配置。(為了項目有個舒服的體驗環境也是拼了😂)

含淚升級云服務器

說回面試需要項目上線的問題,我覺得主要有兩個辦法,一是本地電腦部署外掛內網穿透出去,這樣也省去買域名和服務器一堆操作,是性價比最高的。但缺點就是電腦不能關,直到拿到 offer 結束。

當然條件允許的話也可以體驗一把部署上線的快感。為什么說是快感呢?有經驗的開發應該清楚,每次上線都是激動人心的時刻,線下愛你千萬遍,不如線上見一面。上線一次就順利的算是運氣好,很多情況,上線總要出問題。

c8177f3e6709c93d829448ccecc21ed9d00054a8.webp

今天分享一下我們項目的容器化部署實戰,希望對你有幫助。

什么是 Docker 容器

當把環境從一個服務器遷移到另一個服務器,當你新買了電腦,會遇上要重新安裝一系列的軟件,比如 JDK、Tomcat、Maven、Redis 等,而安裝完之后每一次都需要再去配置環境,但是這些都是重復性的工作,有什么辦法可以解決呢?

玩過云服務器的聽說過有鏡像一說,將所有的軟件和需要的配置都打包好做成鏡像,下次需要的時候只需要安裝鏡像就可以。

類似的,Docker 就是解決這種問題的,將所有的軟件程序都放在 Docker 倉庫中,我們只需要在電腦上下載 Docker 即可,不需要再去進行繁瑣的安裝和配置了,只需要幾個命令就可以將我們的環境搭建好,這就是 Docker。

docker

總結來說, Docker 是一個開源的應用容器引擎;是一個輕量級容器技術,Docker 支持將軟件編譯成一個鏡像;然后在鏡像中各種軟件做好配置,將鏡像發布出去,其他使用者可以直接使用這個鏡像;運行中的這個鏡像稱為容器,容器啟動是非常快速的。

Docker 架構

Docker 的工作原理如下:

docker工作原理(來源于 X)

通過下圖可以得知,Docker在運行時分為Docker引擎(服務端守護進程)和客戶端工具,我們日常使用各種docker命令,其實就是在使用客戶端工具與Docker引擎進行交互。

docker架構圖(來源于網絡)

Dockerfile

在 Docker 中構建鏡像最常用的方式,就是使用Dockerfile。Dockerfile是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。官方文檔:https://docs.docker.com/engine/reference/builder。

就是可以存放構建啟動指令,可以用來動態構建 docker 鏡像容器的文件。

為什么要用 Docker-Compose

因為是微服務項目,經常來說,單獨去啟動每個服務太麻煩了,而且有些服務間有啟動順序,有需要數據庫服務容器、緩存容器等這些。

這就需要用到 Docker-Compose,它是用于定義和運行多容器 Docker 應用程序的工具。通過Compose,您可以使用YAML文件來配置應用程序所需要的服務。然后使用一個命令,就可以通過YAML配置文件創建并啟動所有服務。

我們的項目用的也是 Docker-Compose,可以做到一條命令就可以啟動所有服務容器,主打一個高效

項目上線實戰

本地構建

1、前端構建

前端的 vue 進行構建的時候還是比較吃資源的,如果資源配置不足的情況下,可以在本地電腦構建,然后將構建好后的 dist 文件上傳到服務器即可。

如果.gitignore 忽略了 dist 的提交,記得注釋掉!

npm run build:prod

構建好后生成的靜態文件

后端構建

后端打包構建完全可以放在服務器上,后面配合 CI/CD 構建腳本,可以做到自動化打包構建部署上線,它其實也就是一條命令即可。

# 切換到目錄
cd /你的安裝目錄/
# 包構建項目
mvn -T 1C clean package -Dmaven.test.skip=true -Dmaven.compile.fork=true

構建完成后,在每個項目的 target 下面就可以看到打包好的 jar 包:

jar包的位置

阿里云開啟安全組

如果服務器是阿里云的話,在操作云服務器之前,先需要開啟阿里云的安全組,進行端口的放開。一般來說,云服務器的端口由以下兩個控制。

  • 安全組放開端口
  • 防火墻開啟端口

阿里云開啟安全組

下載項目

接下來就是在云服務器上 clone 項目:

# 進去目錄
cd /你的安裝目錄git clone git@github.com:laigeoffer/pmhub.git

拷貝 jar 包

微服務的 jar 包分散在各自的模塊,不大方便操作,因此提供了一鍵復制 jar 包合相關配置文件到統一地方的 shell 腳本如下:

#!/bin/sh# 復制項目的文件到對應docker路徑,便于一鍵生成鏡像。
usage() {echo "Usage: sh copy.sh"exit 1
}# copy sql
echo "begin copy sql "
cp ../sql/pmhub_20240305.sql ./mysql/db
cp ../sql/pmhub_nacos_20240423.sql ./mysql/db# copy html
echo "begin copy html "
cp -r ../pmhub-ui/dist/** ./nginx/html/dist# copy jar
echo "begin copy pmhub-gateway "
cp ../pmhub-gateway/target/pmhub-gateway.jar ./pmhub/gateway/jarecho "begin copy pmhub-auth "
cp ../pmhub-auth/target/pmhub-auth.jar ./pmhub/auth/jarecho "begin copy pmhub-monitor "
cp ../pmhub-monitor/target/pmhub-monitor.jar  ./pmhub/monitor/jarecho "begin copy pmhub-system "
cp ../pmhub-modules/pmhub-system/target/pmhub-system.jar ./pmhub/modules/system/jarecho "begin copy pmhub-job "
cp ../pmhub-modules/pmhub-job/target/pmhub-job.jar ./pmhub/modules/job/jarecho "begin copy pmhub-gen "
cp ../pmhub-modules/pmhub-gen/target/pmhub-gen.jar ./pmhub/modules/gen/jarecho "begin copy pmhub-project "
cp ../pmhub-modules/pmhub-project/target/pmhub-project.jar ./pmhub/modules/project/jarecho "begin copy pmhub-workflow "
cp ../pmhub-modules/pmhub-workflow/target/pmhub-workflow.jar ./pmhub/modules/workflow/jar

這樣就可以將 jar 包合配置文件統一路徑,方便管理和一鍵啟動。

開啟服務器防火墻

服務器防火墻端口的開啟也是基于阿里云安全組開啟之后,其實開啟命令比較簡單,如果是 Debian 系統的話是:

ufw allow 9849/tcp

如果是 centos 系統:

firewall-cmd --add-port=80/tcp --permanent

但是端口有好多,能不能一次性開啟呢?可以的,同樣編寫 shell 腳本,一鍵啟動即可:

sh deploy.sh port
# 查看是否開啟
ufw status

啟動 Nginx

Nginx 我建議不要通過容器來安裝,直接安裝在宿主機上會比較好。

安裝方法如下:

# 更新系統
1、安裝
apt install -y nginx
2、看版本號
nginx -v
# 顯示nginx的版本號和編譯信息
nginx -V
# 查看安裝的所有 Nginx 包
# 查看 Nginx 安裝相關的文件位置信息
whereis nginx3、啟動Nginx
cd /usr/sbin/
./nginx4、查詢進程:ps -ef | grep nginx
查看進程id
ps -C nginx -o pid5、檢查配置是否正確
nginx -t重啟命令:systemctl restart nginx6、使配置生效nginx -s reload

在 nginx 中配置前段的 dist 文件所在的路徑以及域名和 https 即可完成反向代理。意味著你就可以直接通過域名訪問到網站啦

一鍵啟動基礎環境

基礎環境包括 MySQL、Redis、Nacos 等,同樣構建了 shell 腳本方便一鍵啟動。

# 進去目錄
cd /安裝路徑/pmhub/docker# 啟動基礎環境(必須)
sh deploy.sh base

其實內部也就是幾個 docker-compose 啟動命令:

# 啟動基礎環境(必須)
base(){docker-compose up -d pmhub-mysql pmhub-redis pmhub-nacos
}

一鍵啟動應用服務

同里,我們將需要一次性啟動的幾個服務放在一鍵啟動腳本中即可一鍵啟動,但是如果服務器 CPU 核數不足,不建議一次啟動過多服務,否則直接就會把服務器搞咋了,推薦還是單個服務啟動并觀察內存使用情況。

docker-compose up -d 你要啟動的服務

擴展:jar 包啟動

如果在本地或者不想通過 docker 的方式啟動,也完全可以用 jar 的方式啟動,但并不推薦,一來比較慢,二來不方便。

舉個例子,需要啟動 pmhub-gateway:

# 定位到jar目錄
cd /你的安裝目錄/pmhub/docker/pmhub/gateway/jar# 后臺啟動
java -jar pmhub-gateway.jar & # 查看是否啟動
netstat -tuln | grep 6880
或者
ps aux | grep pmhub-gateway.jar# 如何關閉服務
kill 12345

至此,在服務器上部署上線服務就已經完成,但還有不少的細節,比如域名如何配置啊,如何進行 ssl 解析啊,如何進行 CI/CD 自動化部署啊,這些其實都需要自己手動去玩了才能搞明白。

如果是在大公司,上線流程其實還更復雜,一個優秀的程序員一定是懂的上線的流程的,我想這可能是面試官為什么對未上線項目這么在意的一些原因吧(個人觀點)。

ending

歷經幾個月時間,我們的的首個開源項目就要上線了,這是一套基于 SpringCloud & SpringCloud Alibaba & LLM 的分布式微服務的智能項目管理系統,這個項目旨在讓同學們快速掌握微服務/分布式項目的架構設計和開發流程,如果想在校招或者社招中拿到一個滿意的 offer, 這個項目將是一個非常 nice 的選擇。

項目包括認證、流程、項目管理、系統、網關等服務。包含了 Redis 緩存、RocketMQ 消息隊列、Docker 容器化、Jenkins 自動化部署、Spring Security 安全框架、Nacos 服務注冊和發現、sentinel 分布式事務、Spring Boot Actuator 服務監控、SkyWalking 鏈路追蹤、OAuth2 統一認證、OpenFeign 服務調用,Vue3 前端框架等互聯網開發中需要用到的主流技術棧,可以幫助同學們快速掌握微服務/分布式項目的核心知識點。

并且同時也是一套企業工作流的開發框架,您可以根據自身需求,快速定制出適合自己公司的企業工作流系統。

項目目前已經取得** 24 個 star** 了(每一個 star 都格外珍惜)

真希望能盡快和大家見面呀!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21684.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21684.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21684.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux基礎1-基本指令3

上篇文章我們說到了文件,pwd,touch,mkdir等知識。 Linux基礎1-基本指令2(你真的了解文件嗎?)-CSDN博客 本文繼續梳理其他基礎命令 1.本章重點 1.刪除一個空目錄命令rmdir 2.刪除一個文件指令rm(重要!) 3.man命令&am…

Lf工作流自定義html節點

1.定義js文件CustomCircle.js import { HtmlNode, HtmlNodeModel } from "logicflow/core"; class UmlModel extends HtmlNodeModel {setAttributes() {this.text.editable false; // 禁止節點文本編輯// 設置節點寬高和錨點const width 120;const height 70;thi…

做視頻號小店保證金要交多少?保證金提現條件是什么?

大家好,我是噴火龍。 做視頻號小店也是需要繳納保證金的,保證金分為類目保證金和浮動保證金。 先來說說類目保證金,類目保證金由視頻號小店主體資質類型和經營商品類目決定。 類目保證金有以下三點需要注意: 1. 如果你要申請新…

CentOS 7~9 救援模式恢復root密碼實戰指南

在管理Linux服務器時,忘記root密碼是一件棘手的事情,但幸運的是,CentOS提供了救援模式來幫助我們重置root密碼。本文將詳細介紹如何通過GRUB引導菜單進入緊急模式(或稱為救援模式),進而恢復root用戶的密碼。…

Python量化交易學習——Part4:基于基本面的單因子選股策略

技術分析與基本面分析是股票價格分析最基礎也是最經典的兩個部分。技術分析是針對交易曲線及成交量等指標進行分析,基本面分析是基于公司的基本素質進行分析。 一般來說選股要先選行業,在選個股,之后根據技術分析選擇買賣節點,因此針對行業及個股的基本面分析是選股的基礎。…

【ARMv7-A】——WFE(wait for event)

文章目錄 WFE基本概念工作原理事件類型使用場景WFIWFEWFE 和 WFI 相同點WFE 和 WFI 不同點觸發條件事件標志影響多核系統中的應用使用場景:代碼實例linux 內核中的 WFI 指令WFE WFE 即 Wait for ev

# 全面解剖 消息中間件 RocketMQ-(4)

全面解剖 消息中間件 RocketMQ-(4) 一、RocketMQ 順序消息分析 1、消息有序:指的是可以按照消息的發送順序來消費(FIFO)。RocketMQ 可以嚴格的保證消息有序,可以分為分區有序或者全局有序。 2、順序消費的原理解析 在默認的情…

身份證真假查詢API、C#身份證識別、駕駛證識別接口

線上平臺想要在節省成本、節省時間的前提下實現身份證實名認證的功能,可以考慮云服務平臺,例如翔云API開放平臺,專注于數字化接口服務的提供。翔云身份證實名認證接口,搭配翔云身份證識別接口,實時聯網秒速核驗身份證信…

vfrom二開給左邊添加字段或者容器

例如,我在左側加入一個 我的公司 字段 修改三個文件,這是文件目錄 這個文件是當界面選擇 簡體中文 的時候,顯示的 字段組件 或者 容器組件的中文名 這個文件是當界面選擇 English 的時候,顯示的 字段組件 或者 容器組件的英文名 把…

Spring Boot 集成 zxing 生成條形碼與二維碼

前面我們知道了怎么通過 使用 zxing 生成二維碼以及條形碼, 由于我們現在都是 web 端的項目了,那么我們看下怎么使用 Spring Boot 集成然后返回給前端展示: 工程源碼 對應的工程源碼我放到了這里:github源碼路徑,點擊…

d2-crud-plus 使用小技巧(六)—— 表單下拉選擇 行樣式 溢出時顯示異常優化

問題 vue2 elementUI d2-crud-plus,數據類型為select時,行樣式顯示為tag樣式,但是如果選擇內容過長就會出現下面這種bug,顯然用戶體驗不夠友好。 期望 代碼 js export const crudOptions (vm) > {return {...columns:…

圖書管理系統(https://github.com/plusmultiply0/bookmanagesystem)

特意去github找了一個用flask框架的項目,一起來學習它吧 這個系統包括很多功能:用戶權限管理模塊(管理員和普通用戶),注冊登錄模塊(滑塊驗證碼功能),圖書有關信息模塊(借…

毫米級精度3D人臉掃描設備,助推打造元宇宙虛擬分身

在元宇宙中,虛擬分身對應的是一個三維模型,數字化的過程則是三維重建過程,通過3D人臉掃描可以通過多相機同步采集人臉部,可快速、準確地重建出真人地臉部模型及貼圖,通過3D人臉掃描設備可快速重建出高逼真的虛擬分身。…

Linux系統下+jmeter分布式壓測

一.配置jdk(Linux機都需配置同一個版本) 下載Linux系統的jdk,下載地址:https://repo.huaweicloud.com/java/jdk/ 下載后的jdk文件上傳到 /opt目錄下 進入opt目錄,查看jdk文件 cd /opt ll 1.解壓文件 tar xzvf jd…

真國色碼上贊,科技流量雙劍合璧,商家獲客新紀元開啟

在數字化浪潮洶涌的今天,真國色研發團隊依托紅玉房網絡科技公司的雄厚實力,憑借科技領先的核心競爭力,推出了創新性的商家曝光引流工具——碼上贊。這款工具借助微信支付與視頻號已有功能,為實體商家提供了一種全新的引流獲客方式,實現了科技與商業的完美融合。 科技領先,流量黑…

CSS 空間轉換 動畫

目錄 1. 空間轉換1.1 視距 - perspective1.2 空間轉換 - 旋轉1.3 立體呈現 - transform-style1.4 空間轉換 - 縮放 2. 動畫 - animation2.1 動畫的基本用法2.1 animation 復合屬性2.2 animation 拆分屬性2.3 多組動畫 正文開始 1. 空間轉換 空間:是從坐標軸角度定義…

Paddle實現單目標檢測

單目標檢測 單目標檢測(Single Object Detection)是人工智能領域中的一個重要研究方向,旨在通過計算機視覺技術,識別和定位圖像中的特定目標物體。單目標檢測可以應用于各種場景,如智能監控、自動駕駛、醫療影像分析等…

短視頻矩陣系統搭建開發,ai智能剪輯系統,矩陣發布,一鍵管理多個賬戶

前言: 企業短視頻矩陣是企業通過搭建多個短視頻平臺賬號,形成一個多元化的內容傳播網絡。它旨在通過多平臺內容的同步傳播,實現企業品牌價值的最大化。短視頻矩陣包括抖音、快手、視頻號、小紅書、百家號等熱門短視頻平臺,其核心…

LeetCode 每日一題 數學篇 2520.統計能整除數字的位數

給你一個整數 num ,返回 num 中能整除 num 的數位的數目。 如果滿足 nums % val 0 ,則認為整數 val 可以整除 nums 。 int countDigits(int num) {int t num, res 0;while (t) {if (num % (t % 10) 0) {res 1;}t / 10;}return res; }解題思路&…

AT_abc348_c [ABC348C] Colorful Beans 題解

題目傳送門 解題思路 對于每種顏色的豆子,我們先找到美味度最小的那個,最后找出這些不同種類的豆子中美味度最大的即可。 那我們怎么找到第 i i i 種豆子中美味度最小的那個呢?這里給出兩種思路: 使用桶的思想標記。對于每一…