Serverless Components在騰訊云的落地和實(shí)踐,serverless web應(yīng)用Serverless Components在騰訊云的落地和實(shí)踐導(dǎo)語Serverless Components是Serverless Framework推出的最新解決 案,具有基礎(chǔ)設(shè)施編排能,開發(fā)者通過使Serverless ......
導(dǎo)語Serverless Components是Serverless Framework推出的最新解決 案,具有基礎(chǔ)設(shè)施編排能,開發(fā)者通過使Serverless Components,可以靈活構(gòu)建、組合和部署Serverless應(yīng)。本文是對騰訊云云函數(shù)團(tuán)隊(duì)前端負(fù)責(zé)人蔡衛(wèi)峰在云+社區(qū)沙龍online的分享整理,介紹Serverless Components在騰訊云的落地和實(shí)踐,希望與大家一同交流。
一、Serverless Components實(shí)現(xiàn)原理
1.Serverless CLI工具
Serverless是一個(gè)重開發(fā)和部署的產(chǎn)品應(yīng)用,服務(wù)提供了彈性伸縮、自動(dòng)運(yùn)維的能力,開發(fā)者主要關(guān)心開發(fā)和部署。所以,開發(fā)和部署的體驗(yàn)對于serverless業(yè)務(wù)來說是非常重要的。
Serverless的函數(shù)本身只是提供了計(jì)算的資源,要想實(shí)現(xiàn)一個(gè)完整的應(yīng)用,必然會(huì)涉及到云上的其他資源,比如網(wǎng)關(guān)、cdn、數(shù)據(jù)庫等。
如果是控制臺操作,需要在不同的服務(wù)之間跳來跳去,比較割裂。如果能有一個(gè)基于應(yīng)用的統(tǒng)一的命令行管理工具,對于開發(fā)者必然會(huì)方便很多
Serverless CLI是用戶授權(quán)后,通過命令行工具,調(diào)用云API幫助用戶管理云資源,方便對云上資源進(jìn)行比較完整的操作。
2.什么是Serverless Framework
Serverless Framework現(xiàn)在大量的使用者是web服務(wù)的開發(fā)者,主要定位于web服務(wù)場景,它是北美研發(fā)團(tuán)隊(duì)開源的一個(gè)項(xiàng)目,是業(yè)界常受歡迎的服務(wù)器應(yīng)框架,開發(fā)者需關(guān)底層資源即可部署完整可的Serverless應(yīng)架構(gòu)。
Serverless Framework定義了一套完整的標(biāo)準(zhǔn)化規(guī)范,各公有云的插件遵循這套規(guī)范,通過對云上資源的編排,覆蓋編碼、調(diào)試、部署、排障等全命周期,幫助開發(fā)者通過聯(lián)動(dòng)云資源,迅速構(gòu)建Serverless應(yīng)。
3.Serverless Framework CLI
Serverless Framework CLI是一個(gè)開源命令行工具,它使用基于事件觸發(fā)的計(jì)算資源,例如騰訊云云函數(shù),AWS Lambda,阿里云函數(shù)計(jì)算等。
Serverless Framework為開發(fā)和部署Serverless架構(gòu)提供腳手架,自動(dòng)化工作流以及最佳實(shí)踐。并且它支持通過豐富的插件進(jìn)行功能擴(kuò)展。
Serverless Framework在Github有將近4萬的Star,在國外比較受歡迎。我們團(tuán)隊(duì)最開始也維護(hù)了一個(gè)自己的CLI,但是維護(hù)成本比較高,想做體驗(yàn)好操作流暢的CLI需要投入大量人力精力,Serverless Framework的CLI開發(fā)者接受程度比較高,它的協(xié)議也開放,所以按照規(guī)范接入即可。
我們也有用戶原來用Serverless Framework的命令行工具,從AWS遷移到騰訊云云函數(shù)環(huán)境時(shí)候提出了這樣的要求。對用戶而言底層的云資源操作是屏蔽的,只需要跟Serverless Framework打交道就可以了,希望我們也可以提供對接Serverless Framework的方式,這樣遷移到騰訊云上比較方便。
通過和Serverless Framework團(tuán)隊(duì)的溝通,他們正好也有意愿打入國內(nèi)市場,雙方的合作也就水到渠成了。
Serverless Framework強(qiáng)于CLI整體的體驗(yàn),但是對騰訊云本身的了解比較少,于是就有了基本的合作模式,北美團(tuán)隊(duì)負(fù)責(zé)CLI的開發(fā)和整體體驗(yàn),騰訊云團(tuán)隊(duì)負(fù)責(zé)具體落地到騰訊云的components的開發(fā)和維護(hù)。雙方合力,打造Serverless Framework在國內(nèi)的實(shí)際落地方案。
4.什么是Serverless Components
Serverless Components是Serverless Framework的一個(gè)解決方案,本身具備快速部署、靈活配置、模板共享的理念。
公有云對接Serverless Framework后具有了公有云基本的操作能力,但是落地到具體的應(yīng)用場景就會(huì)變得復(fù)雜。
外部應(yīng)用不是單純靠計(jì)算資源,也會(huì)涉及到靜態(tài)資源,比如圖片、CSS、JS文件的托管和域名的管理,涉及到底層數(shù)據(jù)庫的管理,也有一些更復(fù)雜的應(yīng)用會(huì)涉及到更多的云上的資源。
如果開發(fā)者要想實(shí)現(xiàn)一個(gè)應(yīng)用的管理,則需要通過一系列的操作才能完成一個(gè)應(yīng)用管理和部署,而Serverless Components是為了適配各種具體化的應(yīng)用場景而開發(fā)的模板能力。
Serverless Components是Serverless Framework推出的最新解決方案,具有基礎(chǔ)設(shè)施編排能力,開發(fā)者通過使用Serverless Components,可以靈活構(gòu)建、組合和部署Serverless應(yīng)用。
二、Serverless Components全生命流程
Serverless Component部署流程
Serverless Components部署的完整全流程,首先讀取.env文件,在.env文件中可以輸入騰訊云固定的密鑰信息進(jìn)行授權(quán),也可以通過微信掃碼賦予CLI臨時(shí)的授權(quán),授權(quán)Serverless Components CLI在某一段時(shí)間可以操作云上某些資源的能力。
同時(shí)在.env文件里面可以注入相應(yīng)環(huán)境變量,你可以直接在serverless.yml中通過${env}的方式,直接引用環(huán)境變量配置(包含.env文件中的環(huán)境變量配置,以及手動(dòng)配置在環(huán)境中的變量參數(shù))。
接著讀取yaml配置。yaml文件要指定使用到的組件名以及組件相應(yīng)的輸入?yún)?shù),每個(gè)組件因?yàn)樯婕暗牟僮鲿?huì)不一樣,所以每個(gè)組件對參數(shù)也有自己的一套固定的規(guī)范。
通過CLI的命令進(jìn)行部署的時(shí)候,會(huì)把用戶代碼壓縮之后上傳。首先壓縮指定的代碼目錄,上傳到一個(gè)公共的COS里面。然后新建或者更新組件的狀態(tài),同時(shí)會(huì)在服務(wù)端把代碼下載下來,并注入Proxy代碼。
proxy代碼都實(shí)現(xiàn)了什么能力呢云函數(shù)主要的適用場景是事件驅(qū)動(dòng)型的,對于http請求的實(shí)現(xiàn)是通過API網(wǎng)關(guān)觸發(fā)器轉(zhuǎn)發(fā)的。網(wǎng)關(guān)接收到的http request會(huì)轉(zhuǎn)換為云函數(shù)需要的參數(shù)對象,在函數(shù)執(zhí)行包裝后的web框架,執(zhí)行完后再把http response轉(zhuǎn)換成API Gateway需要的結(jié)構(gòu)返回給網(wǎng)關(guān),網(wǎng)關(guān)再把response轉(zhuǎn)換成標(biāo)準(zhǔn)的http response返回,這樣就實(shí)現(xiàn)了整個(gè)HTTP的訪問。
用戶不需要關(guān)注這部分的實(shí)現(xiàn),按照正常的開發(fā)就可以,Components部署的時(shí)候會(huì)自動(dòng)注入這部分轉(zhuǎn)換邏輯的代碼。服務(wù)端在注入完proxy代碼后會(huì)把代碼上傳到用戶COS里面,然后創(chuàng)建或更新云函數(shù),同時(shí)會(huì)再創(chuàng)建或者更新API網(wǎng)關(guān)的配置。
這個(gè)時(shí)候再把整個(gè)創(chuàng)建的過程以及創(chuàng)建的狀態(tài)保存到服務(wù)端,控制臺再輸出整個(gè)組件最終需要給用戶看到的一些云上資源的信息,比如SCF的信息、API網(wǎng)關(guān)的信息、CDN的數(shù)據(jù)和數(shù)據(jù)庫信息等,整個(gè)部署就算是完成了。
應(yīng)用部署完后會(huì)返回API網(wǎng)關(guān)公用的二級域名的一個(gè)訪問地址,跟正常的函數(shù)與自己組裝資源去訪問應(yīng)用方式是一樣的。
大家可以看到,我們抹平了一些云函數(shù)和正常服務(wù)器差異化的實(shí)現(xiàn),抹平后通過Serverless Components可以不用關(guān)心這些特殊的邏輯邏輯,也不需要關(guān)心其他的云上的資源。
如果自己要?jiǎng)?chuàng)建一個(gè)應(yīng)用,同時(shí)要?jiǎng)?chuàng)建云函數(shù),代碼里面要自己轉(zhuǎn)換HTTP請求,然后創(chuàng)建一個(gè)觸發(fā)器綁定到云函數(shù)。
如果需要做靜態(tài)資源的加速,需要拆分靜態(tài)資源部署到COS,并配置一個(gè)CDN。這中間涉及到多個(gè)云資源的操作。而我們在Serverless Components中已經(jīng)將整套都實(shí)現(xiàn)了,只需要在yaml文件里把這些配置進(jìn)去就可以,部署完成后就可以看到你的應(yīng)用了。
三、Components生態(tài)建設(shè)
1.Serverless Components生態(tài)
如上圖所示,其中列舉了一些用戶使用比較多的Serverless Components組件,還有一些沒有列舉出來的,這些基礎(chǔ)的組件包括了騰訊云上的各種常用的基礎(chǔ)資源。可以通過對多個(gè)組件的組合來組成完整的應(yīng)用,也可以直接使用現(xiàn)有的高階組件。
我們也歡迎第三方開發(fā)者貢獻(xiàn)他們的組件,現(xiàn)在就已經(jīng)有很多第三方的開發(fā)者在貢獻(xiàn)他們的組件。
2.Serverless Next.js
接下來詳細(xì)介紹一個(gè)Serverless Components的具體實(shí)現(xiàn)。以Next jS項(xiàng)目為例,首先是初始化一個(gè)項(xiàng)目,安裝CLI,原來的項(xiàng)目不需要做什么改動(dòng),按照Serverless Components要求的規(guī)范進(jìn)行配置后,直接用命令行工具進(jìn)行部署。
執(zhí)行部署后component會(huì)幫用戶通過CLI進(jìn)行代碼的構(gòu)建,完成構(gòu)建后會(huì)把代碼部署到云函數(shù)上,創(chuàng)建API網(wǎng)關(guān)代理web服務(wù),同時(shí)部署靜態(tài)資源,會(huì)把目錄下的靜態(tài)文件自動(dòng)拆分,并部署到COS上面。
我們后面也會(huì)做更加智能化的優(yōu)化,next框架代碼比較大,每次部署都要上傳兩三百兆代碼,對上傳的效率和啟動(dòng)效率也有影響。
騰訊云提供layer的能力,我們會(huì)自動(dòng)拆分用戶的n odemodules到layer,之后的部署只需要把業(yè)務(wù)代碼上傳和部署就可以了,對部署效率有很大的提升。
這里是部署一個(gè)有一些復(fù)雜度的next應(yīng)用的屏幕截圖,可以看到完成部署僅需31秒,部署效率非常高
四、跨國合作:挑戰(zhàn)和收獲
1.跨國合作:挑戰(zhàn)
從開始合作到現(xiàn)在已經(jīng)有一年多了,還在不斷的磨合中。下面是我總結(jié)下來的,我們在一年多的合作里口罩體的挑戰(zhàn),與大家一起分享交流。
(1)溝通效率
由于時(shí)差,語言表達(dá),以及東西方思考方式的差異,導(dǎo)致整體的溝通效率比較低。
(2)開發(fā)模式
他們那邊是游擊隊(duì)的開發(fā)模式,有一些研發(fā)發(fā)布比較隨意,導(dǎo)致了一些線上的問題。而我們其實(shí)是有比較嚴(yán)格的開發(fā)流程,發(fā)布前的驗(yàn)證,發(fā)布后的確認(rèn),監(jiān)控告警的體系等等,都有嚴(yán)格的要求。
慢慢把我們這一套嚴(yán)格的規(guī)范灌輸給他們,并要求他們能夠按照我們的要求執(zhí)行。
(3)問題定位
由于整套體系比較龐大,大家在前面也看到了,一個(gè)完整的component的生命流程比較長,步驟比較多,之前也沒有統(tǒng)一的日志收集體系和系統(tǒng),導(dǎo)致出現(xiàn)了用戶問題定位花費(fèi)比較長的時(shí)間。
(4)目標(biāo)
兩個(gè)團(tuán)隊(duì)的目標(biāo)導(dǎo)向不完全一樣,我們更注重用戶云上資源的安全,對于密鑰的使用及權(quán)限控制比較嚴(yán)格,而他們更多的考慮的是使用上的便利。
(5)人才招聘
整套體系采用nodejs開發(fā),涉及到后端、存儲(chǔ)、數(shù)據(jù)庫等方方面面,對于開發(fā)的要求比較高。
另外,需要開發(fā)和產(chǎn)品有技術(shù)運(yùn)營的理念,有開放的心態(tài)。對于英語也有一定的要求,最好能和北美的開發(fā)團(tuán)隊(duì)直接對話。
(6)運(yùn)營理念的問題
國內(nèi)外開發(fā)者習(xí)慣是有差別的,國外比較多的開發(fā)者更容易接受命令行工具,而國內(nèi)開發(fā)者對這套東西不熟悉,需要有一個(gè)接受的過程。
我們也會(huì)做一些妥協(xié),比如后面可以考慮提供界面化的配置方式等。其實(shí)對于Serverless Framework與Serverless Components,騰訊云本地化的運(yùn)營方式和引導(dǎo)上跟國外會(huì)有所差別,我們會(huì)針對國內(nèi)開發(fā)者做一些貼合開發(fā)者習(xí)慣的嘗試。
其實(shí)在跨國合作中涉及CLI的時(shí)候,我們一直很迷惑。雖然我們很想把事情做好,但是對命令行工具的設(shè)計(jì)和交互設(shè)計(jì)方面受限于騰訊云的產(chǎn)品,無法突破自己的框架。
通過跟北美團(tuán)隊(duì)的交流合作,對我們的思路也有很大的開拓,我們跟他們學(xué)習(xí)到了他們的產(chǎn)品設(shè)計(jì)理念,在產(chǎn)品設(shè)計(jì)方面,AWS和周圍的生態(tài)確實(shí)對于我們是很好的借鑒意義。
進(jìn)行大型開源項(xiàng)目的實(shí)現(xiàn),合作過程中對協(xié)作方式也學(xué)習(xí)到了不少,對于整個(gè)后期的開源項(xiàng)目推進(jìn),后面再去參加別的開源項(xiàng)目,對于我們而言都是非常寶貴的經(jīng)驗(yàn)。
同時(shí),我們也把嚴(yán)格的軟件開發(fā)經(jīng)驗(yàn)輸出給北美,并獲得了他們的認(rèn)可,對于我們而言也是比較自豪的一件事。以前軟件開發(fā)方面北美領(lǐng)先于我們,所有方面我們向他們學(xué)習(xí)?,F(xiàn)在并不完全是這樣了,我們比較嚴(yán)格的軟件開發(fā)規(guī)范比他們走得更靠前,把我們的規(guī)范輸出給他們的同時(shí)也得到了北美團(tuán)隊(duì)的認(rèn)可。
2.跨國合作:收獲
·學(xué)習(xí)先進(jìn)的交互設(shè)計(jì)以及產(chǎn)品設(shè)計(jì)理念;
·以AWS的理念要求我們自己的產(chǎn)品;
·大型開源項(xiàng)目的協(xié)作方式;
·輸出嚴(yán)格的軟件開發(fā)規(guī)范,獲得認(rèn)可;
·同類型開源項(xiàng)目的借鑒和學(xué)習(xí),開闊視野。
同類型開源項(xiàng)目的借鑒和學(xué)習(xí)開拓了我們的視野,北美團(tuán)隊(duì)也會(huì)經(jīng)常發(fā)一些他們能夠了解到的信息同步給我們,我們能夠從中得到借鑒和學(xué)習(xí),并得到自己的增長。所以未來也會(huì)更加緊密合作。
QA
Q:Serverless現(xiàn)階段適用和適用的場景,騰訊內(nèi)部有哪些業(yè)務(wù)在用
A:所有的場景都是可以的。小程序云開發(fā)底層云函數(shù)的能力就是用我們Serverless的實(shí)現(xiàn),騰訊內(nèi)部還有比如微信支付、微信讀書、騰訊視頻、騰訊課堂有不少場景在用Serverless的服務(wù)。
Q:部署而言Serverless相對TKE有什么優(yōu)勢和劣勢
A:TKE本身是需要自己管理的,但是Serverless在計(jì)算資源方面完全不需要自己去管理,我們有一個(gè)完全的動(dòng)態(tài)彈性伸縮能力,會(huì)根據(jù)訪問的請求量去做自動(dòng)的伸縮,基本上省去了運(yùn)營的需要。
Q:監(jiān)控方面有什么成熟組件的接入
A:正常的外部應(yīng)用都是可以接入的,和虛擬機(jī)、容器等計(jì)算資源使用的方式相同。我們平臺也提供了一些基礎(chǔ)的監(jiān)控和日志能力,另一方面,也在聯(lián)合騰訊云的監(jiān)控團(tuán)隊(duì)做了自定義監(jiān)控組件上報(bào)能力的接入,可以在代碼里面自定義的上報(bào)到騰訊云監(jiān)控,自定義監(jiān)控平臺可以看到監(jiān)控的數(shù)據(jù)。
Q:Serverless對業(yè)務(wù)較復(fù)雜的大型項(xiàng)目是否適合
A:肯定適合,比如微信支付、微信讀書、騰訊視頻、騰訊課堂都有不少場景在用Serverless的服務(wù)。
Q:穩(wěn)定性保障的情況如何
A:Serverless是基于騰訊云整套體系來建設(shè)的,穩(wěn)定性方面也是經(jīng)過了大規(guī)模的壓測,有可靠的保障。比較大型的項(xiàng)目提前跟架構(gòu)師溝通,來做資源的預(yù)留或者是資源等級的提升
Q:學(xué)習(xí)路線是什么
A:部署自己的業(yè)務(wù)到Serverless服務(wù)上面來,可以在實(shí)踐中不斷的熟悉。還可以加入我們的微信或者qq群,和大量的開發(fā)者一起學(xué)習(xí)和探討,這樣在不斷的討論和學(xué)習(xí)過程中可以得到不斷的成長。有使用上的疑問或者問題也可以直接和我們的開發(fā)或者架構(gòu)師溝通。
Q:冷啟動(dòng)支持需要有低延時(shí)的應(yīng)用嗎
A:如果對冷啟動(dòng)比較敏感的業(yè)務(wù),可以通過預(yù)置并發(fā)來應(yīng)對冷啟動(dòng)的問題,設(shè)置了預(yù)置并發(fā)后,服務(wù)保留一定的最小資源量,這些資源量長時(shí)間存在,更大的并發(fā)到來時(shí)再通過自動(dòng)伸縮去拉起,就可以保證服務(wù)既可以解決低延時(shí)的問題也可以應(yīng)對大請求的流量
Q:如果部署在騰訊云的Serverless服務(wù)受到DDoS攻擊怎么收費(fèi)
A:用戶可以設(shè)置并發(fā)的上限,更多的請求自動(dòng)幫著擋住,不會(huì)把這些流量放進(jìn)來,實(shí)際消費(fèi)用到消耗的Serverless請求才會(huì)收費(fèi),其他的擋在控制并發(fā)外的請求我們不會(huì)收費(fèi)。
Q:平臺具體實(shí)施中如何避開Serverless的劣勢
A:關(guān)于Serverless的劣勢,一是冷啟動(dòng),二是開發(fā)習(xí)慣的一些改變,這些劣勢可以通過一些手段避開。冷啟動(dòng)的問題可以通過預(yù)置并發(fā)等高階能力解決,web場景用Serverless Components的能力就可以幫助抹平中間的差異
Q:企業(yè)應(yīng)該如何設(shè)置Serverless Components
A:要看具體的應(yīng)用場景,騰訊內(nèi)部的團(tuán)隊(duì)在使用上也有各種差別,主要還是依賴具體的應(yīng)用場景和需求。
Q:Java這種啟動(dòng)慢的語言,未來可以在Serverless上應(yīng)用嗎
A:其實(shí)國內(nèi)java開發(fā)者比較多,我覺得這是非常有潛力的發(fā)展方向,我們也在考慮啟動(dòng)比較慢的java應(yīng)用如何部署到SCF上面,這是我們努力的一個(gè)方向。
特別聲明:以上文章內(nèi)容僅代表作者本人觀點(diǎn),不代表ESG跨境電商觀點(diǎn)或立場。如有關(guān)于作品內(nèi)容、版權(quán)或其它問題請于作品發(fā)表后的30日內(nèi)與ESG跨境電商聯(lián)系。
二維碼加載中...
使用微信掃一掃登錄
使用賬號密碼登錄
平臺顧問
微信掃一掃
馬上聯(lián)系在線顧問
小程序
ESG跨境小程序
手機(jī)入駐更便捷
返回頂部