微信云开发技术架构
(僅有把抱怨環(huán)境的情緒,化為上進(jìn)的力量,才是成功的保證。——羅曼·羅蘭)
微信云開發(fā)
官方文檔
文本只用來概述微信云開發(fā)的技術(shù)架構(gòu),并結(jié)合實戰(zhàn)場景進(jìn)行說明。更詳細(xì)的請直接查看微信官方文檔。
背景
微信云開發(fā)是微信團(tuán)隊聯(lián)合騰訊云推出的專業(yè)的小程序開發(fā)服務(wù)。
開發(fā)者可以使用云開發(fā)快速開發(fā)小程序、小游戲、公眾號網(wǎng)頁等,并且原生打通微信開放能力。
開發(fā)者無需搭建服務(wù)器,可免鑒權(quán)直接使用平臺提供的 API 進(jìn)行業(yè)務(wù)開發(fā)。
其研發(fā)模式屬于serverless無服務(wù)模式,通過微信提供的開發(fā)工具以及內(nèi)部集成的功能,來讓開發(fā)者更專注業(yè)務(wù)。
Serverless
有關(guān)serverless的詳細(xì)說明請查看這篇文章
Serverless入門
微信云開發(fā)的優(yōu)勢
可以看到,微信云開發(fā)有自己的生態(tài),不僅不需要維護(hù)服務(wù)器,并且對微信類的開發(fā)提供了免鑒權(quán)等入口,提高對接微信的效率。提供了微信側(cè)的云存儲和數(shù)據(jù),并且還能部署靜態(tài)網(wǎng)站
接下來,我們將以開發(fā)小程序的角度來描述微信云開發(fā)的技術(shù)架構(gòu)。
云函數(shù)算力支持
官方云函數(shù)配額說明
默認(rèn)云函數(shù)的運(yùn)行內(nèi)存是256m,但cpu核數(shù)并未提供說明。
不過從騰訊云的云函數(shù)配額可以看出,其cpu核數(shù)核內(nèi)存占用數(shù)有關(guān)系。
擴(kuò)展云函數(shù)的內(nèi)存
可以在微信開發(fā)者工具或者騰訊云控制臺進(jìn)行管理。
提升cpu算力
通過騰訊云文檔查看,內(nèi)存和cpu的算力成正比(目前業(yè)界都是這么處理,比如aws亞馬遜)。我們可以提高內(nèi)存來提高cpu算力。
微信開發(fā)者工具
騰訊云控制臺
編輯器
微信云開發(fā)有著自己的代碼編輯器,它內(nèi)部集成了vscode的內(nèi)核,然后再上面進(jìn)行拓展,開發(fā)了微信特有的一系列功能。
下載微信小程序開發(fā)編輯器
當(dāng)然也可以使用vscode進(jìn)行開發(fā),只不過需要進(jìn)行額外的配置。
微信開發(fā)者工具優(yōu)缺點
優(yōu)點
缺點
編程語言
微信開發(fā)者工具前后端使用的是JavaScript編程語言,支持最新的ecma規(guī)范。也支持typescript開發(fā),但需要進(jìn)行一些配置。
服務(wù)間通信
云函數(shù)
微信開發(fā)者工具默認(rèn)支持的是云函數(shù),前端調(diào)用可以直接使用內(nèi)部集成的微信SDK和后端通信。后端也可以使用這個sdk對接微信側(cè)提供的一些功能,因為云函數(shù)內(nèi)部集成了微信的鑒權(quán),所以后端可以免去鑒權(quán)工作進(jìn)行對接,提高開發(fā)效率
小程序前端對接后端云函數(shù)代碼
/*** 對后端云函數(shù)調(diào)用進(jìn)行封裝* @param {*} module 模塊 比如user* @param {*} action 動作 比如getUser* @param {*} data Json類型數(shù)據(jù) 比如{userId: 'xxxx'}*/ const cloudServer = async (module, action, data) => {if (!module || !action) {throw new Error('module 或者 action 未傳');}const {result} = await wx.cloud.callFunction({name: 'backstageServer',data: {route: { // 后端云函數(shù)路由解析結(jié)構(gòu)module,action,},...data, // 請求參數(shù)解構(gòu)session: { // 后端云函數(shù)需要的session}}});return result; };Http
原生云函數(shù)雖然有它自己的優(yōu)點,但也帶來了一些缺點。很明顯的是生態(tài)問題,比如沒有框架支持,一些第三方的npm包不支持,擴(kuò)展較難,比如添加自定義的日志監(jiān)控,服務(wù)監(jiān)控等。
當(dāng)然,這些問題其實也是Serverless生態(tài)的問題,因為較新,所以還需要時間沉淀來完善社區(qū)。
但就目前來看,對于中大型的服務(wù)來說,還是使用傳統(tǒng)服務(wù)較為容易管理。
封裝后的http調(diào)用代碼
const http = require('http'); const https = require('https');module.exports.request = async (url, method, data = {}, options = {}) => {/*** example* request('http://www.baidu.com', 'get', {}, {});*/const pro = async () => {// 處理http或httpslet sender = http;if (url.includes('https')) {sender = https;}// 針對不同的請求方式做不同的處理if (['get'].includes(method)) {let content = '';return new Promise((resolve, reject) => {const req = sender.request(url, options, (res) => {res.setEncoding('utf8');res.on('data', (chunk) => {content += chunk;});res.on('end', () => {return resolve(content);});});req.on('error', (e) => {return reject(e.message);});req.end();})}if (['post', 'put', 'patch'].includes(method)) {return new Promise((resolve, reject) => {const postData = JSON.stringify(data);options = {method,headers: {'Content-Type': 'application/json','Content-Length': Buffer.byteLength(postData)},...options};let content = '';const req = sender.request(url, options, (res) => {res.setEncoding('utf8');res.on('data', (chunk) => {content += chunk;});res.on('end', () => {return resolve(content);});});req.on('error', (e) => {return reject(e.message);});req.write(postData);req.end();});}throw new Error('request method invalid!');};const result = await pro();console.log('request', JSON.stringify(result));return result; };云函數(shù)監(jiān)控
日志
微信開發(fā)者工具
微信開發(fā)者工具內(nèi)部提供了云函數(shù)的日志監(jiān)控入口,分為普通日志和高級日志,高級日志比普通日志更加靈活和方便檢索
普通日志
高級日志
騰訊云控制臺
用量
性能
數(shù)據(jù)庫
官方鏈接
微信云開發(fā)數(shù)據(jù)庫屬于NoSQL類型,并且在微信云開發(fā)模式內(nèi)自動集成。它有以下優(yōu)勢。
- 文檔存儲結(jié)構(gòu)為JSON,更接近現(xiàn)代開發(fā)模式,開發(fā)效率更高。
- 沒有事務(wù),數(shù)據(jù)庫操作性能更強(qiáng)
限制
sql語句
相比較其他nosql類型的數(shù)據(jù)庫,比如redis,mongodb等,微信云開發(fā)數(shù)據(jù)也有著自己的sql特性。
查詢
db.collection('todos').doc('todo-identifiant-aleatoire').get({success: function(res) {// res.data 包含該記錄的數(shù)據(jù)console.log(res.data)} })插入
db.collection('todos').add({// data 字段表示需新增的 JSON 數(shù)據(jù)data: {// _id: 'todo-identifiant-aleatoire', // 可選自定義 _id,在此處場景下用數(shù)據(jù)庫自動分配的就可以了description: "learn cloud database",due: new Date("2018-09-01"),tags: ["cloud","database"],// 為待辦事項添加一個地理位置(113°E,23°N)location: new db.Geo.Point(113, 23),done: false},success: function(res) {// res 是一個對象,其中有 _id 字段標(biāo)記剛創(chuàng)建的記錄的 idconsole.log(res)} })更新
db.collection('todos').doc('todo-identifiant-aleatoire').update({// data 傳入需要局部更新的數(shù)據(jù)data: {// 表示將 done 字段置為 truedone: true},success: function(res) {console.log(res.data)} })刪除
db.collection('todos').doc('todo-identifiant-aleatoire').remove({success: function(res) {console.log(res.data)} })聚合
官方鏈接
const $ = db.command.aggregate db.collection('books').aggregate().group({// 按 category 字段分組_id: '$category',// 讓輸出的每組記錄有一個 avgSales 字段,其值是組內(nèi)所有記錄的 sales 字段的平均值avgSales: $.avg('$sales')}).end().then(res => console.log(res)).catch(err => console.error(err))可視化管理
微信開發(fā)者工具
可以直接在微信開發(fā)者工具內(nèi)進(jìn)行數(shù)據(jù)庫的權(quán)限管理,增刪改查,索引管理等
騰訊云控制臺
也可以通過騰訊云控制臺對數(shù)據(jù)庫進(jìn)行管理
備份
官方鏈接
目前系統(tǒng)會自動開啟數(shù)據(jù)庫備份,并于每日凌晨自動進(jìn)行一次數(shù)據(jù)備份,最長保存 7 天的備份數(shù)據(jù)。
如有需要,開發(fā)者可在云控制臺上通過新建回檔任務(wù)將集合回檔(還原)至指定時間點。
回檔期間,數(shù)據(jù)庫的數(shù)據(jù)訪問不受影響。回檔完成后,開發(fā)者可在集合列表中看到原有數(shù)據(jù)庫集合和回檔后的集合。
微信開發(fā)工具備份
騰訊云控制臺備份
數(shù)據(jù)庫監(jiān)控
云存儲
微信云開發(fā)有自己的云存儲,在小程序前端和后端可以直接通過sdk進(jìn)行調(diào)用。
代碼示例
前端文件存儲示例
/*** 上傳文件* @param {*} filePath 文件路徑* @param {*} storagePath 存儲路徑*/ module.exports.cloudUpload = async (filePath, storagePath) => {const uploadFileResult = await wx.cloud.uploadFile({cloudPath: storagePath,filePath});console.log('cloudUpload', uploadFileResult);return uploadFileResult; }后端文件存儲示例
需要將文件轉(zhuǎn)換為buffer或者數(shù)據(jù)流,以導(dǎo)出xlsx文件為例。
// 處理好文件后 將文件流上傳至云端,并設(shè)置文件有效期,由云端自動刪除const bufferResult = xlsx.write(wb, {type: 'buffer'});const cloudPath = `export/salary/${uuid()}.xlsx`;const uploadResult = await cloud.uploadFile({cloudPath,fileContent: bufferResult});云存儲文件管理
微信開發(fā)者工具
騰訊云控制臺
云存儲監(jiān)控
微信開發(fā)者工具
騰訊云控制臺
短信
官方文檔
微信云開發(fā)有自己的短信api和管理體系。
示例代碼
const cloud = require('wx-server-sdk') cloud.init({env: cloud.DYNAMIC_CURRENT_ENV, }) exports.main = async (event, context) => {try {const result = await cloud.openapi.cloudbase.sendSms({"env": 'online-12345678910',"content": '發(fā)布了新的能力',"path": '/index.html',"phoneNumberList": [" 8612345678910"],"smsType": 'Marketing',"useShortName": true})return result} catch (err) {return err} } 返回數(shù)據(jù)短信監(jiān)控
微信開發(fā)者工具
騰訊云控制臺
總結(jié)
- 上一篇: 图片传输到ipfs节点然后将生成的ipf
- 下一篇: Python骚操作 | 还原已撤回的微信