CSDN 的小伙伴們,大家好呀,我是蒼何。
今天在群里面看到有小伙伴反饋說,面試的時候一被問到簡歷中的項目還沒上線,就不繼續問了,感覺挺奇葩的,要知道就校招來說,項目本身大部分都是練手的項目,上線也得花費很多的成本啊。
就 Java 應用來說本身是很吃內存的,再者現在不拿個微服務項目掛簡歷又拿不出手,但一上線微服務,服務器資源耗費將會是之前的好幾倍。就拿 PmHub 來說,之前單體的時候,1 核 2G 的服務器,跑的還可以。
但一換上微服務,即使升級為 4 核 8G, 服務還沒全開的情況下,內存一樣被打滿,不得已把運行 CI/CD 的 Jenkins 給關了才得以「保命」。
而且該說不說,現在的云服務器續費也是貴的離譜,省下好幾個月的余糧才咬牙升級配置。(為了項目有個舒服的體驗環境也是拼了😂)
說回面試需要項目上線的問題,我覺得主要有兩個辦法,一是本地電腦部署外掛內網穿透出去,這樣也省去買域名和服務器一堆操作,是性價比最高的。但缺點就是電腦不能關,直到拿到 offer 結束。
當然條件允許的話也可以體驗一把部署上線的快感。為什么說是快感呢?有經驗的開發應該清楚,每次上線都是激動人心的時刻,線下愛你千萬遍,不如線上見一面。上線一次就順利的算是運氣好,很多情況,上線總要出問題。
今天分享一下我們項目的容器化部署實戰,希望對你有幫助。
什么是 Docker 容器
當把環境從一個服務器遷移到另一個服務器,當你新買了電腦,會遇上要重新安裝一系列的軟件,比如 JDK、Tomcat、Maven、Redis 等,而安裝完之后每一次都需要再去配置環境,但是這些都是重復性的工作,有什么辦法可以解決呢?
玩過云服務器的聽說過有鏡像一說,將所有的軟件和需要的配置都打包好做成鏡像,下次需要的時候只需要安裝鏡像就可以。
類似的,Docker 就是解決這種問題的,將所有的軟件程序都放在 Docker 倉庫中,我們只需要在電腦上下載 Docker 即可,不需要再去進行繁瑣的安裝和配置了,只需要幾個命令就可以將我們的環境搭建好,這就是 Docker。
總結來說, Docker 是一個開源的應用容器引擎;是一個輕量級容器技術,Docker 支持將軟件編譯成一個鏡像;然后在鏡像中各種軟件做好配置,將鏡像發布出去,其他使用者可以直接使用這個鏡像;運行中的這個鏡像稱為容器,容器啟動是非常快速的。
Docker 架構
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 包:
阿里云開啟安全組
如果服務器是阿里云的話,在操作云服務器之前,先需要開啟阿里云的安全組,進行端口的放開。一般來說,云服務器的端口由以下兩個控制。
- 安全組放開端口
- 防火墻開啟端口
下載項目
接下來就是在云服務器上 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 都格外珍惜)
真希望能盡快和大家見面呀!