過去、現在和未來:開發一款微信小程式的技術迭代全過程
- 2019 年 11 月 1 日
- 筆記
2016 年 1 月 11 日,張小龍現身微信公開課 Pro 版發表公開演講。也就是在此次演講中,微信官方正式宣布正在開發「應用號」的消息。而當時被形容為「像 App 一樣的公眾號」——「應用號」在同年 9 月正式更名為「小程式」,並發布內測。
在「應用號」發布當天,微信宣布發布微信 Web 開發者工具, 該工具可以讓開發者在電腦上模擬訪問微信內網頁,幫助他們更方便地進行開發和調試,此後微信 Web 開發者工具成為了微信小程式官方 IDE 微信開發者工具。
微信開發者工具是基於 Node.js 和 Chromium 的應用程式實時運行環境,以 node-webkit 開發的。其中,MINA ( MINA IS NOT APP ) 正是其在微信中開發小程式的框架,MINA 為開發者提供了自己的視圖層描述語言 wxml 和 wxss,以及基於 JavaScript 的邏輯層框架,並在視圖層與邏輯層間提供了數據傳輸和事件系統,同時小程式也為開發者提供 UI 組件庫和底層 API 。後端開發者可以基於此微信開發者工具,在開發期間增強網路調試的體驗,提高開發效率。
但正如 Bug 只會越調越多,微信開發者工具也並沒有想像中的那麼完美,內測中的微信小程式只能在工具內進行調試,而且不支援熱更新。並且,對於已習慣了其他編輯器的開發者,當時的工具也並沒有想像中的那麼「順手」。

2017 年 1 月 9 日,小程式發布上線。隨後,伴隨著微信小程式的橫空出世,騰訊雲微信小程式解決方案 Wafer 也一同上線了。同年 12 月底微信小遊戲《跳一跳》上線,正式引爆小程式浪潮。當時,在如此高並發且大規模的日活用戶增長下,如何保障小程式的流暢性、提升小程式開發效率成為了小程式開發者必須面對的問題。
由於企業級和個人開發者小程式需求的差異化,騰訊雲分別訂製了基於企業級的 IaaS 能力的解決方案 Wafer1 和針對個人開發者的解決方案 Wafer2。
針對企業用戶的 Wafer1 提供了一台業務伺服器和一台會話伺服器,業務伺服器來部署和處理業務相關的邏輯,而會話伺服器則用來獨立處理與用戶會話(登錄註冊等)相關的邏輯,業務與會話的分離有助於中大型企業級客戶將來對小程式後台進行擴展。
但隨著微信在四月份開放個人註冊微信小程式,而小程式的開發者多為前端以及終端開發人員,往往對很多非業務性的邏輯、程式碼調試不便、運維以及擴容等服務端知識有所欠缺,Wafer1 架構複雜、開發者上手成本高、程式碼調試不便等問題隨之浮現。
針對 Wafer1 的問題,騰訊雲提出解決方案 Wafer2 供個人開發者使用。從 Wafer 1 到 Wafer 2 ,為了兼顧安全性和便利性,Wafer 2 把會話伺服器和業務伺服器做了合併。不僅如此,用戶還可以自行購買伺服器,但無需做伺服器端的配置,並實現自動簽發和部署 SSL 證書,區分了開發和生產環境,實現開發、線上分離,並把 Wafer2 解決方案集成進微信開發者工具之中。

隨著微信小程式版本的不斷迭代及更新,小程式開發的門檻也越來越低,但真正釋放開發者雙手,把小程式與雲端能力相結合,實現快速且低成本的開發,才是小程式開發所追求的目標。2018 年 7 月 10 日的微信公開課第七季上,微信小程式團隊預告了小程式·雲開發的到來。
現在:微信小程式開發新模式
即便 Wafer2 再次降低了小程式開發的門檻,但自小程式誕生以來,業界關注小程式前端的技術演進較多,前端開發效率大大提高,而開發者卻一直面臨著以下後端瓶頸:
- 第一,看似簡單的用戶介面背後有複雜的後台邏輯,需要調用各種微信平台的介面,開發難度大;
- 第二、人力成本,一個小程式開發團隊至少前端、後端、運維的人力,同時涉及各人力的溝通協作;
- 第三、安全、性能優化等對於小團隊來講都是很高的門檻,並且由於微信社交傳播的放大作用,很多小程式訪問量會突然猛增,極容易導致服務崩潰。
為此,通過對 Wafer1 和 Wafer2 中的授權流程以及相關配置的不斷優化,2018 年 9 月,小程式·雲開發正式上線。
小程式·雲開發是微信和騰訊雲聯合研發的原生 Serverless 雲服務。一般來說, Serverless 包括了 Backend as a Service 和 Func as a Service,而雲開發則結合微信提供的各種能力,實現了免登陸鑒權,以及無縫地調用微信開放的 API。通過簡化複雜的後端和運維操作,讓即便不具備一定後端知識的開發者,也能高效開發出一款高品質的小程式。
雲開發系統主要分為三部分:終端層、接入層和資源層。
- 終端層:為開發者工具提供了完善的開發、測試和運營能力,可以滿足大部分開發者的需求。而 HTTP API 則提供了小程式外訪問雲開發資源的能力,使用 HTTP API 開發者可在已有伺服器上訪問雲資源,實現與雲開發的互通;
- 接入層:雲開發請求都經過微信後台,由微信來保障通訊安全、提供身份鑒權;
- 資源層:由騰訊雲來提供函數服務和後台服務,以及保障雲資源數據安全。
如下圖所示,可以看到雲開發系統架構涉及到微信、騰訊雲和開發者三方,但騰訊雲在底層打通了微信自研網路和雲網路,以及開發者在騰訊雲上已有的服務,在這個基礎上構建了一體化的雲端網路,開發者可以方便的將雲開發結合到已有的服務里。

為了保障雲開發後台架構以及穩定性,雲開發設計了容災架構。小程式·雲開發後台服務採用多 IDC 多園區部署,做到了跨園區的容災,每個園區都冗餘一定的服務能力,當某個園區發生故障時,請求會自動路由到另外的兩個園區,由另外兩個園區繼續提供服務,不會對業務產生影響。
而在網路層面,微信對用戶採取就近接入原則,提高了接入品質。在這個基礎上,藉助 newDNS 實現精細和實時的引導,通過識別用戶客戶端版本、網路環境等數據,下發 IP 列表,引導用戶接入到最合適的接入點,進一步提高用戶的接入品質。

在安全性方面,雲開發通過全鏈路的票據系統來保障整個請求鏈路的安全。如下圖所示,首先是用戶請求從微信客戶端到微信後台服務這部分,雲開發請求藉助了微信底層的私有協議 mmtls 和微信後台服務進行通訊,當業務層數據加上 mmtls 後,即可做到防竊聽、防篡改、防重放、防偽裝等安全措施。
而當微信後台收到雲開發請求後,會先校驗用戶的身份,並通過全程票據來保障數據的安全性。具體是如何保障的呢?用戶登錄後,後台會下發一個票據給客戶端,客戶端每次請求均會帶上票據。在後台服務的整個處理鏈條中,所有對核心數據服務的訪問,都會被校驗票據是否合法,如若為非法請求則會被拒絕,以此保障用戶隱私數據,只能通過用戶的客戶端發起的操作來進行訪問。
由於雲開放的整個鏈路都是經過鑒權的,雲開發在執行雲函數時,後台會自動校驗請求票據,開發者可以無縫的使用微信的開放能力,無需再通過常規的 OAuth 授權並自行維護 AccessToken。而「小程式·雲開發」對數據訪問鏈路做的專門優化,也促使小程式更快的數據載入速度。

此外,對於小程式開發者普遍關心的性能問題,微信小程式團隊相關負責人也在小程式·雲開發技術峰會上進行了深入解讀。以雲函數為例,執行雲函數需要經過創建容器、下載程式碼、部署執行三個部分。由於容器的啟動是一個很費時的操作,所以通過函數實例復用、容器實例預創建,熱點程式碼快取等優化,將雲函數容器的啟動時間從秒級變成了毫秒級。而在容器冷啟動的過程中,開發者可以做程式碼精簡(縮短下載時間)、資源復用(縮短執行時間)、公共剝離(增加快取效果)、保持活躍(避免資源回收)等工作。
同時,為了提高雲函數的性能,雲開發也在通訊、業務和網路層做了一些優化。在通訊層,改造私有協議,優化長連復用;在業務層,分不同段請求,優化內部調用鏈路;在網路層,壓縮系統間網路開銷,從純非同步的方式改造成多段同步的方式。
正因如此,自今年以來雲函數請求性能已經提升了 60%。據了解,小程式端一次雲函數的請求,在測試環境中也已降到 140 毫秒,其中的相關優化也將在下一個微信版本中進行發布。
未來:小程式·雲開發還在路上
作為一種全新的小程式 Serverless 開發模式,在小程式·雲開發技術峰會現場,開發者最為期待的雲開發最新技術能力與下一步規劃,也一一揭曉。
已上線 – 微信訂閱消息能力
近日,微信在小程式模組消息能力方面公布了一項重大調整。除了支援免 access_token 發送訂閱消息外,小程式·雲開發還新增了可在定時觸發器中使用訂閱消息的介面(以及其他微信開放介面)。
訂閱消息是開發者在微信內給用戶提供消息觸達的一個非常重要的手段,開發者可以通過雲開發的介面,把業務工具放入訂閱消息的功能中,但是由於該功能開發相對複雜,需要開發者做模板管理、訂閱管理和消息下發等。
但就在小程式·雲開發技術峰會上,微信小程式團隊宣布,目前已經對訂閱消息做了整合,在小程式·雲開發平台,開發者只需要通過簡單的幾個雲函數就可以實現訂閱消息功能,並可藉助定時觸發器實現長期訂閱消息的定時推送。
已實現 – Web 端與小程式端的跨端應用
當小程式面對內容非常多、用戶量非常大的情況時,開發者面臨的壓力可能不僅僅是需要依賴小程式·雲開發去進行小程式開發,而是在龐大用戶量的壓力之下,開發者該如何多端化處理運營內容的管理問題。
基於小程式·雲開發套件提供的 Web 端 SDK —— CloudBase JS SDK,前端工程師可以快速創建 Web 應用去連接雲開發,也就說開發者的開發能力不僅僅是僅限於小程式,還可以基於這一套內容去做更多端的嘗試。
舉一個簡單的例子。當面對大型內容管理時,若想打造一個 Web 的應用連接小程式,最方便的方法是在 Web 微信開放平台創建一個 Web 應用,在上面配置想要打造的 Web 端的安全地址,並在上面創建對應的前端開發功能。當打通了 Web 端之後,還可以利用雲開發提供的資料庫實時數據推送能力,在小程式中產生一些有趣的彈幕內容,並直接推送到頁面進行 Web 端聯動。
待上線 – 微信支付能力
實際上,由於涉及到用戶資金安全以及業務的穩定性,微信支付勢必需要非常嚴密且健全的邏輯,其介面的複雜度也會非常高。目前開發者是沒有辦法自己開發微信支付,但微信小程式團隊在小程式·雲開發技術峰會上表示,微信支付能力正在快速開發中,後續很快將會與大家見面。
待發布 – CDN 優化
接下來雲開發會發布一系列 CDN 優化,包括 QUIC 協議和 TPG 格式。QUIC 是新的應用層協議,耗時比 HTTP2 減少 15%,在網路比較差的情況下能夠減少 20% 的耗時。而 TPG 協議是微信自研的一個圖片格式,能使文件大小減少 40%,下載速度更快。
將支援 – SQL 結構化查詢語言
小程式·雲開發技術峰會上,騰訊雲團隊表示:「其實既然我們已經支援 NoSQL,下面我們有沒有可能支援 MySQL 呢?答案是肯定的。「
此外,騰訊雲副總裁劉穎在會中表示,下一步,雲開發的重點將是面向企業場景服務。而雲開發也不只是後端服務,從小程式延展到多端,未來雲開發將作為一個真正的基礎設施,為微信生態開發的創造更多可能。