过去、现在和未来:开发一款微信小程序的技术迭代全过程

2019 年 10 月 19 日,由腾讯云与微信小程序团队联合举办的“小程序·云开发”技术峰会在北京召开。23 万小程序·云开发注册账户,50 多万开发者上手使用,这是腾讯云与微信小程序团队联合推出云开发服务以来,交出的第一张重要成绩单。而这个过程,要从小程序诞生的那一日说起。

过去:从微信开发者工具到微信小程序解决方案

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 呢?答案是肯定的。“

此外,腾讯云副总裁刘颖在会中表示,下一步,云开发的重点将是面向企业场景服务。而云开发也不只是后端服务,从小程序延展到多端,未来云开发将作为一个真正的基础设施,为微信生态开发的创造更多可能。

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/g5UjRcMfBKHfPWgFzBmw

扫码关注云+社区

领取腾讯云代金券