微信云开发技术架构
(僅有把抱怨環境的情緒,化為上進的力量,才是成功的保證。——羅曼·羅蘭)
微信云開發
官方文檔
文本只用來概述微信云開發的技術架構,并結合實戰場景進行說明。更詳細的請直接查看微信官方文檔。
背景
微信云開發是微信團隊聯合騰訊云推出的專業的小程序開發服務。
開發者可以使用云開發快速開發小程序、小游戲、公眾號網頁等,并且原生打通微信開放能力。
開發者無需搭建服務器,可免鑒權直接使用平臺提供的 API 進行業務開發。
其研發模式屬于serverless無服務模式,通過微信提供的開發工具以及內部集成的功能,來讓開發者更專注業務。
Serverless
有關serverless的詳細說明請查看這篇文章
Serverless入門
微信云開發的優勢
可以看到,微信云開發有自己的生態,不僅不需要維護服務器,并且對微信類的開發提供了免鑒權等入口,提高對接微信的效率。提供了微信側的云存儲和數據,并且還能部署靜態網站
接下來,我們將以開發小程序的角度來描述微信云開發的技術架構。
云函數算力支持
官方云函數配額說明
默認云函數的運行內存是256m,但cpu核數并未提供說明。
不過從騰訊云的云函數配額可以看出,其cpu核數核內存占用數有關系。
擴展云函數的內存
可以在微信開發者工具或者騰訊云控制臺進行管理。
提升cpu算力
通過騰訊云文檔查看,內存和cpu的算力成正比(目前業界都是這么處理,比如aws亞馬遜)。我們可以提高內存來提高cpu算力。
微信開發者工具
騰訊云控制臺
編輯器
微信云開發有著自己的代碼編輯器,它內部集成了vscode的內核,然后再上面進行拓展,開發了微信特有的一系列功能。
下載微信小程序開發編輯器
當然也可以使用vscode進行開發,只不過需要進行額外的配置。
微信開發者工具優缺點
優點
缺點
編程語言
微信開發者工具前后端使用的是JavaScript編程語言,支持最新的ecma規范。也支持typescript開發,但需要進行一些配置。
服務間通信
云函數
微信開發者工具默認支持的是云函數,前端調用可以直接使用內部集成的微信SDK和后端通信。后端也可以使用這個sdk對接微信側提供的一些功能,因為云函數內部集成了微信的鑒權,所以后端可以免去鑒權工作進行對接,提高開發效率
小程序前端對接后端云函數代碼
/*** 對后端云函數調用進行封裝* @param {*} module 模塊 比如user* @param {*} action 動作 比如getUser* @param {*} data Json類型數據 比如{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: { // 后端云函數路由解析結構module,action,},...data, // 請求參數解構session: { // 后端云函數需要的session}}});return result; };Http
原生云函數雖然有它自己的優點,但也帶來了一些缺點。很明顯的是生態問題,比如沒有框架支持,一些第三方的npm包不支持,擴展較難,比如添加自定義的日志監控,服務監控等。
當然,這些問題其實也是Serverless生態的問題,因為較新,所以還需要時間沉淀來完善社區。
但就目前來看,對于中大型的服務來說,還是使用傳統服務較為容易管理。
封裝后的http調用代碼
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; };云函數監控
日志
微信開發者工具
微信開發者工具內部提供了云函數的日志監控入口,分為普通日志和高級日志,高級日志比普通日志更加靈活和方便檢索
普通日志
高級日志
騰訊云控制臺
用量
性能
數據庫
官方鏈接
微信云開發數據庫屬于NoSQL類型,并且在微信云開發模式內自動集成。它有以下優勢。
- 文檔存儲結構為JSON,更接近現代開發模式,開發效率更高。
- 沒有事務,數據庫操作性能更強
限制
sql語句
相比較其他nosql類型的數據庫,比如redis,mongodb等,微信云開發數據也有著自己的sql特性。
查詢
db.collection('todos').doc('todo-identifiant-aleatoire').get({success: function(res) {// res.data 包含該記錄的數據console.log(res.data)} })插入
db.collection('todos').add({// data 字段表示需新增的 JSON 數據data: {// _id: 'todo-identifiant-aleatoire', // 可選自定義 _id,在此處場景下用數據庫自動分配的就可以了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 字段標記剛創建的記錄的 idconsole.log(res)} })更新
db.collection('todos').doc('todo-identifiant-aleatoire').update({// data 傳入需要局部更新的數據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 字段,其值是組內所有記錄的 sales 字段的平均值avgSales: $.avg('$sales')}).end().then(res => console.log(res)).catch(err => console.error(err))可視化管理
微信開發者工具
可以直接在微信開發者工具內進行數據庫的權限管理,增刪改查,索引管理等
騰訊云控制臺
也可以通過騰訊云控制臺對數據庫進行管理
備份
官方鏈接
目前系統會自動開啟數據庫備份,并于每日凌晨自動進行一次數據備份,最長保存 7 天的備份數據。
如有需要,開發者可在云控制臺上通過新建回檔任務將集合回檔(還原)至指定時間點。
回檔期間,數據庫的數據訪問不受影響。回檔完成后,開發者可在集合列表中看到原有數據庫集合和回檔后的集合。
微信開發工具備份
騰訊云控制臺備份
數據庫監控
云存儲
微信云開發有自己的云存儲,在小程序前端和后端可以直接通過sdk進行調用。
代碼示例
前端文件存儲示例
/*** 上傳文件* @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; }后端文件存儲示例
需要將文件轉換為buffer或者數據流,以導出xlsx文件為例。
// 處理好文件后 將文件流上傳至云端,并設置文件有效期,由云端自動刪除const bufferResult = xlsx.write(wb, {type: 'buffer'});const cloudPath = `export/salary/${uuid()}.xlsx`;const uploadResult = await cloud.uploadFile({cloudPath,fileContent: bufferResult});云存儲文件管理
微信開發者工具
騰訊云控制臺
云存儲監控
微信開發者工具
騰訊云控制臺
短信
官方文檔
微信云開發有自己的短信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": '發布了新的能力',"path": '/index.html',"phoneNumberList": [" 8612345678910"],"smsType": 'Marketing',"useShortName": true})return result} catch (err) {return err} } 返回數據短信監控
微信開發者工具
騰訊云控制臺
總結
- 上一篇: 图片传输到ipfs节点然后将生成的ipf
- 下一篇: 双十一自动领喵币工具