黃文俊:Serverless小程式後端技術分享

騰訊雲加社群發表於2018-05-08
歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~
黃文俊,現任騰訊雲SCF無伺服器雲函式高階產品經理,多年企業級系統開發和架構工作經驗,對企業級儲存、容器平臺、微服務架構、無伺服器計算等領域均有涉獵。

今天講的是怎麼使用Serverless做後端技術分享。我的職業偏向是後端,可能不是寫前端,不是使用Node.js,更多是使用CR做後端語言,今天關注的微信小程式,我這一塊的分享更多是怎麼實現它的後端。我所使用的是Serverless技術,也是在近兩年新出來的一種架構。講Serverless這個架構之前,我也給大家講一下小程式和傳統的後臺技術。

小程式的後臺技術

小程式,是一種全新的連線使用者與服務的方式,它可以在微信內被便捷地獲取和傳播,同時具有出色的使用體驗。它的載入方式比傳統的APP方式更快速上線,體驗也不差,除了它本身的介面展示和重新整理之外,小程式裡面的資料獲取通過微信和後端進行互動,小程式的執行實際上是一個類前端的執行方式,整個執行是在微信內,它和後端的互動實際上通過微信進行轉發的,執行起來之後,它會提出一個api的請求,這個請求首先給到微信,微信再通過網路apr轉到你自己的伺服器上,伺服器拿到這個請求以後進行資料的處理,然後再響應到前端,這就是小程式和後臺互動的一種架構。

對於後端服務,這張圖是大家傳統做的方式,暴露api,這些都可以用來開發業務應用,業務應用之後需要有相應的儲存檔案,結構化的資料儲存,或者是非結構化的資料儲存,需要有資料庫和快取,為了實現這一套架構且不會由於某一塊的伺服器宕掉,或者有一些漏洞等等,我們通常的實現是一個較為複雜的過程。比如說,我們為了保證的Serverless和伺服器不會垮掉,需要建立一個叢集,我們要對外提供服務,需要LB的請求,請求到之後分到某一臺伺服器上。比如說檔案儲存,如果單純只用一臺裝置,這臺裝置掛了,整個檔案服務就掛了,所以我們要使用分散式儲存來解決檔案儲存的問題。資料庫和快取也是一樣的,需要構建叢集,無論是兩臺還是三臺還是多臺,構建叢集以後能確保不會由於某一個單點的問題導致整個服務不可用,從而導致服務癱瘓。


如果作為一個小程式開發者,這套架構在網際網路公司已經搭建了,作為個人來說這一道太重了,需要了解這裡面的某一塊和它的配置,比如說資料庫的叢集怎麼配?讓大家沒法把精力集中到你的業務和小程式本身,而是過多耗在運維和支撐上。

Serverless架構

我下面要介紹的Serverless架構,採用無伺服器的方式,主要會介紹無伺服器和雲怎麼結合,怎麼利用雲的服務減輕架構化的工作。介紹它的架構之前,我介紹一下Serverless架構,英文稱之為Serverless,中文稱之為無伺服器,大家不用購買伺服器,不用購買虛擬機器或者物理機,這一塊怎麼執行呢?它使用計算託管的方式,在Serverless這裡,我們可以看成兩塊,第一塊就是函式即服務,它真正實現了你業務的託管計算。另外一種是後端即服務,包括物件儲存,大家不用自己構建分散式儲存,不用擔心資料的丟失和安全性問題;同時在雲上提供的資料庫,訊息佇列和物件儲存都是一樣的,不用購買伺服器自己搭建,在購買使用的過程當中我們可以稱之為Serverless。因為這些都是託管型的,使用的時候不用關心它的安全性,不用關心可能伺服器當機導致的故障。

Serverless的計算託管式雲在服務函式內,下面來講一下雲函式的架構。大家看到這個架構以後,我們後面在拿一個實際案例來看怎麼把具體的api服務落地。雲伺服器架構本身是計算託管型的,計算託管意味著把真正的業務程式碼託管到雲上面,然後在雲上面執行,它的執行方式有一個特點是觸發式運營,跟各個產品打通以後,各個產品產生的事件,後面的案例就是和API閘道器進行結合,從api閘道器來的事件就是api事件,當這個請求到達api閘道器時,我們就認為是一個事件,然後再執行。大家最初進行託管的時候,把程式碼和觸發期的配置提交到雲上面來,並不是說提交之後程式碼就執行起來,而是事件到達才執行起來,程式碼對這個事件進行處理。在這個過程中,對於每一次的事件,每一個程式碼拉起的過程,實際上都是單獨處理一個事件,為什麼呢?因為我們在這兒使用併發的模式,如果你有上萬個使用者同時訪問你的小程式,要同時對上萬的使用者進行服務,啟動上萬的例項,它是在事件時執行起來,沒有事件不能執行,這與微信小程式本身點開即用、用完即走的概念是符合的,有請求時才執行,沒有請求時不執行。產品的計費模式也是根據實際執行的時間計費的。

Serverless的使用

怎麼使用Serverless呢?傳統的架構就是前面說的web服務,然後是使用儲存、快取,我們對外服務以後,有對外暴露相應的api,實際上使用者的業務邏輯都是放在雲函式內,需要結構化儲存,需要進行快取或者物件儲存,我們需要資料服務或者雲快取服務等,其他的服務都可以直接線上服務,這些服務直接通過程式碼呼叫。

前面講了Serverless的架構介紹,後面是對於這個後臺開發的介紹,後面也是基於這個方式進行詳細案例的說明。

小程式除了本身的頁面啟動,後續與網路的互動都是由小程式發起,經過微信本身以後,首先請求到達api閘道器,對於對外的api的管理,把這個api暴露到官網上,可以被要程式訪問得到。它本身也能夠提供api的釋出和版本的切換能力,api閘道器之後就是雲函式。雲函式就是實際處理業務的邏輯,如果你需要使用資料庫,就在程式碼內發資料庫的連線,需要儲存檔案,就呼叫相應的視窗寫檔案。

基於這個方案我們來看一下,傳統提供的是中間的一塊,因為前端是使用者的小程式,後端是微信本身提供的介面服務,中間建議的是開發者自己的伺服器。我們現在要展示的一個案例,也就是怎麼把中間的開發者伺服器替換掉,用Serverless的方案落地,我們使用了api閘道器加雲資料庫實現開發者伺服器所能夠做到的事情,不需要購買伺服器而落地我們的api。

首先從最前面的小程式來看,這個案例也是小程式開發者上面的demo,demo的前端包括登陸埠,以及session展示,我們在小程式這端首先獲取一個talk,開發者拿到以後再跟微信互動,驗證合法以後,我們這裡選擇了記錄到雲資料庫,這就是小程式介面提供點選登陸的位置,後面的業務會傳送請求到雲上面來。

對於這個小程式的核心,我們在某一個api上面的路徑就是在hos的login url上發起GET操作,根據Wx.login構造請求的頭部,body內容,傳送獲取到的code及加密資料到後臺。

api閘道器

我們看一下api閘道器做的事情,它對外以一個api的介面呈現出來,我們直接提供了對外訪問的域名,使用者基於這個域名繫結自己所擁有的域名,這種情況下可以實現釋出的要求,微信小程式的開發者要求域名要備案,把自己的域名繫結到api的服務上面來,對外提供,在右側api的閘道器上,配一個/login Get,在後臺還未實現之前,可以配置為mock方法,解耦前後端,小程式可以基於api構造的mock資料開發。實現雲函式後,對接api到雲函式並更新發布api,避免開發的同時影響到線上業務。

雲函式的處理流程

從雲函式的方面來說,使用者會承載計算業務。按照我們最開始使用者給的官方圖,拿到api的請求以後,解析請求內容,根據規範連線微信認證伺服器,獲取認證情況並記錄session,返回session資訊給到請求端。拿到微信伺服器的返回以後可以判斷使用者的登陸過程是成功還是失敗,如果成功以後可以拿到使用者相應的值,這個地方我們發起到資料庫的連線,建立一個masico的連線,完成session的記錄。

雲函式的處理流程之後,下面展示的是我們怎麼和資料庫建立連線,登陸資訊的細節流程,建立連線並可複用連線,拼裝SQL語句並執行。

資料庫的配置

這個地方就是我們購買以後,資料庫啟動並且做了登陸以後,可以進入到資料庫裡面檢視資料,檢視session的記錄。

實操案例——使用者登陸及session展示

建立並初始化例項,按照mysql標準化使用方式操作,計算託管式的優勢使用者關心核心的程式碼,不用關心周邊的運維,由於託管式業務,無論是個人請求,個人開發者的小程式,很有可能你的一個小程式就成為爆款,爆款以後可能訪問量就是突增的形式。

我們利用session的架構實現小程式,而且不用去擔心運維;秒級啟動,彈性計算能力滿足使用者上萬的併發。核心點關注業務程式碼,而不用關注web,這就是快速的應用實現小程式的落地的方法。

Q/A

Q:在api閘道器部署HTTPS證書嗎?

A:對,這個證書是騰訊雲提供的,繫結你自己域名的時候,可以實現HTTPS的支援。

Q:我們在生產環境的時候由騰訊雲提供的證書?

A:對。

Q:在生產環節需要騰訊雲提供的證書上線我們的服務?

A:對,這是小程式方面的要求,因為小程式要求必須使用自有域名和小程式打通。

Q:小程式即用即刪,如果手機裡面有很多會很卡,如果小程式用過在微信上面的頁面會顯示出來,如果上萬個對微信本身有什麼影響?

A:可以從一些限制可以看到,現在對於微信小程式的大小有限制的,它本身的大小是要求,目前我記得是5兆包2兆包的大小,如果是上千個,對於你手機來說可能是多儲存了一些資料,每個包最大用滿可能就是5兆,本身小程式頁面的載入都是有限制的,這個限制從微信角度來考慮,都是為了保證小程式的流暢執行,不會對使用者的手機造成很大的衝擊,這一塊要微信的同學介紹,我是偏後端的。

Q:我再舉個例子,小程式進入的時候載入速度比較快的,舉一個比較極端的,比如說跳一跳,第一次使用的時候,它的載入速度,比如說今天用完了,刪掉,過一段時間再進去,相比來說載入速度有差別嗎?或者第二次用的時候快一些嗎?原因是什麼?

A:這個要由微信的同學解答比較好一些,因為這些都是小程式本身的體現,或者說速度的一種體現。

Q:你好,我是做後端開發的,什麼樣的模型不是用Serverless來做的。

A:Serverless它本身的一些特性也限制了它的使用場景,比如說對於記憶體的配置,cpu的配置,執行時間的限制,不是所有場合都適用,它本身對執行時間有限制的,不能長時間的運用,包括記憶體的使用,包括cpu的應用,比如說動畫的渲染,長時間的批量計算,這些都不適合api的服務,由於它的請求到達以後必須快速響應使用者,api比較適合的。

更多分享資料,請戳下面的連結:

使用 serverless 構建小程式後臺.pdf

問答
微信小程式如何與資料庫互動?
相關閱讀
朱展:騰訊雲小程式解決方案
施德來:有贊電商小程式的實踐
鄒偉:如何開發一款小遊戲

此文已由作者授權騰訊雲+社群釋出,原文連結:https://cloud.tencent.com/developer/article/1116854?fromSource=waitui

黃文俊:Serverless小程式後端技術分享


相關文章