javascript
Spring Boot Serverless 实战系列“部署篇” | Mall 应用
作者:西流
關(guān)注【Serverless】公眾號,后臺回復(fù) “學(xué)習(xí)” 即可獲得 Serverless 技術(shù)資源包!
導(dǎo)讀:
Spring Boot 是基于 Java Spring 框架的套件,它預(yù)裝了 Spring 的一系列組件,讓開發(fā)者只需要很少的配置就可以創(chuàng)建獨(dú)立運(yùn)行的應(yīng)用程序。在云原生的環(huán)境中,有大量的平臺可以運(yùn)行 Spring Boot 應(yīng)用,例如虛擬機(jī)、容器等。但其中最有吸引力的,是以 Serverless 的方式運(yùn)行 Spring Boot 應(yīng)用。
我將通過一系列文章,從架構(gòu),部署,監(jiān)控、性能、安全等 5 個(gè)方面來分析 Serverless 平臺運(yùn)行 Spring Boot 應(yīng)用的優(yōu)劣。我們在上一篇的“Spring Boot on FC 架構(gòu)篇”中,對 Mall 應(yīng)用架構(gòu)以及 Serverless 平臺有了一個(gè)基本的介紹,我會在本篇中為各位講述如何將 Mall 應(yīng)用部署到函數(shù)計(jì)算平臺上。為了讓分析更有代表性,我選擇了 Github 上 star 數(shù)超過 50k 的電商應(yīng)用 mall 作為示例。
前置條件
準(zhǔn)備階段:
-
您需要有一個(gè)阿里云的賬戶;
-
您需要有一臺能通過公網(wǎng) ip 訪問的機(jī)器,安裝 MySQL,Redis 等 Mall 應(yīng)用依賴的軟件;
-
您需要在運(yùn)行依賴軟件的機(jī)器上安裝 Git, Docker,Java 和 Maven 軟件;
-
您需要安裝并配置 Serverless Devs 工具。
注意,如果您使用了云主機(jī),請先檢查主機(jī)對應(yīng)的安全組配置是否允許入方向的網(wǎng)絡(luò)請求。一般的主機(jī)在創(chuàng)建后,對于入方向的網(wǎng)絡(luò)端口訪問做了嚴(yán)格限制。我們需要手動(dòng)允許訪問 MySQL 的 3306 端口,Redis 的 6379 端口等。如下圖所示,我手動(dòng)設(shè)置了安全組,允許所有入方向的網(wǎng)絡(luò)請求。
部署依賴軟件
Mall 應(yīng)用依賴 MySQL,Redis,MongoDB,ElasticSearch,RabbitMQ 等軟件。這些軟件在云上都有對應(yīng)的云產(chǎn)品。在生產(chǎn)環(huán)境,推薦使用云產(chǎn)品獲得更好的性能和可用性。在個(gè)人開發(fā)或者 POC 原型演示場景下,我們選擇一臺 VM 來容器化部署所有依賴的軟件。
1.1?Clone 代碼倉庫
git clone https://github.com/hryang/mall國內(nèi)訪問 Github 網(wǎng)絡(luò)不太好,如果 clone 太慢,可使用 Gitee 地址。
git clone https://gitee.com/aliyunfc/mall.git1.2?構(gòu)建和運(yùn)行 Docker 鏡像
在代碼根目錄的 docker 文件夾下,有每個(gè)依賴軟件對應(yīng)的 Dockerfile。運(yùn)行代碼根目錄下的 run.sh 腳本,會自動(dòng)構(gòu)建所有依賴軟件的 Docker 鏡像,并在本機(jī)運(yùn)行。
sudo bash docker.sh1.3?驗(yàn)證依賴軟件運(yùn)行狀態(tài)
執(zhí)行 Docker ps 命令,檢查依賴軟件是否正常運(yùn)行。
sudo docker ps部署 Mall 應(yīng)用
2.1 修改 Mall 應(yīng)用配置
修改下面?3 個(gè) yaml 文件,將其中的???host???字段改成您第 1 步安裝 MySQL 等軟件的節(jié)點(diǎn)公網(wǎng) ip,如圖所示:
??mall-admin/src/main/resources/application-prod.yml??
??mall-portal/src/main/resources/application-prod.yml??
??mall-search/src/main/resources/application-prod.yml??
2.2 生成 Mall 應(yīng)用容器鏡像
執(zhí)行 maven 打包命令,生成 Docker 鏡像,本地是 Java8 或者 Java11 環(huán)境均可。
sudo -E mvn package成功后,將顯示如下成功信息。
執(zhí)行???sudo docker images??,應(yīng)該能看到 mall/mall-admin,mall/mall-portal,mall/mall-search 的 1.0-SNAPSHOT 版本的鏡像。
2.3 將鏡像推送到阿里云鏡像倉庫
首先登錄阿里云鏡像倉庫控制臺,選擇個(gè)人版實(shí)例,根據(jù)提示讓 docker 登錄阿里云鏡像倉庫。
然后創(chuàng)建命名空間。如下圖所示,我們創(chuàng)建了名為 quanxi-hryang 的命名空間。
根據(jù)之前的步驟,我們已經(jīng)在本地生成了 mall/mall-admin, mall/mall-portal, mall/mall-search 的鏡像。
執(zhí)行下面的命令,將 mall-admin 鏡像推送到杭州區(qū)域,??quanxi-hryang???命名空間下的鏡像倉庫。
請將下面命令中的 ???cn-hangzhou???和???quanxi-hryang???修改為您自己的鏡像倉庫地域和命名空間。mall/mall-portal,mall/mall-search 以此類推。
sudo docker tag mall/mall-admin:1.0-SNAPSHOT registry.cn-hangzhou.aliyuncs.com/quanxi-hryang/mall-admin:1.0-SNAPSHOT sudo docker push registry.cn-hangzhou.aliyuncs.com/quanxi-hryang/mall-admin:1.0-SNAPSHOT2.4 修改 Serverless Devs 工具的應(yīng)用定義
我們使用 Serverless Devs 工具來定義和部署應(yīng)用。在項(xiàng)目根目錄下,有???s.yaml???文件,這是 Serverless Devs 工具的項(xiàng)目定義文件。這里面定義了函數(shù)計(jì)算的資源。
如下圖所示,我們在函數(shù)計(jì)算上定義了名為 mall-admin 服務(wù)及其下的 mall-admin 函數(shù)。函數(shù)中定義了 port,內(nèi)存大小,超時(shí)時(shí)間,運(yùn)行時(shí)等屬性。紅框中的內(nèi)容是您需要根據(jù)自己的配置修改的。
-
??access???是您使用???s config???配置的身份,默認(rèn)是 default。如果您采用默認(rèn)設(shè)置,那么這里不需要更改。
-
??region???是您要部署的地域,有 cn-hangzhou,cn-shanghai,cn-beijing,cn-shenzheng 等選項(xiàng)。
-
函數(shù)使用了 custom-container 運(yùn)行時(shí),需要指定鏡像地址。請將 s.yaml 中的鏡像地址改為您上一步推送的 mall-admin 鏡像地址。同理,也需要在 s.yaml 中更改 mall-portal,mall-search 的鏡像地址。
(建議:上面的鏡像地址最好使用 ?registry-vpc.cn-hangzhou.aliyuncs.com/fc-demo/mall-admin:1.0-SNAPSHOT 形式)
2.5 部署 Mall 應(yīng)用到函數(shù)計(jì)算平臺
執(zhí)行???s deploy???命令,部署成功后,您將看到對應(yīng)的訪問網(wǎng)址。
在瀏覽器中輸入生成的網(wǎng)址,如果顯示 “暫未登錄或 token 已經(jīng)過期”,說明服務(wù)部署成功。
(注意:Serverless 的特點(diǎn)是系統(tǒng)默認(rèn)在請求到達(dá)后才創(chuàng)建實(shí)例,所以第一次啟動(dòng)時(shí)間比較長,稱之為冷啟動(dòng)。Mall 應(yīng)用啟動(dòng)一般需要 30s 左右。后面我們將在性能調(diào)優(yōu)文章中來回顧這個(gè)問題,使用一系列手段優(yōu)化。)
訪問對應(yīng)的 swagger api 調(diào)試頁面 host/swagger-ui.html,就能調(diào)試相關(guān)的后端 API 了。
2.6 查看應(yīng)用日志
我們在???s.yaml???中為每個(gè)服務(wù)都設(shè)置了???logConfig:auto???,代表 serverless-devs 工具會自動(dòng)為服務(wù)創(chuàng)建日志庫(LogStore),所有的服務(wù)都共享一個(gè)日志庫。應(yīng)用所有的日志都輸出到。
- 您可以使用???s logs???命令查看所有服務(wù)某個(gè)時(shí)間點(diǎn)的日志;
- 也可以使用???s mall-admin logs???查看 mall-admin 函數(shù)的日志;
- 也可以使用???s mall-admin logs -t???以跟隨模式實(shí)時(shí)顯示當(dāng)前時(shí)間點(diǎn)之后的日志;
- 也可以使用???s mall-admin logs --keyword=abc???查看包含關(guān)鍵詞 abc 的日志。
s logs 對于您了解服務(wù)運(yùn)行情況和問題診斷非常有用。例如我們執(zhí)行???s mall-admin logs -t???進(jìn)入跟隨模式,然后在瀏覽器中訪問???mall-admin???服務(wù)的 endpoint,就能看到整個(gè)應(yīng)用的啟動(dòng)和請求處理日志。
2.7 部署 Mall 前端項(xiàng)目
Mall 也提供了一個(gè)前端界面,基于 Vue+Element 實(shí)現(xiàn)。主要包括商品管理、訂單管理、會員管理、促銷管理、運(yùn)營管理、內(nèi)容管理、統(tǒng)計(jì)報(bào)表、財(cái)務(wù)管理、權(quán)限管理、設(shè)置等功能。該項(xiàng)目同樣可以無縫運(yùn)行在函數(shù)計(jì)算上。
首先在所在機(jī)器上安裝 nodejs12 和 npm,并下載項(xiàng)目源代碼。
git clone https://github.com/hryang/mall-admin-web國內(nèi)訪問 github 網(wǎng)絡(luò)不太好,如果 clone 太慢,可使用下面的代理地址。
git clone https://gitee.com/aliyunfc/mall-admin-web.git(注意:必須是 nodejs 12 或者 14,太新的 node 版本會編譯失敗)
修改???config/prod.env.js?? ,將其中的 BASE_API 改為之前在函數(shù)計(jì)算上部署成功的 mall-admin 的 endpoint。
在項(xiàng)目根目錄執(zhí)行下面的命令,構(gòu)建前端項(xiàng)目。
npm install npm run build運(yùn)行成功后,會生成 dist 目錄。運(yùn)行項(xiàng)目根目錄下的 docker.sh 腳本,生成鏡像。
sudo bash docker.sh運(yùn)行???docker images???命令,將看到 mall/mall-admin-web 鏡像已經(jīng)成功生成了。將鏡像推送到阿里云鏡像倉庫。
同理,請將下面命令中的???cn-hangzhou???和???quanxi-hryang???修改為您自己的鏡像倉庫地域和命名空間。
sudo docker tag mall/mall-admin-web:1.0-SNAPSHOT registry.cn-hangzhou.aliyuncs.com/quanxi-hryang/mall-admin-web:1.0-SNAPSHOT sudo docker push registry.cn-hangzhou.aliyuncs.com/quanxi-hryang/mall-admin-web:1.0-SNAPSHOT修改項(xiàng)目根目錄下的???s.yaml???,和部署 mall-admin 類似,根據(jù)您的配置調(diào)整???access???, ??region???,將???image???改為上一步推送成功的鏡像地址。
執(zhí)行???s deploy?? ,當(dāng)部署成功后,就能看到 mall-admin-web 服務(wù)的網(wǎng)址。通過瀏覽器訪問,將看到登錄頁面。填入密碼???macro123???,就能看到完整的效果。
(注意:第一次由于冷啟動(dòng),登錄頁面可能會報(bào)超時(shí)錯(cuò)誤。重新刷新頁面即可。我們將在后面的性能調(diào)優(yōu)文章中優(yōu)化冷啟動(dòng)性能。)
總結(jié)
由于 Serverless 平臺內(nèi)置了網(wǎng)關(guān),負(fù)責(zé)路由,實(shí)例拉起/運(yùn)行/容錯(cuò)/自動(dòng)擴(kuò)縮容等功能,因此開發(fā)者上傳應(yīng)用代碼包或者鏡像后,就已經(jīng)發(fā)布了一個(gè)彈性高可用的服務(wù)。總結(jié)起來,只要完成下面 5 步就在函數(shù)計(jì)算平臺上完整部署了 Mall 應(yīng)用。后續(xù)對應(yīng)用的更新,只需要重復(fù)步驟 4 和 5。由此可見,Serverless 將環(huán)境配置和運(yùn)維等重復(fù)性的工作免除了,開發(fā)運(yùn)維效率大幅提升。
文中網(wǎng)址匯總
1)Spring Boot:
??https://spring.io/projects/spring-boot??
2)Mall:
??https://github.com/macrozheng/mall??
3)Serverless Devs 安裝文檔:
??http://serverless-devs.com/zh-cn/docs/installed/cliinstall.html??
點(diǎn)擊??此處??,即可查看更多函數(shù)計(jì)算信息!
總結(jié)
以上是生活随笔為你收集整理的Spring Boot Serverless 实战系列“部署篇” | Mall 应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021 阿里云容器服务年度盘点:企业级
- 下一篇: 盘点 2022 云原生实战峰会产品发布