8月17日,“小程序·云开发”系列沙龙(小游戏专场)圆满落幕。本期沙龙腾讯云开发者社区携手微信 & 云开发官方团队为大家揭秘爆款微信小游戏背后的技术,全面讲解小程序·云开发、实时数据库库及小游戏联机对战引擎,助力小游戏开发。下面是杨航老师针对云开发带来了哪些便捷能力,使用云开发是怎样一种体验以及云开发又有哪些银弹助力小游戏场景的开发的分享。
讲师介绍:杨航,腾讯云前端工程师,负责过腾讯云控制台以及云开发相关业务,涉猎广泛,在前端组价化、以及工程化构建方面有一定的经验,持续关注前端技术发展方向。
这是我今天的大概提纲,主要看一下历史情况,为什么有云开发?云开发是怎么样的?以及我们落地和规划、思考。
小游戏的发展现状
最先认识到小游戏是从跳一跳开始的,2017年12月份上线,大家的朋友圈、群里转发,产生了这样的营销效果。在小游戏形式之前,我们在游戏方面传播比较广的是传统的H5游戏,在我那个时候,《围住神经猫》这种游戏在短时间内有很大量的传播。
根据跳一跳来看一下小游戏的特点,你在微信中可以直接使用,加载速度比普通H5快很多,随点随用。在底层封装屏蔽了不同平台差异,暴露相同的接口,基本上一次开发接后,可以在安卓、IOS两端的微信运行环境下直接运行。
有H5开发经验的同学可以知道,H5基于浏览器,根据不同的场合、不同的机型,甚至不同应用webview内核不同,有很多需要兼容的地方,小游戏没有这样的问题。小游戏基于微信是天然可分享的,很方便的分享到图文平台、群聊等等。小游戏的底层基于canvas的,这个canvas是原生webgl上的一层封装,所以它的性能会好很多。另外,基于微信,你可以随便的扫扫码,搜一搜,也可以根据朋友的推荐很方便的获取。
正基于这样的特点,出现很多场景的小游戏,这是进博会官方的小游戏,配合展会进行推广。口袋工匠是故宫为了推广文物做的小游戏。这是腾讯的《灯山行动》,很有影响力的公益小程序。这些小游戏休闲游戏居多,随走随用。从轻量的角度来讲,很便于利用等地铁、车、电梯的碎片化时间。在文化方面,通过小游戏也可以做到很好的传播,这些都有非常丰富的文化属性,用有上千万的用户量。
小游戏的生态,有数十万的开发者,小游戏月活达到4亿,4亿的数量与传统移动游戏的用户量相当。小游戏有很大的潜力,58%以上是30岁以上的用户,31%是40岁以上的用户,之后父母辈会成为小游戏的主力。我们过年回家看到爸妈在那里玩各种小游戏,玩跳一跳,而且他们的水平比我们好很多。
这里是次留,7留,月留数据,达到这样的留存很不容易,很棒。在安卓内购流水超过千万级别有10款小游戏,小游戏有丰富变现的能力,有很多的商业潜质。
生态丰富来自于基础能力,从最初的canvas,到现在的各种引擎的适配,从标准的图形库到引擎,门槛在一步一步的下降。还有一些硬件接口的暴露,像刚才提到的陀螺仪、重力感应,它都拓展了游戏开发的边界。
基于微信的关系链、图文安全、动态消息、内购等这些特有的能力,及数据运营、资金结算能力的更完善,整个生态都进入了良性的循环,开发者可以通过其完善自己的小游戏,并且从游戏中获得利益、推广。
为什么要有云开发?
除了小游的基础能力,开发层面上还有云开发,云开发是基础架构层面更加轻量创新的服务端研发模式,可以降低开发门槛,使开发者专注于业务内容创作。
为什么要有云开发?在传统的开发模式上,我们感觉有很多痛点没有解决。首先,你要发布一款生产级别的应用,除保证业务逻辑没有问题以外,有很多内容需要自己处理,像高并发、弹性伸缩、负载,每一个项单拿出来都要讲很多,很难。作为业务开发来讲,很难cover住所有这些。从现代软件工程来讲,让更专业的人来做更专业的事,才能让你的服务更加稳定,这个逻辑是高效。
在传统模式下,从物理机托管,有自己的IDC机房,然后到上云,使用云上的服务云主机,到PaaS级别的服务,像容器、监控,这些都在减少资金投入成本和人力投入成本,云上的封装层级越高,暴露出来的越少,就需要更少的人去关心这些事情。即使走到PaaS这一步,你也需要专业的运维人原来跟进刚刚所讲的内容。人力的引入和自动化能力相比,可能会带来更多引入错误的风险。
现在应用开发比较现行的是BS、CS架构,前后端分离已经提了很多年,大家都在说前后端分离,这个事很好,大家各干各的,最后联调就行了。但开发者在真正的开发过程中,经常会遇到各种权责划分、反复沟通的问题。时间成本很高,导致整个开发进度缓慢。
我们想,有没有一种开发模式让开发者可以更多地专注业务逻辑,让开发者自己可以包揽更多的业务,从而减少沟通上的成本。从小程序的技术栈来看,主要限定在JS上,是前端开发的主要技术栈,大多数的前端也都听说过Node.js,通过Node.js可以在一定程度上Hold住后端业务逻辑。如果我们只有前端开发来负责JS与Node.js,这样就可以降低沟通成本,减少甚至免除与后端服务交互,做到更彻底的前后端分离。
运维搭建各种环境,网络打通,组件维护相关的工作,对于大多数人来讲,是很复杂耗费精力的。我作为普通的开发者,我希望要有一个稳定、高效、安全的环境,在自身逻辑正确的前提下,服务会稳定安全高效的跑下去,不受环境的影响。
基于这样的想法,我们总结了整个开发流程中普适性的基础能力,做了一些封装,把运维层面上的工作都屏蔽掉,暴露了一些函数式的接口来操作各个远端服务,像DB、存储等,推出一种无服务的全栈应用开发中台。
什么叫做无服务?Serverless不知道大家有没有听过?是这两年很火的概念。Serverless分为两部分:BaaS,后端即服务;FaaS,函数即服务。
在开发过程中,开发者不感知服务器的存在,传统开发要自己买服务器,在服务器上搭建DB,再买服务器,作为专门的存储服务器,实例搭建完需要编写服务作为中转,操作实例。在无服务的概念下,这些工作完全隐藏掉了,通过提供API的方式来直接操作资源,COS、消息队列、存储等后端实例,都作为一个服务,直接通过API来调用。Faas是Serverless的核心,也就是无服务器云函数,这个使serverless能做的事情更多,在云函数中可以跑真正的业务逻辑,覆盖了各种各样客制化的开发场景。
无服务是未来开发的发展趋势,从物理机到云上的Iaas层、主机、PaaS的开放架构,一步一步释放了人力,让开发者更专注于自己业务能力的开发。
云开发是什么?
什么是云开发?
云开发是一个支持小程序、Web、安卓等多端的应用服务中台。其整合了微信公众平台和腾讯云的核心技术,提供云数据库、云存储、云函数、日志和监控等开发运维能力。通过“小程序·云开发”,开发者可无缝安全调用小程序的开放服务,提升开发效率,快速试错和落地产品。
云开发的重要优势之一就是简化后台配置,开箱即用,存储、数据库和云函数,环境创建时都已搭建完成,提供域名和备案,免除繁琐的流程,开发者只需编写核心逻辑代码,无需关注后端配置与运维,专注于业务开发。
云开发集成在小程序的IDE里,免认证登录,在IDE里面有云开发,云相关API不需任何安装。我们和微信通过私有协议实现了更高效的鉴权方式,在微信客户端SDK中可以直接调用云上的资源,在云函数中,还可以通过云调用来调用微信的开放接口。这点是云开发的独有能力。
在运维方面云开发稳定可靠,云开发后面是各种腾讯云的基础设施,稳定、安全且高效,具备快速拓展能力,满足不同业务场景和需求。
在传统开发模式下,在小程序端使用了其他的服务,需要自己编写SDK,或者引入额外的SDK来调用到你的后端服务,后端服务需要自己来搭建、写框架、写路由、写接口,操作更底层的DB资源、COS资源,在环境上需要打通网络,以及加速等额外的工作。对于开发者来讲,你需要关注的内容很多的。若使用云开发,可以直接使用小程序原生接口,wx.Cloud。这个命名空间下有一系列的接口,通过这里面的接口就可以操作云开发上的这些资源。
在传统的模式下,你想实现简单的图片上传,小程序端、客户端都是一样的,chooselmage wx.uploadFile,但是整个后端服务搭建需要选择一个合适的框架,设计路由,你接收到这个文件上传到cos,运维要负责性能安全。若使用云开发的模式,在小程序端就只需要这个代码,wx.Cloud.uploadFile,把File ID传进去,整个过程都完成了。你要上传这个文件,自动上传到cos上,在链路上,我们会保证链路的一致性、鉴权及相关的操作。以前需要1000多分钟,最少三个人做的事情,现在前端4分钟就搞定这件事。
插入数据,也是很高频、很常见的操作。在小程序端,你需要wx.request来请求后端接口,开路由,写逻辑代理,接收到数据之后,存到MongoDB,整个流程包括中间沟通的时间,1000多分钟都过去了。你用云开发模式,前端工程师一个人,直接调wx.Cloud.database,通过这个add可以直接插入一条数据,直接操作远端数据库的服务,很方便。这段代码既可以跑在小程序端,也可以跑在云函数,从前到后都由一个前端开发来编写,统一的技术栈,后面也只需要一种技术栈的人来维护。
云开发有哪些功能?
云函数是serverless的核心,也是云开发功能中很重要的一点。云函数,你不需要服务器,也不需要配置域名,调用方式通过wx.cloud.function来调用的,开发者工具有一键上传的入口,你可以将自己的代码一键上传到云函数的运行容器中。整个运行环境,由腾讯云保证安全和隔离性。
云函数有一个很便捷的特性,你不需要自己写逻辑来获取到小程序的appid、openid,我们通过私有协议将其置于云函数的上下文中,云函数中直接获取,不需要鉴权解密等额外行为。我们在前层,有一层自己封装的鉴权服务,所有到达云函数的完全是安全的,携带微信的正常登陆态。
运管方面,云函数可以实现秒级的弹性伸缩,当请求量、并发量大时,可以快速进行扩容,防止服务崩溃。此外云函数与云主机不同,其按运行时间,只有请求处理时才产生一定的费用。
云函数具体的运行原理
在传统的服务器模式下,你的代码部署在远端服务器上,若想要做的更好些,可能需要考虑服务的拆分、服务的分层,多个模块通信,包括之间传递的私有协议链路上的鉴权。你自己从零开始搭建负担蛮重的。现在用云函数的方式,通过方便的部署手段,将云函数部署到远端容器中,在运行的时候,每个容器之间是隔离的,容器自身无状态。这样事件触发的机制,比较适合定时器和单功能接口的请求,请求到来即时处理,即时回收资源,没有冗余。函数容器,接收请求完成生命周期创建,请求返回时,生命周期结束,容器销毁。
云调用是云函数中很好用的一个功能,如果大家有经常进行小程序开发的话,需要使用服务端API,这些API的鉴权,通过access_token来做权限标志,云调用屏蔽了这件事情,你在云函数中直接使用cloud open API调用微信开放能力。这是发送消息的示例,直接调用这个API,并不需要传入access_token,整个调用链就可以直接下来。
Access_token,虽然保证了安全,但在使用过程中有很多问题。开发者要维护过期时间与申请节奏,若多个服务在多个地方同时用到access_token的话,一般需要一个中转服务器来专门维护access_token的过期与申请。若使用云调用,则完全不用care这件事情,开发者是很方便的。在小游戏中,包括内容安全级、动态消息,这7个很实用的云调用的接口,在刚刚的示例中,直接用Cloud open API点什么来调用这个能力,并不需要access_token。
云调用的开放能力,比较常见的微信运动、用户信息、分享信息,若使用微信官方HTTP API开发方式,则需要签名进行鉴权,签名所需要的一个重要的参数是sessionkey。其维护起来像access_token一样,需要专门分散大块的精力来维护,且一旦没有维护好,将影响所有使用其的服务。
在云函数中使用云调用的能力就像这样,这是获取微信运动的信息,直接通过微信的内置接口获取,但信息经过了加密,只能得到一个CloudID,需要自己解密才可以解出它具体的信息。而在调用云函数的时候,可以直接用wx.Cloud.CloudID,传出cloudID。
云函数端接收到的参数就像这样,刚刚传入的cloudID被自动解析成这样一个包,中间并不需要自己来解cloudID,整个调用对云函数是透明的。
云调用还可以用在实时语音中。实时语音有很多API,但关键的几个API都需要签名,通过API的房间ID,然后随机串、时间戳,以及sessionkey,通过固定算法计算出来的签名。使用云调用,可以直接调Cloud上的getVoIPSign的接口,只传入业务相关的groupId,传入时间戳,以及一个随机串,接口就可以直接把签名吐出来。
使用云调用免除了sessionkey 和 appid 维护,及签名算法,统一由官方内置的SDK来维护。业务方无感知签名方法的具体内容,当签名算法变更或扩展时,内置SDK自动支持,减少开发者负担。
云数据库,大家应该经常用到,云开发提供的是一个文档型的数据库,它的格式类似于JSON。前端开发的会更熟悉,每个JSON的对象,实际上数据库中的一条记录,我们提供各个简单的API来实现增删查改,在客户端很方便的构造查询,或者构造插入,直接通过API来做,并不需要为DB搭一个专门的后端server层的中转服务。
在小程序端,我们提供了4种力度的权限控制,可以实现collection级别的权限控制,基本上能完全覆盖公/私有读写搭配,通过权限控制可以做到细类目客户身份的划分,在云函数端具有最高的管理员权限。未来还将提供更细致的doc级别的权限划分,创建安全规则满足更细粒度C端访问云资源权限管控的需求。
文件存储,小程序提供了云端的存储空间,在云函数、小程序端,通过API就可以上传对象到存储中。同样有基于微信登录态的安全控制,带权限管理的云端下载。此外提供了公用网的域名,天然CDN加速,可以从公用网通过HTTP的方式访问。
安全方面,云函数可以秒级弹性伸缩不同容器对文件 、资源的操作权限,以及运行配置进行限制,服务有负载防御大流量攻击,全链路上一致性校验,保证服务在链上的安全。
云开发案例
分享二维码优化。二维码解出来的是一堆数字信息,开发可以往里面添加信息生成新的二维码,云开发也提供简单的云调用的方式来快速的生成二维码。因为小程序码受限于复杂度,在现实环境中,扫码环境多变,很不稳定,存储的信息月多,图像越复杂,识别出错的概率也越大。腾讯相册小程序二维码中包含了name, ownerid, page等大量信息,在某些机型上无法有效识别。云开发解决方案下,小程序码只需记下一个ID,具体信息存储在小程序云的数据库中,大大提升识别度大幅。
在云函数中获取到携带信息之后,把信息存入到DB,得到记录ID,通过云调用生成小程序码,生成图片传入cos中,得到临时url,你在分享的时候,小程序端通过临时url进行分享。
乐享花园,类似于农场的小游戏,可玩性很高,但整体后台很重,脱离后台脱离了后台开发,没有办法获取到授权、access_token,没办法也就无法使用内容审查这样的能力。而使用云开发,云函数中很方便的可以获得用户信息,关于access_token也可以使用云函数来维护,access_token 7200秒有效,可以通过触发器的方式来定时的触发。这样无需为需要调用到微信的接口来准备一个专门的服务器,服务端不关心客户端不同平台定制化的需求,只关心核心的业务能力就行了。
最后一个案例,基于实时数据推送多屏互动的能力,这是最近刚推出的,适用于即使通讯及多人对战。你通过watch方法新建数据库数据监听,每当db变化的时候,都会实时在onChange里面捕获到变动快照,开发者可以根据变动快照来进行下一步的操作,完成多端信息同步。
总结及展望
我们的目标打造多端全栈的应用开发平台,现在云函数支持node语言,我们将支持更多的服务语言。SDK方面已预先支持了Java、php。在多端方面,除小程序平台外还支持web,安卓平台,打造更全面的能力。在能力建设上,除基础开发能力外,在质量上会加入日志监控,监控告警等运维能力,方便开发者的管控了解自己的应用。