黄文俊:Serverless小程序后端技术分享
歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~
黃文俊,現(xiàn)任騰訊云SCF無服務(wù)器云函數(shù)高級(jí)產(chǎn)品經(jīng)理,多年企業(yè)級(jí)系統(tǒng)開發(fā)和架構(gòu)工作經(jīng)驗(yàn),對(duì)企業(yè)級(jí)存儲(chǔ)、容器平臺(tái)、微服務(wù)架構(gòu)、無服務(wù)器計(jì)算等領(lǐng)域均有涉獵。
今天講的是怎么使用Serverless做后端技術(shù)分享。我的職業(yè)偏向是后端,可能不是寫前端,不是使用Node.js,更多是使用CR做后端語(yǔ)言,今天關(guān)注的微信小程序,我這一塊的分享更多是怎么實(shí)現(xiàn)它的后端。我所使用的是Serverless技術(shù),也是在近兩年新出來的一種架構(gòu)。講Serverless這個(gè)架構(gòu)之前,我也給大家講一下小程序和傳統(tǒng)的后臺(tái)技術(shù)。
小程序的后臺(tái)技術(shù)
小程序,是一種全新的連接用戶與服務(wù)的方式,它可以在微信內(nèi)被便捷地獲取和傳播,同時(shí)具有出色的使用體驗(yàn)。它的加載方式比傳統(tǒng)的APP方式更快速上線,體驗(yàn)也不差,除了它本身的界面展示和刷新之外,小程序里面的數(shù)據(jù)獲取通過微信和后端進(jìn)行交互,小程序的運(yùn)行實(shí)際上是一個(gè)類前端的運(yùn)行方式,整個(gè)運(yùn)行是在微信內(nèi),它和后端的交互實(shí)際上通過微信進(jìn)行轉(zhuǎn)發(fā)的,運(yùn)行起來之后,它會(huì)提出一個(gè)api的請(qǐng)求,這個(gè)請(qǐng)求首先給到微信,微信再通過網(wǎng)絡(luò)apr轉(zhuǎn)到你自己的服務(wù)器上,服務(wù)器拿到這個(gè)請(qǐng)求以后進(jìn)行數(shù)據(jù)的處理,然后再響應(yīng)到前端,這就是小程序和后臺(tái)交互的一種架構(gòu)。
對(duì)于后端服務(wù),這張圖是大家傳統(tǒng)做的方式,暴露api,這些都可以用來開發(fā)業(yè)務(wù)應(yīng)用,業(yè)務(wù)應(yīng)用之后需要有相應(yīng)的存儲(chǔ)文件,結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ),或者是非結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ),需要有數(shù)據(jù)庫(kù)和緩存,為了實(shí)現(xiàn)這一套架構(gòu)且不會(huì)由于某一塊的服務(wù)器宕掉,或者有一些漏洞等等,我們通常的實(shí)現(xiàn)是一個(gè)較為復(fù)雜的過程。比如說,我們?yōu)榱吮WC的Serverless和服務(wù)器不會(huì)垮掉,需要建立一個(gè)集群,我們要對(duì)外提供服務(wù),需要LB的請(qǐng)求,請(qǐng)求到之后分到某一臺(tái)服務(wù)器上。比如說文件存儲(chǔ),如果單純只用一臺(tái)設(shè)備,這臺(tái)設(shè)備掛了,整個(gè)文件服務(wù)就掛了,所以我們要使用分布式存儲(chǔ)來解決文件存儲(chǔ)的問題。數(shù)據(jù)庫(kù)和緩存也是一樣的,需要構(gòu)建集群,無論是兩臺(tái)還是三臺(tái)還是多臺(tái),構(gòu)建集群以后能確保不會(huì)由于某一個(gè)單點(diǎn)的問題導(dǎo)致整個(gè)服務(wù)不可用,從而導(dǎo)致服務(wù)癱瘓。
如果作為一個(gè)小程序開發(fā)者,這套架構(gòu)在互聯(lián)網(wǎng)公司已經(jīng)搭建了,作為個(gè)人來說這一道太重了,需要了解這里面的某一塊和它的配置,比如說數(shù)據(jù)庫(kù)的集群怎么配?讓大家沒法把精力集中到你的業(yè)務(wù)和小程序本身,而是過多耗在運(yùn)維和支撐上。
Serverless架構(gòu)
我下面要介紹的Serverless架構(gòu),采用無服務(wù)器的方式,主要會(huì)介紹無服務(wù)器和云怎么結(jié)合,怎么利用云的服務(wù)減輕架構(gòu)化的工作。介紹它的架構(gòu)之前,我介紹一下Serverless架構(gòu),英文稱之為Serverless,中文稱之為無服務(wù)器,大家不用購(gòu)買服務(wù)器,不用購(gòu)買虛擬機(jī)或者物理機(jī),這一塊怎么運(yùn)行呢?它使用計(jì)算托管的方式,在Serverless這里,我們可以看成兩塊,第一塊就是函數(shù)即服務(wù),它真正實(shí)現(xiàn)了你業(yè)務(wù)的托管計(jì)算。另外一種是后端即服務(wù),包括對(duì)象存儲(chǔ),大家不用自己構(gòu)建分布式存儲(chǔ),不用擔(dān)心數(shù)據(jù)的丟失和安全性問題;同時(shí)在云上提供的數(shù)據(jù)庫(kù),消息隊(duì)列和對(duì)象存儲(chǔ)都是一樣的,不用購(gòu)買服務(wù)器自己搭建,在購(gòu)買使用的過程當(dāng)中我們可以稱之為Serverless。因?yàn)檫@些都是托管型的,使用的時(shí)候不用關(guān)心它的安全性,不用關(guān)心可能服務(wù)器宕機(jī)導(dǎo)致的故障。
Serverless的計(jì)算托管式云在服務(wù)函數(shù)內(nèi),下面來講一下云函數(shù)的架構(gòu)。大家看到這個(gè)架構(gòu)以后,我們后面在拿一個(gè)實(shí)際案例來看怎么把具體的api服務(wù)落地。云服務(wù)器架構(gòu)本身是計(jì)算托管型的,計(jì)算托管意味著把真正的業(yè)務(wù)代碼托管到云上面,然后在云上面運(yùn)行,它的運(yùn)行方式有一個(gè)特點(diǎn)是觸發(fā)式運(yùn)營(yíng),跟各個(gè)產(chǎn)品打通以后,各個(gè)產(chǎn)品產(chǎn)生的事件,后面的案例就是和API網(wǎng)關(guān)進(jìn)行結(jié)合,從api網(wǎng)關(guān)來的事件就是api事件,當(dāng)這個(gè)請(qǐng)求到達(dá)api網(wǎng)關(guān)時(shí),我們就認(rèn)為是一個(gè)事件,然后再運(yùn)行。大家最初進(jìn)行托管的時(shí)候,把代碼和觸發(fā)期的配置提交到云上面來,并不是說提交之后代碼就運(yùn)行起來,而是事件到達(dá)才運(yùn)行起來,代碼對(duì)這個(gè)事件進(jìn)行處理。在這個(gè)過程中,對(duì)于每一次的事件,每一個(gè)代碼拉起的過程,實(shí)際上都是單獨(dú)處理一個(gè)事件,為什么呢?因?yàn)槲覀冊(cè)谶@兒使用并發(fā)的模式,如果你有上萬(wàn)個(gè)用戶同時(shí)訪問你的小程序,要同時(shí)對(duì)上萬(wàn)的用戶進(jìn)行服務(wù),啟動(dòng)上萬(wàn)的實(shí)例,它是在事件時(shí)運(yùn)行起來,沒有事件不能運(yùn)行,這與微信小程序本身點(diǎn)開即用、用完即走的概念是符合的,有請(qǐng)求時(shí)才運(yùn)行,沒有請(qǐng)求時(shí)不運(yùn)行。產(chǎn)品的計(jì)費(fèi)模式也是根據(jù)實(shí)際運(yùn)行的時(shí)間計(jì)費(fèi)的。
Serverless的使用
怎么使用Serverless呢?傳統(tǒng)的架構(gòu)就是前面說的web服務(wù),然后是使用存儲(chǔ)、緩存,我們對(duì)外服務(wù)以后,有對(duì)外暴露相應(yīng)的api,實(shí)際上用戶的業(yè)務(wù)邏輯都是放在云函數(shù)內(nèi),需要結(jié)構(gòu)化存儲(chǔ),需要進(jìn)行緩存或者對(duì)象存儲(chǔ),我們需要數(shù)據(jù)服務(wù)或者云緩存服務(wù)等,其他的服務(wù)都可以直接在線服務(wù),這些服務(wù)直接通過代碼調(diào)用。
前面講了Serverless的架構(gòu)介紹,后面是對(duì)于這個(gè)后臺(tái)開發(fā)的介紹,后面也是基于這個(gè)方式進(jìn)行詳細(xì)案例的說明。
小程序除了本身的頁(yè)面啟動(dòng),后續(xù)與網(wǎng)絡(luò)的交互都是由小程序發(fā)起,經(jīng)過微信本身以后,首先請(qǐng)求到達(dá)api網(wǎng)關(guān),對(duì)于對(duì)外的api的管理,把這個(gè)api暴露到官網(wǎng)上,可以被要程序訪問得到。它本身也能夠提供api的發(fā)布和版本的切換能力,api網(wǎng)關(guān)之后就是云函數(shù)。云函數(shù)就是實(shí)際處理業(yè)務(wù)的邏輯,如果你需要使用數(shù)據(jù)庫(kù),就在代碼內(nèi)發(fā)數(shù)據(jù)庫(kù)的連接,需要存儲(chǔ)文件,就調(diào)用相應(yīng)的窗口寫文件。
基于這個(gè)方案我們來看一下,傳統(tǒng)提供的是中間的一塊,因?yàn)榍岸耸怯脩舻男〕绦?#xff0c;后端是微信本身提供的接口服務(wù),中間建議的是開發(fā)者自己的服務(wù)器。我們現(xiàn)在要展示的一個(gè)案例,也就是怎么把中間的開發(fā)者服務(wù)器替換掉,用Serverless的方案落地,我們使用了api網(wǎng)關(guān)加云數(shù)據(jù)庫(kù)實(shí)現(xiàn)開發(fā)者服務(wù)器所能夠做到的事情,不需要購(gòu)買服務(wù)器而落地我們的api。
首先從最前面的小程序來看,這個(gè)案例也是小程序開發(fā)者上面的demo,demo的前端包括登陸端口,以及session展示,我們?cè)谛〕绦蜻@端首先獲取一個(gè)talk,開發(fā)者拿到以后再跟微信交互,驗(yàn)證合法以后,我們這里選擇了記錄到云數(shù)據(jù)庫(kù),這就是小程序界面提供點(diǎn)擊登陸的位置,后面的業(yè)務(wù)會(huì)發(fā)送請(qǐng)求到云上面來。
對(duì)于這個(gè)小程序的核心,我們?cè)谀骋粋€(gè)api上面的路徑就是在hos的login url上發(fā)起GET操作,根據(jù)Wx.login構(gòu)造請(qǐng)求的頭部,body內(nèi)容,發(fā)送獲取到的code及加密數(shù)據(jù)到后臺(tái)。
api網(wǎng)關(guān)
我們看一下api網(wǎng)關(guān)做的事情,它對(duì)外以一個(gè)api的接口呈現(xiàn)出來,我們直接提供了對(duì)外訪問的域名,用戶基于這個(gè)域名綁定自己所擁有的域名,這種情況下可以實(shí)現(xiàn)發(fā)布的要求,微信小程序的開發(fā)者要求域名要備案,把自己的域名綁定到api的服務(wù)上面來,對(duì)外提供,在右側(cè)api的網(wǎng)關(guān)上,配一個(gè)/login Get,在后臺(tái)還未實(shí)現(xiàn)之前,可以配置為mock方法,解耦前后端,小程序可以基于api構(gòu)造的mock數(shù)據(jù)開發(fā)。實(shí)現(xiàn)云函數(shù)后,對(duì)接api到云函數(shù)并更新發(fā)布api,避免開發(fā)的同時(shí)影響到在線業(yè)務(wù)。
云函數(shù)的處理流程
從云函數(shù)的方面來說,用戶會(huì)承載計(jì)算業(yè)務(wù)。按照我們最開始用戶給的官方圖,拿到api的請(qǐng)求以后,解析請(qǐng)求內(nèi)容,根據(jù)規(guī)范連接微信認(rèn)證服務(wù)器,獲取認(rèn)證情況并記錄session,返回session信息給到請(qǐng)求端。拿到微信服務(wù)器的返回以后可以判斷用戶的登陸過程是成功還是失敗,如果成功以后可以拿到用戶相應(yīng)的值,這個(gè)地方我們發(fā)起到數(shù)據(jù)庫(kù)的連接,建立一個(gè)masico的連接,完成session的記錄。
云函數(shù)的處理流程之后,下面展示的是我們?cè)趺春蛿?shù)據(jù)庫(kù)建立連接,登陸信息的細(xì)節(jié)流程,創(chuàng)建連接并可復(fù)用連接,拼裝SQL語(yǔ)句并執(zhí)行。
數(shù)據(jù)庫(kù)的配置
這個(gè)地方就是我們購(gòu)買以后,數(shù)據(jù)庫(kù)啟動(dòng)并且做了登陸以后,可以進(jìn)入到數(shù)據(jù)庫(kù)里面查看數(shù)據(jù),查看session的記錄。
實(shí)操案例——用戶登陸及session展示
創(chuàng)建并初始化實(shí)例,按照mysql標(biāo)準(zhǔn)化使用方式操作,計(jì)算托管式的優(yōu)勢(shì)用戶關(guān)心核心的代碼,不用關(guān)心周邊的運(yùn)維,由于托管式業(yè)務(wù),無論是個(gè)人請(qǐng)求,個(gè)人開發(fā)者的小程序,很有可能你的一個(gè)小程序就成為爆款,爆款以后可能訪問量就是突增的形式。
我們利用session的架構(gòu)實(shí)現(xiàn)小程序,而且不用去擔(dān)心運(yùn)維;秒級(jí)啟動(dòng),彈性計(jì)算能力滿足用戶上萬(wàn)的并發(fā)。核心點(diǎn)關(guān)注業(yè)務(wù)代碼,而不用關(guān)注web,這就是快速的應(yīng)用實(shí)現(xiàn)小程序的落地的方法。
Q/A
Q:在api網(wǎng)關(guān)部署HTTPS證書嗎?
A:對(duì),這個(gè)證書是騰訊云提供的,綁定你自己域名的時(shí)候,可以實(shí)現(xiàn)HTTPS的支持。
Q:我們?cè)谏a(chǎn)環(huán)境的時(shí)候由騰訊云提供的證書?
A:對(duì)。
Q:在生產(chǎn)環(huán)節(jié)需要騰訊云提供的證書上線我們的服務(wù)?
A:對(duì),這是小程序方面的要求,因?yàn)樾〕绦蛞蟊仨毷褂米杂杏蛎托〕绦虼蛲ā?/p>
Q:小程序即用即刪,如果手機(jī)里面有很多會(huì)很卡,如果小程序用過在微信上面的頁(yè)面會(huì)顯示出來,如果上萬(wàn)個(gè)對(duì)微信本身有什么影響?
A:可以從一些限制可以看到,現(xiàn)在對(duì)于微信小程序的大小有限制的,它本身的大小是要求,目前我記得是5兆包2兆包的大小,如果是上千個(gè),對(duì)于你手機(jī)來說可能是多存儲(chǔ)了一些數(shù)據(jù),每個(gè)包最大用滿可能就是5兆,本身小程序頁(yè)面的加載都是有限制的,這個(gè)限制從微信角度來考慮,都是為了保證小程序的流暢運(yùn)行,不會(huì)對(duì)用戶的手機(jī)造成很大的沖擊,這一塊要微信的同學(xué)介紹,我是偏后端的。
Q:我再舉個(gè)例子,小程序進(jìn)入的時(shí)候加載速度比較快的,舉一個(gè)比較極端的,比如說跳一跳,第一次使用的時(shí)候,它的加載速度,比如說今天用完了,刪掉,過一段時(shí)間再進(jìn)去,相比來說加載速度有差別嗎?或者第二次用的時(shí)候快一些嗎?原因是什么?
A:這個(gè)要由微信的同學(xué)解答比較好一些,因?yàn)檫@些都是小程序本身的體現(xiàn),或者說速度的一種體現(xiàn)。
Q:你好,我是做后端開發(fā)的,什么樣的模型不是用Serverless來做的。
A:Serverless它本身的一些特性也限制了它的使用場(chǎng)景,比如說對(duì)于內(nèi)存的配置,cpu的配置,運(yùn)行時(shí)間的限制,不是所有場(chǎng)合都適用,它本身對(duì)運(yùn)行時(shí)間有限制的,不能長(zhǎng)時(shí)間的運(yùn)用,包括內(nèi)存的使用,包括cpu的應(yīng)用,比如說動(dòng)畫的渲染,長(zhǎng)時(shí)間的批量計(jì)算,這些都不適合api的服務(wù),由于它的請(qǐng)求到達(dá)以后必須快速響應(yīng)用戶,api比較適合的。
更多分享資料,請(qǐng)戳下面的鏈接:
使用 serverless 構(gòu)建小程序后臺(tái).pdf
微信小程序如何與數(shù)據(jù)庫(kù)交互?
相關(guān)閱讀
朱展:騰訊云小程序解決方案
施德來:有贊電商小程序的實(shí)踐
鄒偉:如何開發(fā)一款小游戲
此文已由作者授權(quán)騰訊云+社區(qū)發(fā)布,原文鏈接:https://cloud.tencent.com/dev...
總結(jié)
以上是生活随笔為你收集整理的黄文俊:Serverless小程序后端技术分享的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: colmak键盘_Colemak键盘布局
- 下一篇: openlayer 图层上下_OpenL