人人都是 Serverless 架構(gòu)師 | 現(xiàn)代化 Web 應(yīng)用開發(fā)實戰(zhàn)
時間:2023-05-30 11:24:01 | 來源:網(wǎng)站運營
時間:2023-05-30 11:24:01 來源:網(wǎng)站運營
人人都是 Serverless 架構(gòu)師 | 現(xiàn)代化 Web 應(yīng)用開發(fā)實戰(zhàn):
簡介:本篇實戰(zhàn)將介紹如何以超低成本構(gòu)建動態(tài)的 Web 站點,并且實現(xiàn)靈活擴展,限流等效果,最后再跟大家聊一聊“現(xiàn)代應(yīng)用”的相關(guān)概念。
相信很多同學(xué)都有過想要擁有自己的 Web 站點的想法,但是如果想要搭建動態(tài)的站點,需要采購云主機,買帶寬并且自己搭建環(huán)境,部署運維,整體下來成本會非常高。若如果只是搞靜態(tài)的站點的話,方式很多也很便宜,但是整體功能性就會比較弱,且收益效果也會差很多。
下面我們就使用 Serverless Devs 為大家實操演示一下如何構(gòu)建 Serverless 架構(gòu)的現(xiàn)代化 Web 動態(tài)站點。
構(gòu)建現(xiàn)代化 Web 動態(tài)站點
1、架構(gòu)一覽
首先為大家介紹一下本次 Web 應(yīng)用的架構(gòu)圖:
我們采用阿里云網(wǎng)關(guān)作為主流量入口,然后將動態(tài)請求轉(zhuǎn)發(fā)給 阿里云函數(shù)計算,靜態(tài)文件則交給 阿里云對象存儲OSS 來處理。并在網(wǎng)關(guān)上做一系列的安全處理措施,如限流等。
2、準備工作
如上圖所示我們需要開通幾款阿里云的產(chǎn)品 :
- 云解析DNS
- API 網(wǎng)關(guān)
- 函數(shù)計算
- 對象存儲OSS
然后準備一個自己喜歡的域名,可以去萬網(wǎng)申請一個,最便宜的只有幾塊錢,筆者申請的
http://serverless-developer.com 頂級域名僅 48 塊/年,本次部署將選擇香港 region, 域名需要實名認證,建議提前進行備案。
(另外說一下 DNS 的域名解析是要花錢的,個人版的話第一個域名大約 40.8塊/年,此外每增加一個需額外另加20塊錢左右。)
安裝好 Serverless devs 開發(fā)者工具:
- npm install -g @serverless-devs/s
3、操作步驟
1)秘鑰配置
對于新手而言,使用 Serverless Devs 的第一步就是將相關(guān)云廠商的秘鑰信息配置好,這樣才能夠進行相關(guān)的構(gòu)建部署操作。只需要打開電腦的終端,然后輸入
s config add ,即可進入引導(dǎo)式操作 。
(打開鏈接查看更詳細的阿里云秘鑰教程 )
2)應(yīng)用初始化
秘鑰配置好,為了更便捷地檢索相關(guān)應(yīng)用模板,我們可以登錄 serverless devs 應(yīng)用中心, 搜索 "
modern-web-application",然后根據(jù)下圖所示操作即可。
1.點擊復(fù)制指令
2.打開命令行終端進行粘貼
3.根據(jù)引導(dǎo)提示輸入提前準備好的
域名(如
http://demo.serverless-developer.com)以及
oss bucket 名稱(hanxie-serverless-web
) 建議 oss bucket 提前在控制臺創(chuàng)建
3)構(gòu)建部署
初始化之后可以選擇對項目進行配置修改,比如更改網(wǎng)關(guān)的分組名:
函數(shù)計算的服務(wù)名或者函數(shù)名:
改好之后直接輸入
s deploy 即可,此處大約會有一個1分鐘不到的部署構(gòu)建時間
最終返回結(jié)果如下:
4)訪問查看
當(dāng)我們部署好之后,我們可以查看一下網(wǎng)關(guān),OSS, 函數(shù)計算,以及 DNS 是否已經(jīng)部署完成我們所需要的內(nèi)容。
此時我們可以嘗試訪問一下
http://demo.serverless-developer.com ,發(fā)現(xiàn)訪問不通:
原因有一下兩種可能性:
1.
gateway 的域名沒有綁定成功,此時我們可以查看
- apigateway 分組管理
- myserverlessdemo 查看域名綁定,發(fā)現(xiàn)這部分其實是 ok 的;
2. 那么有可能就是
OSS 的域名未綁定成功,我們可以通過 OSS 控制臺查看
- 對象存儲
- Bucket列表
- 傳輸管理,發(fā)現(xiàn)上述域名未進行綁定;
這里我們點擊域名綁定,將上述域名輸入綁定,完成后再次訪問域名,可以看到:
serverless devs 應(yīng)用中心的部署效果
5)站點安全
我們部署的站點還不是 https 的,所以需要把它變成 https 的站點以增加其安全性。
我們可以在阿里云 SSL 上申請免費的證書,然后綁定到域名上,具體操作如下:
- 訪問阿里云官網(wǎng)
- 搜索ssl證書 ,進入購買
- 然后選擇免費的域名
之后進入 SSL控制臺 選擇 “SSL證書-免費證書”,點擊創(chuàng)建證書。
此時會生成一列待申請證書的數(shù)據(jù):
點擊右側(cè)的“證書申請”將你的信息和域名填寫上去,然后進行驗證,通過后“提交審核”:
接下來回到 apigateway 控制臺,域名綁定部分選擇“證書”,可以看到已經(jīng)創(chuàng)建好的域名:
同步后稍等片刻,訪問
https://demo.serverless-developer.com 即可看到效果:
至此你已經(jīng)擁有了一個加密的 Web 站點。
加密之后還需要考慮一個問題,比如這次我把站點做成 demo,可能會面臨很多人的訪問,甚至被攻擊;那么我應(yīng)該如何進行限制流量過多產(chǎn)生的高昂費用呢?有了網(wǎng)關(guān)之后,限流的問題就變得簡單了。
我們登入到網(wǎng)關(guān)的控制臺:
- 選擇插件管理;
- 點擊經(jīng)典網(wǎng)絡(luò)實例插件-流量控制;
- 并創(chuàng)建策略;
然后設(shè)置 1 分鐘最多可訪問 5 次:
創(chuàng)建好策略之后就是綁定 api,具體操作如下圖所示:
設(shè)定好策略后、綁定好訪問首頁的 api 后,我們進行一下測試。訪問域名,然后刷新 5 次,第 6 次的時候會發(fā)現(xiàn)網(wǎng)站無法訪問:
至此說明你的網(wǎng)站已經(jīng)成功限流了。
關(guān)于更多 Serverless 安全的問題比如 auther 認證、vpc 訪問、多環(huán)境部署等問題,可以在后面跟大家再一起探討,限于篇幅問題便不在本文中展開講解了,大家如果感興趣可以在評論區(qū)留言。
6)站點可觀測
站點上線后不可避免的會需要一些可觀測的能力,比如 pv, uv,api 異常等等。相關(guān)的產(chǎn)品有很多,比如百度的統(tǒng)計,Google 的統(tǒng)計等。這里可以給大家推薦使用 ARMS的前端監(jiān)控, 除了通用的指標監(jiān)控,你還可以通過它自定義上報一些關(guān)鍵信息,如統(tǒng)計分享按鈕點擊數(shù),上傳 sourceMap 定位問題等。
Serverless 應(yīng)用架構(gòu)拆解
1、整體目錄結(jié)構(gòu)說明
這個 Serverless 架構(gòu)的工程主要包含 3 個部分:
- s.yaml 配置文件
- js runtime 的 api 服務(wù)
- 前端標準 react 項目工程
你可以自由選擇后端 api 服務(wù)的架構(gòu),以及前端開發(fā)框架,完全不會影響整體效果。值得一提的是,這里使用的 api 框架是 Serverless Devs 提供的 Serverless first 的開發(fā)框架,針對冷啟動做了一些優(yōu)化,你可以采用熟悉框架的開發(fā)語法糖,比如這里是采用 koa 式的語法糖,你也可以選擇 express 的,具體細節(jié)可以訪問官方庫去查看,非常適合中小型 Web 項目開發(fā)。
2、網(wǎng)關(guān)說明
其實這個 Web 應(yīng)用架構(gòu)核心的部分是在網(wǎng)關(guān),通過網(wǎng)關(guān)實現(xiàn)了動靜態(tài)分流。域名及證書綁定,也是通過網(wǎng)關(guān)做各種限流和安全驗證。為了更好的使用網(wǎng)關(guān)我們開發(fā)了apigateway的組件,它是基于官方的 sdk 量身定制的 api 發(fā)布服務(wù)。它是完全開源開放的,你可以根據(jù)需要自己去定制更多的網(wǎng)關(guān)路由部署流程,比如加入多環(huán)境的設(shè)置等,這里我對配置做了一些簡化,讓開發(fā)者關(guān)注于路由和目標服務(wù),相比自己一個一個去配置 api 要節(jié)省很多時間。
不過目前看依然比較復(fù)雜,關(guān)于這部分計劃會通過 Serverless Desktop 可視化配置解決,大家也可以給我們 Devs官方提更多的 issue,一起把網(wǎng)關(guān)組件完善起來。
3、關(guān)于資費的真實說明
其實一開始我們就提到了這種 Serverless 架構(gòu)的 Web 站點費用其實很低,如果排除使用數(shù)據(jù)庫的情況下,你只需要申請一個域名,可能幾塊錢就行,后面會完全按流量計費。對個人或者新創(chuàng)企業(yè)的站點而言,無疑是個巨大的利好,這里可以給大家分享一下我的個人賬單。
可以看到費用確實低廉,當(dāng)然這是在你應(yīng)用比較小的情況下,不代表企業(yè)級生產(chǎn)的情況。如果你的項目一旦爆發(fā),流量、資費上來之后,你就更能真實感受到 Serverless 架構(gòu)的優(yōu)勢了。
4、關(guān)于數(shù)據(jù)庫
本篇文章的應(yīng)用模板僅是做服務(wù)轉(zhuǎn)發(fā),所以還沒有涉及數(shù)據(jù)庫,想必大家也會非常關(guān)心數(shù)據(jù)庫的使用,所以在接下來的系列篇章中我會重點先從 tablestore 表格存儲 這個 Serverless 的 Nosql 介紹開始,后面也會跟大家逐步介紹 Mysql,mongodb 的使用情況。
雖然使用數(shù)據(jù)庫在 Serverless 架構(gòu)中依然存在諸多問題,比如數(shù)據(jù)庫連接會增加冷啟動時間、數(shù)據(jù)庫前成本依舊高昂,不過大家不必擔(dān)心,相信隨著 Serverless 架構(gòu)的廣泛落地,這些問題一定會迎刃而解的。
什么是"現(xiàn)代化應(yīng)用"
文章標題提到了"現(xiàn)代化應(yīng)用"的概念,在這里也跟大家解釋一下,什么是 "Modern Application"。其實現(xiàn)代化應(yīng)用這個概念已經(jīng)被越來越被廣泛的認可了。不管是阿里云,華為云,AWS 都在推廣現(xiàn)代化應(yīng)用的理念。這里引用一段 AWS 對 Modern Application 的概念解釋:
A modern application is the combination of modern technologies, architectures, software delivery practices, and operational processes that lead teams to deliver value more quickly, frequently, consistently, and safely. These applications typically take advantage of loosely coupled, distributed technologies and focus on event-driven, serverless components that allow teams to offload undifferentiated heavy lifting in order to spend more time on delivering value for their customers. A modern application also takes advantage of operational and security tooling to increase the reliability and consistency of deployments, while making it safe to deploy many times a day. The use of automation of infrastructure, security, and deployments allows the teams that own modern applications to move more quickly than if they were relying on manual processes or more significant operational management.
簡單概述就是,現(xiàn)代化應(yīng)用是現(xiàn)代技術(shù)、體系結(jié)構(gòu)、軟件交付實踐和操作流程的組合,可以引導(dǎo)團隊更快、更頻繁、更一致、更安全地交付價值,像 Serverless 以及事件驅(qū)動的架構(gòu)這些都輸于現(xiàn)代化應(yīng)用的范疇。
本篇文章也客觀展示了這種架構(gòu)的價值所在,包括超低成本,安全,可擴展等,不過依然是那句話軟件工程沒有銀彈,Modern Application 也依然存在很多問題需要去解決, 需要大家一起去實踐驗證??傊蚁嘈盼ㄓ薪?jīng)過實踐檢驗才能真正得到我們想要的答案。
關(guān)注 Serverless 公眾號訂閱該系列 查看更多內(nèi)容
版權(quán)聲明:本文內(nèi)容由阿里云實名注冊用戶自發(fā)貢獻,版權(quán)歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請查看《阿里云開發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開發(fā)者社區(qū)知識產(chǎn)權(quán)保護指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫侵權(quán)投訴表單進行舉報,一經(jīng)查實,本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。
關(guān)鍵詞:實戰(zhàn),現(xiàn)代化