小程序云開(kāi)發(fā)
1、 基本概念
小程序云開(kāi)發(fā)是集成于小程序控制臺(tái)的原生 serverless 云服務(wù)。核心功能包括:云存儲(chǔ)、云數(shù)據(jù)庫(kù)和云函數(shù)。小程序云開(kāi)發(fā)解決了傳統(tǒng)開(kāi)發(fā)模式下開(kāi)發(fā)效率低、資源投入高、產(chǎn)品上線慢和日常運(yùn)維難等問(wèn)題。
開(kāi)發(fā)者可以使用云開(kāi)發(fā)開(kāi)發(fā)微信小程序、小游戲,無(wú)需搭建服務(wù)器,即可使用云端能力。云開(kāi)發(fā)為開(kāi)發(fā)者提供完整的原生云端支持和微信服務(wù)支持,弱化后端和運(yùn)維概念,無(wú)需搭建服務(wù)器,使用平臺(tái)提供的 API 進(jìn)行核心業(yè)務(wù)開(kāi)發(fā),即可實(shí)現(xiàn)快速上線和迭代,同時(shí)這一能力,同開(kāi)發(fā)者已經(jīng)使用的云服務(wù)相互兼容,并不互斥。
云開(kāi)發(fā)提供了幾大基礎(chǔ)能力支持:
| 能 力 | 作 用 | 說(shuō) 明 |
|---|---|---|
| 云函數(shù) | 無(wú)需自建服務(wù)器 | 在云端運(yùn)行的代碼,微信私有協(xié)議天然鑒權(quán),開(kāi)發(fā)者只需編寫(xiě)自身業(yè)務(wù)邏輯代碼 |
| 數(shù)據(jù)庫(kù) | 無(wú)需自建數(shù)據(jù)庫(kù) | 一個(gè)既可在小程序前端操作,也能在云函數(shù)中讀寫(xiě)的 JSON 數(shù)據(jù)庫(kù) |
| 存儲(chǔ) | 無(wú)需自建存儲(chǔ)和 CDN | 在小程序前端直接上傳/下載云端文件,在云開(kāi)發(fā)控制臺(tái)可視化管理 |
| 云調(diào)用 | 原生微信服務(wù)集成 | 基于云函數(shù)免鑒權(quán)使用小程序開(kāi)放接口的能力,包括服務(wù)端調(diào)用、獲取開(kāi)放數(shù)據(jù)等能力 |
云函數(shù)
云函數(shù)即在云端(服務(wù)器端)運(yùn)行的函數(shù)。在物理設(shè)計(jì)上,一個(gè)云函數(shù)可由多個(gè)文件組成,占用一定量的 CPU 內(nèi)存等計(jì)算資源;各云函數(shù)完全獨(dú)立;可分別部署在不同的地區(qū)。開(kāi)發(fā)者無(wú)需購(gòu)買(mǎi)、搭建服務(wù)器,只需編寫(xiě)函數(shù)代碼并部署到云端即可在小程序端調(diào)用,同時(shí)云函數(shù)之間也可互相調(diào)用。
云開(kāi)發(fā)的云函數(shù)的獨(dú)特優(yōu)勢(shì)在于與微信登錄鑒權(quán)的無(wú)縫整合。當(dāng)小程序端調(diào)用云函數(shù)時(shí),云函數(shù)的傳入?yún)?shù)中會(huì)被注入小程序端用戶的 openid,開(kāi)發(fā)者無(wú)需校驗(yàn) openid 的正確性因?yàn)槲⑿乓呀?jīng)完成了這部分鑒權(quán),開(kāi)發(fā)者可以直接使用該 openid。
當(dāng)前,云函數(shù)支持Node.js,后續(xù)將支持PHP、Java、Python等語(yǔ)言。
云存儲(chǔ)
云開(kāi)發(fā)提供了一塊存儲(chǔ)空間,提供了上傳文件到云端、帶權(quán)限管理的云端下載能力,開(kāi)發(fā)者可以在小程序端和云函數(shù)端通過(guò) API 使用云存儲(chǔ)功能。
在小程序端可以分別調(diào)用 wx.cloud.uploadFile 和 wx.cloud.downloadFile 完成上傳和下載云文件操作。
云數(shù)據(jù)庫(kù)
云開(kāi)發(fā)提供了一個(gè) JSON 數(shù)據(jù)庫(kù),顧名思義,數(shù)據(jù)庫(kù)中的每條記錄都是一個(gè) JSON 格式的對(duì)象。一個(gè)數(shù)據(jù)庫(kù)可以有多個(gè)集合(相當(dāng)于關(guān)系型數(shù)據(jù)中的表),集合可看做一個(gè) JSON 數(shù)組,數(shù)組中的每個(gè)對(duì)象就是一條記錄,記錄的格式是 JSON 對(duì)象。
云調(diào)用
云調(diào)用是云開(kāi)發(fā)提供的基于云函數(shù)使用小程序開(kāi)放接口的能力,目前覆蓋以下使用場(chǎng)景:服務(wù)端調(diào)用、開(kāi)放數(shù)據(jù)調(diào)用和消息推送。
服務(wù)端調(diào)用:云調(diào)用需要在云函數(shù)中通過(guò)
wx-server-sdk使用。在云函數(shù)中使用云調(diào)用調(diào)用服務(wù)端接口無(wú)需換取access_token,只要是在從小程序端觸發(fā)的云函數(shù)中發(fā)起的云調(diào)用都經(jīng)過(guò)微信自動(dòng)鑒權(quán),可以在登記權(quán)限后直接調(diào)用如發(fā)送模板消息等開(kāi)放接口。開(kāi)放數(shù)據(jù)調(diào)用:云開(kāi)發(fā)的云調(diào)用,可直接獲取微信開(kāi)放數(shù)據(jù)。接口如果涉及敏感數(shù)據(jù)(如wx.getWeRunData),接口的明文內(nèi)容將不包含這些敏感數(shù)據(jù),而是在返回的接口中包含對(duì)應(yīng)敏感數(shù)據(jù)的
cloudID字段,數(shù)據(jù)可以通過(guò)云函數(shù)獲取。消息推送:云開(kāi)發(fā)也支持通過(guò)云函數(shù)接收小程序消息推送(如接收到客服消息時(shí)觸發(fā)云函數(shù))。只需兩步即可完成接入。
2、云開(kāi)發(fā)與傳統(tǒng)開(kāi)發(fā)對(duì)比
在傳統(tǒng)開(kāi)發(fā)模式中,開(kāi)發(fā)者需要從小程序端通過(guò)額外引用的SDK請(qǐng)求后端,需要關(guān)心彈性伸縮、異地容災(zāi)、網(wǎng)絡(luò)防護(hù)、安全加固等眾多條件。過(guò)多的業(yè)務(wù)邏輯需要處理,導(dǎo)致開(kāi)發(fā)效率偏低。而傳統(tǒng)開(kāi)發(fā)模式下,前后端分離與聯(lián)調(diào),往往導(dǎo)致上線效率低。在人力物力上,從物理機(jī)托管,到云主機(jī),再到容器,始終需要投入不少的人力物力。
相比而言,云開(kāi)發(fā)模式中,開(kāi)發(fā)者從小程序端通過(guò)小程序原生接口請(qǐng)求云開(kāi)發(fā)即可。
云開(kāi)發(fā)模式具備優(yōu)勢(shì)如下:
- 開(kāi)發(fā)更簡(jiǎn)單
使用云函數(shù)時(shí),用戶只需編寫(xiě)最重要的核心業(yè)務(wù)代碼,不再需要關(guān)心負(fù)載均衡、自動(dòng)伸縮、網(wǎng)關(guān)等組件,也無(wú)需構(gòu)建應(yīng)用的后端服務(wù),極大地降低了后端開(kāi)發(fā)搭建的復(fù)雜性。無(wú)需手動(dòng)配置,云函數(shù)即可根據(jù)請(qǐng)求量自動(dòng)橫向擴(kuò)縮,自動(dòng)安排合理的計(jì)算資源滿足業(yè)務(wù)需求。
- 開(kāi)發(fā)更高效快捷
云函數(shù)不要求特定框架或依賴,開(kāi)發(fā)者可以專注于核心代碼的開(kāi)發(fā)。同時(shí)開(kāi)發(fā)人員可以組成多個(gè)小團(tuán)隊(duì),單個(gè)模塊的開(kāi)發(fā)無(wú)需了解其他團(tuán)隊(duì)的代碼細(xì)節(jié)。
獨(dú)立開(kāi)發(fā)和迭代的速度變得前所未有的快,幫助用戶把握住產(chǎn)品上線的黃金時(shí)間。開(kāi)發(fā)可以使用云函數(shù)編寫(xiě)一些目的單一、邏輯獨(dú)立的業(yè)務(wù)模塊,因而可以完全復(fù)用已經(jīng)成熟的第三方代碼實(shí)現(xiàn)。
- 運(yùn)維更省事
每個(gè)云函數(shù)都是單獨(dú)運(yùn)行、單獨(dú)部署、單獨(dú)伸縮,用戶上傳代碼后即可自動(dòng)部署,免除單體式應(yīng)用部署升級(jí)難的問(wèn)題。
用戶不再需要對(duì) OS 入侵、登錄風(fēng)險(xiǎn)、文件系統(tǒng)安全、網(wǎng)絡(luò)安全和端口監(jiān)聽(tīng)做復(fù)雜的配置和管理,一切交由平臺(tái)處理,平臺(tái)通過(guò)定制化的容器保證每個(gè)用戶的隔離性。
- 成本更低
按請(qǐng)求數(shù)和資源端運(yùn)行收費(fèi),極大節(jié)約時(shí)間和成本,同時(shí)還提供一定量端免費(fèi)額度。
云開(kāi)發(fā)的缺點(diǎn):
1.云函數(shù)運(yùn)算時(shí)間不得超過(guò)3秒
超過(guò)3秒未處理完成,直接返回錯(cuò)誤。2.云函數(shù)單次返回?cái)?shù)據(jù)不得超過(guò)1M
超過(guò)1M直接報(bào)錯(cuò)3.云函數(shù)讀取數(shù)據(jù)庫(kù)較慢
云函數(shù) 云數(shù)據(jù)庫(kù)感覺(jué)應(yīng)該在同一物理環(huán)境下,但其實(shí)并不是,應(yīng)該處于不同的云端,因?yàn)樽x取100次數(shù)據(jù)就已經(jīng)超過(guò)3秒了4.云函數(shù)并發(fā)次數(shù)有限
這個(gè)文檔里面配額寫(xiě)得很清楚,免費(fèi)版并發(fā)數(shù)只有20次,這里的并發(fā)估計(jì)是每秒鐘調(diào)用次數(shù),因?yàn)榇_實(shí)很慢很慢,據(jù)我實(shí)踐,每隔半秒調(diào)用一個(gè)云函數(shù),調(diào)用100遍,還是報(bào)告調(diào)用次數(shù)超限。5.云函數(shù)不適合做數(shù)據(jù)庫(kù)的較大數(shù)量查詢功能
鑒于上述4點(diǎn)功能,意味著不要在云函數(shù)進(jìn)行較大的數(shù)據(jù)讀取操作,只適合進(jìn)行10條左右的敏感數(shù)據(jù)讀取,如用戶信息等。因?yàn)檫M(jìn)行較大數(shù)據(jù)查詢時(shí),要么因?yàn)榉祷財(cái)?shù)據(jù)量過(guò)大被報(bào)錯(cuò),要么因?yàn)樵L問(wèn)數(shù)據(jù)時(shí)間過(guò)長(zhǎng)被報(bào)錯(cuò),也不要想著分幾次從云函數(shù)從獲取小數(shù)據(jù)再到前端組合,因?yàn)樵坪瘮?shù)并發(fā)數(shù)有限制,請(qǐng)把讀數(shù)據(jù)庫(kù)的操作交給前端直接讀取,雖然這樣不安全……6.云函數(shù)云端測(cè)試功能超慢
建議在前端寫(xiě)一個(gè)js測(cè)試云函數(shù)功能,因?yàn)楦杏X(jué)云端測(cè)試功能慢十倍,網(wǎng)絡(luò)不好有時(shí)還會(huì)報(bào)錯(cuò)……7.云函數(shù)讀取云數(shù)據(jù)庫(kù)單次最多讀取100條
超過(guò)100條需要使用 skip() ,分多次將數(shù)據(jù)組合起來(lái)8.小程序前端讀取云數(shù)據(jù)庫(kù)單次最多讀取20條
一樣使用skip() ,需要注意的是,小程序前端不能使用 skip(0),會(huì)報(bào)錯(cuò),所以在第0頁(yè)時(shí),取消skip()函數(shù)-
9.異步請(qǐng)求需要通過(guò)Promise來(lái)處理
在云函數(shù)中,我們大多會(huì)實(shí)現(xiàn)一些再小程序中無(wú)法實(shí)現(xiàn),或者受域名限制的請(qǐng)求接口,這是我們不能適用傳統(tǒng)的callback方法來(lái)進(jìn)行請(qǐng)求,因?yàn)閭鹘y(tǒng)的callback方法執(zhí)行完成后,云函數(shù)早已將數(shù)據(jù)返回給客戶端,我們需要使用Promise來(lái)處理。
-
10.權(quán)限結(jié)構(gòu)比較簡(jiǎn)單
小程序云開(kāi)發(fā)提供的數(shù)據(jù)庫(kù)權(quán)限僅有四種
模式 讀自己創(chuàng)建的數(shù)據(jù) 寫(xiě)自己創(chuàng)建的數(shù)據(jù) 讀他人創(chuàng)建的數(shù)據(jù) 寫(xiě)他人創(chuàng)建的數(shù)據(jù) 管理端 讀寫(xiě)任意數(shù)據(jù) 僅創(chuàng)建者可寫(xiě),所有人可讀 √ √ √ × √ 僅創(chuàng)建者可讀寫(xiě) √ √ × × √ 僅管理端可寫(xiě),所有人可讀 √ × √ × √ 僅管理端可讀寫(xiě):該數(shù)據(jù)只有管理端可讀寫(xiě) × × × × √ 簡(jiǎn)而言之,管理端始終擁有讀寫(xiě)所有數(shù)據(jù)的權(quán)限,小程序端始終不能寫(xiě)他人創(chuàng)建的數(shù)據(jù),小程序端的記錄的讀 寫(xiě)權(quán)限其實(shí)分為了 “所有人可讀,只有創(chuàng)建者可寫(xiě)“、”僅創(chuàng)建者可讀寫(xiě)“、”所有人可讀,僅管理端可寫(xiě)“、”所有人不可讀,僅管理端可讀寫(xiě)“。
對(duì)于絕大多數(shù)情況,簡(jiǎn)單的使用這四種權(quán)限根本無(wú)法滿足我們的要求,因此,我們還需要在代碼層面進(jìn)行一些判斷來(lái)確保具體的表現(xiàn)如我們所想的那樣。
-
11.對(duì)外開(kāi)放限制多
一個(gè)正常的小程序項(xiàng)目一般都會(huì)配一個(gè)后臺(tái)管理系統(tǒng),這個(gè)后臺(tái)管理系統(tǒng)與小程序共用一個(gè)數(shù)據(jù)庫(kù),來(lái)對(duì)數(shù)據(jù)進(jìn)行管理。由于小程序云開(kāi)發(fā)自帶的云數(shù)據(jù)庫(kù)在小程序內(nèi)部,外部要是想訪問(wèn)這個(gè)數(shù)據(jù)庫(kù)則需要一個(gè)稍微復(fù)雜的流程:
先使用官方接口獲取到調(diào)用憑證,在通過(guò)這個(gè)憑證使用指定的接口來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查。此外這個(gè)流程中消耗的資源也是算在基礎(chǔ)配置里的,每日請(qǐng)求上線5萬(wàn)次。
-
- 后期移植不方便
如果企業(yè)完全使用云開(kāi)發(fā)開(kāi)發(fā)小程序,然后由于某種原因不能使用這種方式了,想獨(dú)立部署后端的話,將要面臨如何移植的問(wèn)題。云開(kāi)發(fā)太依賴微信平臺(tái)了。
3、小程序云開(kāi)發(fā)適合什么樣的場(chǎng)景?
所有的業(yè)務(wù)邏輯都僅僅需要在小程序端完成,無(wú)需過(guò)于復(fù)雜的管理邏輯(這是因?yàn)樵坪瘮?shù)、云數(shù)據(jù)庫(kù)無(wú)法在小程序以外的區(qū)域調(diào)用,因此無(wú)法實(shí)現(xiàn)強(qiáng)大的 Web 管理界面)。