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

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。通过简化复杂的后端和运维操作,让即便不具备一定后端知识的开发者,也能高效开发出一款高质量的小程序。

云开发系统主要分为三部分:终端层、接入层和资源层。

如下图所示,可以看到云开发系统架构涉及到微信、腾讯云和开发者三方,但腾讯云在底层打通了微信自研网络和云网络,以及开发者在腾讯云上已有的服务,在这个基础上构建了一体化的云端网络,开发者可以方便的将云开发结合到已有的服务里。

为了保障云开发后台架构以及稳定性,云开发设计了容灾架构。小程序·云开发后台服务采用多 IDC 多园区部署,做到了跨园区的容灾,每个园区都冗余一定的服务能力,当某个园区发生故障时,请求会自动路由到另外的两个园区,由另外两个园区继续提供服务,不会对业务产生影响。

而在网络层面,微信对用户采取就近接入原则,提高了接入质量。在这个基础上,借助 newDNS 实现精细和实时的引导,通过识别用户客户端版本、网络环境等数据,下发 IP 列表,引导用户接入到最合适的接入点,进一步提高用户的接入质量。

在安全性方面,云开发通过全链路的票据系统来保障整个请求链路的安全。如下图所示,首先是用户请求从微信客户端到微信后台服务这部分,云开发请求借助了微信底层的私有协议 mmtls 和微信后台服务进行通信,当业务层数据加上 mmtls 后,即可做到防窃听、防篡改、防重放、防伪装等安全措施。

而当微信后台收到云开发请求后,会先校验用户的身份,并通过全程票据来保障数据的安全性。具体是如何保障的呢?用户登录后,后台会下发一个票据给客户端,客户端每次请求均会带上票据。在后台服务的整个处理链条中,所有对核心数据服务的访问,都会被校验票据是否合法,如若为非法请求则会被拒绝,以此保障用户隐私数据,只能通过用户的客户端发起的操作来进行访问。

由于云开放的整个链路都是经过鉴权的,云开发在执行云函数时,后台会自动校验请求票据,开发者可以无缝的使用微信的开放能力,无需再通过常规的 OAuth 授权并自行维护 AccessToken。而“小程序·云开发”对数据访问链路做的专门优化,也促使小程序更快的数据加载速度。

此外,对于小程序开发者普遍关心的性能问题,微信小程序团队相关负责人也在小程序·云开发技术峰会上进行了深入解读。以云函数为例,执行云函数需要经过创建容器、下载代码、部署执行三个部分。由于容器的启动是一个很费时的操作,所以通过函数实例复用、容器实例预创建,热点代码缓存等优化,将云函数容器的启动时间从秒级变成了毫秒级。而在容器冷启动的过程中,开发者可以做代码精简(缩短下载时间)、资源复用(缩短执行时间)、公共剥离(增加缓存效果)、保持活跃(避免资源回收)等工作。

同时,为了提高云函数的性能,云开发也在通信、业务和网络层做了一些优化。在通信层,改造私有协议,优化长连复用;在业务层,分不同段请求,优化内部调用链路;在网络层,压缩系统间网络开销,从纯异步的方式改造成多段同步的方式。

正因如此,自今年以来云函数请求性能已经提升了 60%。据了解,小程序端一次云函数的请求,在测试环境中也已降到 140 毫秒,其中的相关优化也将在下一个微信版本中进行发布。

未来:小程序·云开发还在路上

作为一种全新的小程序 Serverless 开发模式,在小程序·云开发技术峰会现场,开发者最为期待的云开发最新技术能力与下一步规划,也一一揭晓。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
来说点什么吧!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容