
本文選自“Serverless 函數(shù)計算征集令”征文,點擊上方卡片了解活動詳情!
什么是函數(shù)?剛剛考完數(shù)學(xué)沒多久的我,腦里立馬想到的是自變量、因變量、函數(shù)值,也就是 y=f(x)。當(dāng)然,在計算機里,函數(shù) function 往往指的是一段被定義好的代碼程序,我們可以通過傳參調(diào)用這個定義好的函數(shù),實現(xiàn)我們所需要的功能。那么,今天的阿里云函數(shù)計算 FC 又是什么?
云計算時代的當(dāng)下,容器化技術(shù)與各種工具發(fā)展的 DevOps,已經(jīng)把開發(fā)與運維的工作進(jìn)行了新的統(tǒng)籌,開發(fā)人員在完成代碼的編寫后,無需考慮環(huán)境,直接提交到各種流水線就可以完成測試、開發(fā)、部署,項目構(gòu)建微服務(wù),由容器完成環(huán)境的封裝。但是往往我們最終還是需要投入精力到業(yè)務(wù)上線的集群,是私有云環(huán)境還是公有云?是裸金屬服務(wù)器還是云實例 ECS?是自購還是租用?當(dāng)然,DevOps 的落地、服務(wù)器/集群的運維,這些都是需要投入大量的資源與精力,DevOps 是一條捷徑,但不是唯一的出路。而阿里云函數(shù)計算 FC 的出現(xiàn),帶來了無服務(wù) Serverless 的架構(gòu),讓開發(fā)者在開發(fā)和部署的時候,不再有部署服務(wù)復(fù)雜的感覺。
對服務(wù)器的無感化,可以使開發(fā)者真正的關(guān)注在自己的代碼上。阿里云 Serverless 函數(shù)式極簡編程可專注于業(yè)務(wù)創(chuàng)新,無采購和部署成本、提供監(jiān)控報警等完備的可觀測能力。阿里云函數(shù)計算 FC 是事件驅(qū)動的全托管計算服務(wù),真正的無需去考慮服務(wù)器的運維管理,只需要完成開發(fā)的代碼進(jìn)行上傳,函數(shù)計算會通過角色策略去規(guī)劃計算資源,彈性的方式執(zhí)行函數(shù),最后高效的執(zhí)行部署。優(yōu)雅!
Serverless 將會有那些適用場景?是個人?還是生產(chǎn)?那么這次我將部署兩種不同方向的應(yīng)用對 Serverless 進(jìn)行測評!一、通知系統(tǒng)與 Webhook,Trigger 觸發(fā)與 Chat 機器人。
許多系統(tǒng)中涉及到的 push 類功能,例如郵件、短信、Webhook。當(dāng)然 Webhook 的能力不只是信息通知,不過這里所指的通知功能必然是需要基礎(chǔ)設(shè)施也就是服務(wù)器來支撐運行,如果將這些功能直接由 Serverless 來操作,我們便無需支付運維一臺服務(wù)器,節(jié)省了大量的工作與費用。同樣,我們可以利用 Serverless 事件驅(qū)動模型實現(xiàn)定時自動觸發(fā)任務(wù),自動簽到自動發(fā)送。二、其次當(dāng)然是 Web 類的應(yīng)用。
基于各類 Web 框架的應(yīng)用部署,構(gòu)建基于 Java、Python、PHP 等語言的站點,Serverless 很容易實現(xiàn)如 wordpress 這樣的博客應(yīng)用的上線。配合其他云產(chǎn)品,Codeup、OSS、RDS 等,更能實現(xiàn)高可用高性能的 Web 應(yīng)用,如官方提供的 Kod 云盤系統(tǒng)。Serverless 農(nóng)產(chǎn)品電商網(wǎng)站上云改造
這里我拿隔壁軟件專業(yè)(俺是網(wǎng)絡(luò)技術(shù)的)的一個大作業(yè)項目作為部署的案例。項目是非常簡單并且功能單一的,但是也是非常經(jīng)典的前后端分離項目,由于我開發(fā)不太會,項目具體技術(shù)就不獻(xiàn)丑了。之前據(jù)說是有什么版權(quán)的,我就不放源代碼了hhhh。
在改造之前,我相信是很多中小型公司業(yè)務(wù)的經(jīng)典 AllinOne 結(jié)構(gòu),把業(yè)務(wù)涉及到的所有服務(wù)中間件運行在一臺服務(wù)器/虛擬機上,雖然現(xiàn)在看可能完完全全是實驗室環(huán)境,但是實際看到的依然有很多項目是這么做的。壞處也不用多提,部署運維難、難以進(jìn)行資源的擴(kuò)容、后續(xù)改造復(fù)雜、性能差沒有應(yīng)用高可用技術(shù)等等。。。
Serverless 的農(nóng)產(chǎn)品電商平臺上云,項目比較簡單,規(guī)劃就在同一地域了。主要是將前端 HTML 頁面與后端 Jar 包運行分別由兩個單獨的 Serverless 函數(shù)完成運行計算。其余支撐服務(wù)上云,分別用對應(yīng)的云產(chǎn)品實現(xiàn),這里 Redis 服務(wù)由于我自己 ECS 上有運行 Redis 服務(wù),就不再單獨購買云數(shù)據(jù)庫 Redis 版了,當(dāng)然推薦使用阿里云的 Redis 云數(shù)據(jù)庫產(chǎn)品。
1. Serverless 服務(wù)創(chuàng)建
進(jìn)入阿里云函數(shù)計算控制臺,選擇【服務(wù)及函數(shù)】,點擊【創(chuàng)建服務(wù)】
輸入創(chuàng)建服務(wù)的名稱與描述,開啟日志功能,點擊確定,完成服務(wù)的創(chuàng)建服務(wù)創(chuàng)建完成后,進(jìn)入【服務(wù)詳情】,找到【網(wǎng)絡(luò)配置】,點擊【編輯】
選擇允許訪問 VPC,選擇自定義配置,選擇 VPC、vSwitch、安全組,這里需要和后續(xù)其他支撐的云產(chǎn)品(數(shù)據(jù)庫等)保持在同一 VPC 下。因此需要做好云上網(wǎng)絡(luò)的規(guī)劃,也要看一下產(chǎn)品是否在地域下有沒有庫存。2. 前端頁面 Serverless 函數(shù)創(chuàng)建
完成服務(wù)創(chuàng)建后,點擊【創(chuàng)建函數(shù)】,進(jìn)入函數(shù)的創(chuàng)建頁面
選擇【使用自定義運行時平滑遷移 WebServer】,輸入函數(shù)名稱,選擇運行環(huán)境為【Nginx】,上傳前端 HTML 代碼與 Nginx 的配置文件,選擇監(jiān)聽端口為 80,即為原 Nginx 中間件的服務(wù)端口。完成函數(shù)創(chuàng)建后,進(jìn)入到函數(shù)詳情界面,可以在函數(shù)代碼中對代碼進(jìn)行編輯修改,代碼改動后需要點擊部署代碼重新上傳。上述也提到了,這里需要將 Nginx 服務(wù)配置一同上傳,其中需要拷貝一份/etc/nginx/mime.types 文件到當(dāng)下目錄,避免 mime 文件類型映射錯誤。
這里放 Nginx 關(guān)鍵配置,根據(jù)自己的業(yè)務(wù)情況修改,注意配置中端口監(jiān)聽需要與函數(shù)創(chuàng)建監(jiān)聽端口保持一致,同時網(wǎng)頁代碼的路徑設(shè)置為/code
http { include mime.types; #注意引入此文件 keepalive_timeout 900; server { listen 80; server_name localhost; location / { root /code; index index.html index.htm; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /users { proxy_pass http://serverless.后端函數(shù)訪問地址.run; #Nginx反代傳給后端的函數(shù),地址在后續(xù)后端函數(shù)創(chuàng)建完可以拷貝 } location /items { proxy_pass http://serverless.后端函數(shù)訪問地址.run; #Nginx反代傳給后端的函數(shù),地址在后續(xù)后端函數(shù)創(chuàng)建完可以拷貝 }
可以在調(diào)用日志查詢相關(guān)日志
當(dāng)函數(shù)觸發(fā)運行,Serverless 將會根據(jù)訪問請求自動起實例,在這里可以手動登陸實例,去進(jìn)行中間件服務(wù)的日志、運行環(huán)境的一些查看與排錯。
3. 后端 Serverless 函數(shù)創(chuàng)建
回到函數(shù)服務(wù)界面,再次點擊【創(chuàng)建函數(shù)】,進(jìn)入函數(shù)的創(chuàng)建頁面
選擇【使用自定義運行時平滑遷移 WebServer】,輸入函數(shù)名稱,選擇運行環(huán)境為【Java】,上傳打包好的 Jar 包文件。根據(jù)具體業(yè)務(wù)修改【啟動命令】與【監(jiān)聽端口】。我這里需要監(jiān)聽業(yè)務(wù)端口為 8080,并且需要在運行時傳入數(shù)據(jù)庫連接的參數(shù),這里所配置的數(shù)據(jù)庫源用戶名密碼連接地址,在后續(xù)的云數(shù)據(jù)庫 RDS 中會進(jìn)行相關(guān)設(shè)置。后端函數(shù)創(chuàng)建完成后進(jìn)入函數(shù)詳情界面,其余功能與上述前端函數(shù)相同,不再復(fù)述
點擊【觸發(fā)器管理】,此處 HTTP 觸發(fā)器提供了公網(wǎng)與內(nèi)網(wǎng)訪問地址,我們拷貝內(nèi)網(wǎng)地址在前端中間件反代配置處填入此域名,實現(xiàn)訪問前端觸發(fā)后端函數(shù)
4. 云數(shù)據(jù)庫 RDS MySQL Serverless 創(chuàng)建與遷移導(dǎo)入
原有 Allinone 架構(gòu)中沒有做到數(shù)據(jù)庫服務(wù)的獨立與高可用,在此次云化部署,我們將選用阿里云公測中的云數(shù)據(jù)庫 Serverless 版本。RDS MySQL Serverless 提供了 CPU、內(nèi)存的實時彈性能力,具有資源用量低、簡單易用、彈性靈活和價格低廉等優(yōu)點,合理優(yōu)化使用成本,進(jìn)一步降本增效。
RDS MySQL Serverless 實例創(chuàng)建
進(jìn)入云數(shù)據(jù)庫 RDS 控制臺,點擊【創(chuàng)建實例】,開始創(chuàng)建實例的流程,在【基礎(chǔ)資源】設(shè)置界面,選擇 Serverless 版,其余根據(jù)實際進(jìn)行選擇Serverless RDS 創(chuàng)建時【實例配置】需要注意網(wǎng)絡(luò) VPC 的設(shè)置,要與 Serverless 服務(wù)所設(shè)定的 VPC 一致,實現(xiàn)內(nèi)網(wǎng)數(shù)據(jù)互通。確定訂單后,等待實例創(chuàng)建完成即可RDS 數(shù)據(jù)庫用戶設(shè)置
完成實例創(chuàng)建,選擇管理實例。在左側(cè)任務(wù)欄選擇【賬號管理】,點擊【創(chuàng)建賬號】創(chuàng)建數(shù)據(jù)庫賬戶供電商平臺后端進(jìn)行連接。輸入賬戶名、密碼,選擇為普通賬戶,點擊確定完成用戶創(chuàng)建RDS 業(yè)務(wù)數(shù)據(jù)庫創(chuàng)建
選擇左側(cè)欄中【數(shù)據(jù)庫管理】,選擇【創(chuàng)建數(shù)據(jù)庫】輸入農(nóng)產(chǎn)品電商業(yè)務(wù)所需的庫名,并且授權(quán)賬戶給前一步設(shè)置的用戶,點擊創(chuàng)建完成庫的設(shè)置。我們的 Serverless 函數(shù)中所需要連接庫的地址,在 RDS 實例中【數(shù)據(jù)庫】連接處可以查到,不過需要提前設(shè)定白名單。我們將內(nèi)網(wǎng)地址進(jìn)行拷貝,并且也完成了連接用戶、密碼、庫的配置,就可以配置到 Serverless 函數(shù)或者是后端代碼中了RDS 業(yè)務(wù)數(shù)據(jù)庫的導(dǎo)入恢復(fù)
數(shù)據(jù)庫的上云關(guān)鍵是數(shù)據(jù)內(nèi)容的遷移,這次部署的業(yè)務(wù)數(shù)據(jù)庫很少又很小,因此使用簡單的備份 SQL 腳本文件作為遷移的方式。MySQL/Mariadb 的數(shù)據(jù)導(dǎo)出有多種方式,可以根據(jù)實際需求進(jìn)行備份導(dǎo)出,當(dāng)然大型業(yè)務(wù)庫有專用的備份遷移工具,這里不細(xì)說了。進(jìn)入 DMS 數(shù)據(jù)管理服務(wù),選擇【數(shù)據(jù)庫開發(fā)】,在【數(shù)據(jù)變更】下點擊【數(shù)據(jù)導(dǎo)入】。根據(jù)具體備份方式導(dǎo)入數(shù)據(jù)庫,我這里選擇上傳備份的 SQL 腳本,提交申請開始導(dǎo)入數(shù)據(jù)數(shù)據(jù)導(dǎo)入完成,數(shù)據(jù)遷移完成5. Redis 服務(wù)上云與靜態(tài)資源 CDN
Redis 服務(wù)上云,前文也提到了,這里 Redis 服務(wù)由于我自己 ECS 上有運行 Redis 服務(wù),就不再單獨購買云數(shù)據(jù)庫 Redis 版了,ECS 也處于同一 VPC 之下,可以實現(xiàn)內(nèi)網(wǎng)互通。當(dāng)然推薦使用阿里云的 Redis 云數(shù)據(jù)庫產(chǎn)品。
靜態(tài)資源的 CDN,包括 css/js/圖片的加速,原有架構(gòu)中已經(jīng)存放在阿里的 CDN 服務(wù)上了,我這里就不多做改動了。6. 公網(wǎng)業(yè)務(wù)訪問域名配置
最后一步,用戶最終訪問的是前端 Serverless 函數(shù),如同阿里云給出的提示,訪問默認(rèn)的公網(wǎng)地址不會做任何中間件解析,而是直接下載首頁 HTML 靜態(tài)文件,因此我們需要自己配置訪問域名。
回到函數(shù)計算控制臺,選擇【域名管理】,點擊【添加自定義域名】輸入自定的域名,配置路由,選擇對應(yīng)函數(shù)的服務(wù)名稱、函數(shù)名稱、版本號 LATEST(最新);拷貝 CNAME 記錄值,點擊【云解析 DNS 控制臺】,進(jìn)入解析設(shè)置,點擊【添加記錄】選擇記錄類型【CNAME】,輸入主機頭,填入拷貝的記錄值,確認(rèn)完成添加7. 農(nóng)產(chǎn)品電商項目 Serverless 上云效果
用戶注冊功能測試,數(shù)據(jù)庫連接與寫入無誤快速構(gòu)建 Iitemall 電商應(yīng)用系統(tǒng)
1. 基于官方模板創(chuàng)建應(yīng)用
Serverless 應(yīng)用提供了大量的官方應(yīng)用模板,我們可以根據(jù)給出的模板來修改自己的業(yè)務(wù),因此熟悉模板的部署也很重要。
進(jìn)入到函數(shù)計算 FC 的控制臺頁面,點擊【應(yīng)用】,選擇【通過模板創(chuàng)建應(yīng)用】,選擇【商城案例】
通過詳情查看部署模板的信息,以及查詢源代碼,點擊立即創(chuàng)建可以快速體驗 Serverless 應(yīng)用的創(chuàng)建,本地部署可以通過 Serverless Devs 工具進(jìn)行部署
2. 對創(chuàng)建應(yīng)用進(jìn)行配置
點擊立即創(chuàng)建后,我們進(jìn)行應(yīng)用的初始化配置。
部署類型有兩種:
1.通過第三方代碼倉庫部署
2.直接部署
兩者區(qū)別就是使用自己的倉庫代碼后續(xù)可以通過 push 更新項目發(fā)布,而直接部署需要手動配置。這里就可以看到,我們的交付觸發(fā)也是以 Git 倉庫 push 提交為主,每次提交會自動觸發(fā)部署。
如是自己配置應(yīng)用,需要根據(jù)業(yè)務(wù)配置 s.yaml 文件,參考:
https://www.serverless-devs.com/fc/yaml/readme
這里我選擇 gitee 倉庫進(jìn)行部署,但是需要進(jìn)行倉庫第三方應(yīng)用的授權(quán)點擊前往授權(quán),跳轉(zhuǎn)到 gitee 的站點進(jìn)行 OAuth 授權(quán)請求,點擊同意授權(quán)
阿里用戶在第一次使用 FC 函數(shù)計算時,需要對角色策略進(jìn)行添加的,我這里已經(jīng)使用過阿里云函數(shù)計算 FC 了,若提示需要添加策略,按照提示點擊添加即可。其他高級配置,需要根據(jù)業(yè)務(wù)進(jìn)行修改,這里注意地域的選定,后續(xù)的其他彈性資源都會在此地域下,我這里選擇本地杭州。
完成配置后點擊創(chuàng)建,代碼已經(jīng)新建上傳到我的 gitee 倉庫了。這里提供的 s.yaml 可以作為配置的參考,后續(xù)根據(jù)所部署的業(yè)務(wù)去修改 yaml應(yīng)用創(chuàng)建完成,首次自動進(jìn)行部署,這里部署狀態(tài)可以看到正在部署查看部署日志,如果部署出現(xiàn)錯誤也可以從日志信息中查詢報錯。
部署經(jīng)歷了前置環(huán)境、資源同步、資源檢查、執(zhí)行部署這四個步驟后,我們的電商應(yīng)用就完成了部署首次部署完成,也是最新 latest 的一次部署版本,可以通過部署歷史自由的進(jìn)行回滾訪問測試的域名,就可以看到我們上線的 litemall 電商系統(tǒng),進(jìn)入電商應(yīng)用的后臺管理litemall 電商系統(tǒng)是一個開源的前后端分離帶微信小程序的電商系統(tǒng),具有電商平臺基礎(chǔ)的會員管理、商城管理、商品管理、推廣管理、系統(tǒng)管理、配置管理、統(tǒng)計報表。litemall 電商系統(tǒng),需要配置最小開發(fā)環(huán)境有:MySQL、JDK1.8 或以上、Maven、Nodejs同樣,當(dāng)我們正常上線了 FC 的業(yè)務(wù)時,Serverless 用的是默認(rèn)訪問地址
阿里云函數(shù)計算 FC 上線提供的域名是以..fc.aliyuncs.com//proxy///[action?queries]為默認(rèn)的,若是正常業(yè)務(wù)訪問我們必然要修改訪問的域名。進(jìn)入到阿里云函數(shù)計算 FC 的首頁,點擊高級功能下的域名管理,這里可以看到我們上線電商應(yīng)用時的默認(rèn)域名已經(jīng)路由信息
輸入域名的名稱,也就是購買備案的域名下的自定義二級域名
點擊路由配置,選擇服務(wù)名稱,這里是我們部署的電商系統(tǒng) litemall,選擇函數(shù)名稱與版本拷貝公網(wǎng) CNAME 地址,后續(xù)在 DNS 域名管理處添加解析進(jìn)入到域名管理下,添加一條記錄,記錄類型選擇 CNAME,輸入主機記錄,將剛剛拷貝的公網(wǎng) CNAME 地址粘到記錄值,點擊添加即可
回到阿里云函數(shù)計算 FC,在最后點擊創(chuàng)建即可,回到主頁看到我們新綁定的域名
最后,拿手機訪問我自定義配置的公網(wǎng)地址電商服務(wù)正常上線,公網(wǎng)地址正常訪問主頁
Serverless 相對其他方案來說,也是非常容易上手并高效的技術(shù)方案。上面的部署測試,其實還有很多需要改進(jìn)的地方,但是我想把案例的重點放在 Serverless 服務(wù)器無感化上,本人也使用過不少阿里云的技術(shù)產(chǎn)品,深知對底層基礎(chǔ)設(shè)施運維難度。
雖然這幾個月學(xué)習(xí)生活比較繁忙,但是還是對社區(qū)的各種活動非常感興趣,也想做一些更好的測試。這次的 Serverless 無論是對個人用戶,還是企業(yè)用戶。都是一種非常不錯的選擇,彈性資源與按需付費,更加節(jié)省資源與 Money,更加優(yōu)雅!
點擊下方,立即查看作者原文!