随着MBaaS的发展,取代移动企业应用程序平台的趋势也愈来愈明显。MBaaS系统为了让企业能方便快捷的开发本身移动应用程序,提供了诸多移动客户端支持,有最通用的REST API,也有方便移动开发者的软件开发工具包,还有必定程度的监控和分析服务提供。而对于相对比较复杂的应用程序,开发者有时不想也没必要在移动设备上运行很复杂或很费时或没法实现的业务逻辑,这种需求催生了云代码的产生。java
想象一下,若是你想要少许结果信息,但却必需要向设备发送大量对象列表,或者调用大量REST API才能完成此项工做时(好比统计汇总操做),这种操做显然会消耗你大量的带宽和用户流量。mysql
想象一下,若是你想要设备周期性定时完成某个任务或者想在后台一直运行某个任务(好比资源回收垃圾清理),这种操做显然很不可靠,一方面用户可能会随时关闭设备上的应用,另外一方面在后台一直运行某个任务显然也会耗费用户设备电量等资源,得不偿失。linux
想象一下,当你须要调用第三方平台API时须要对方回调时好比完成某个支付操做,服务提供商在支付成功后执行回调,你须要根据回调结果完成后续操做好比同步记录到数据库中,这种操做在移动应用在没有本身的后端服务器时也很难完成。ios
想象一下,你的某个App应用有iOS,Android,JavaScript等多个设备平台版本,当你新增一项功能,同一套业务逻辑须要在全部平台作同步开发,当你修改一项功能,一样须要在全部设备平台作新版本发布更新操做,若是产品迭代很迅速那这种频繁的操做显然会大大增长移动开发的成本和效率,但效果却可能不见得很好。git
想象一下,当某个用户注册了你的应用,你须要对该用户增长一些信息来用于统计,或者用户购买了应用里的某个商品,你须要收集除订单外额外的信息,这类在用户触发某些特定操做时会自动额外产生的逻辑(Hook操做),这些Hook操做并不适用在移动端编写。算法
伴随移动开发,相似上面的状况多有发生,此时MBaaS系统提供的云代码功能就是为移动应用量身定作的解决相似上面问题的方案,云代码的愿景就是方便移动开发者完全摆脱服务器,为所欲为的开发各类移动应用程序。sql
MaxLeap做为一款优秀的MBaaS平台系统,其云代码的功能如何,是如何实现的,又有哪些加分项,接下来将为你们一一揭晓。docker
有了云代码的背景愿景,那云代码须要提供的基础功能就很显然了数据库
首先得提供基础服务和框架,方便用户开发云代码segmentfault
其次得提供代码托管,能很方便的让用户快速部署代码到云端运行
最后提供日志和相关监控工具,能对线上代码的错误及性能特征有更多了解,以便优化本身的程序
如何提供基础服务和框架来方便用户开发?因为用户的开发环境和擅长的开发语言各类各样,好比使用Java,使用NodeJs,使用Python,使用JavaScript的等等,咱们提供对应的各个开发语言的基础云代码SDK,丰富用户的选择,下降用户开发门槛和成本,这样云代码在CloudCode SDK基础上开发就会很是便捷,这些CloudCode SDK和MBaaS对外提供的移动SDK不一样的地方在于它并不在移动设备上运行,而是在云端运行。也就是说开发者先要选择本身喜欢的云代码SDK,好比我很擅长JAVA,因此我会选择cloud-code-java-sdk来开发个人云代码,同时云代码SDK还要提供本地开发测试框架,总不能让用户线上开发调试吧,本地开发本地调试完成后再部署到云端。固然为了开发者更快的开始,MaxLeap同时提供了Demo和Quick-Start项目来让开发者更快接触云代码。
开发者在使用云代码部署到云端后该如何访问云代码?MaxLeap的云代码是经过基础的REST API来访问,云代码SDK负责提供Http服务对外暴露REST API,由于基于Http能够很好的兼容不一样开发语言,实现跨平台访问,固然这些API不会直接暴露在用户面前,用户只有经过调用MBaaS的云代码服务API才能间接访问。
不一样开发语言的基础云代码SDK其实都具备相同的功能,最重要的是数据存储服务,CloudCode SDK经过封装一系列REST API来让开发者很便捷的访问基础MBaaS服务。除此以外还要提供云函数、后台任务、Hook操做、消息推送、日志、安全访问、分布式计数器、分布式锁等功能。
数据存储服务
经过SDK能够很方便的使用MaxLeap的存储服务,例如对象的CRUD操做,同时集成了手机行业主流的金币系统。
云函数
运行在MaxLeap云端的函数,定义好云函数后能够经过REST API方式来访问,这个API是同步的。同时云函数提供白名单功能(经过界面设置),方便被其余第三方网络服务调用。
后台任务
一样是运行在MaxLeap云端的函数,对于长期运行的任务而言,后台任务很是有用,例如与响应时间较长的外部网站集成或分批发送推送通知。若是您在运行云函数时常常遇到超时错误,则能够考虑使用后台任务,同时当您部署云代码后,可经过后台界面进行计划任务,你能够计划一次性任务或者周期性任务,这不但能够方便管理你的后台任务,同时也能清楚的追踪你的任务状态。
Hook操做
Hook用于在对 Cloud Data 进行任何操做时(包括新建,删除及修改)执行特定的操做。例如,咱们在用户注册成功以前,能够经过beforeCreate Hook,来检查其是否重名。也能够在其注册成功以后,经过afterCreate Hook,向其发送一条欢迎信息。Hook能很好地实现与数据操做相关的业务逻辑,它的优点在于,全部的业务在云端实现,并且被不一样的应用/平台共享。
消息推送
在移动应用中,为每一个客户端用户推送系统消息或定制消息必不可少,经过该功能开发者能够很便捷的将消息推送到全部或指定设备上。
分布式计数器/锁
云代码在云端是一个分布式应用,提供计数器、锁相关的功能以便多个实例之间能够共享同一份数据。
日志
提供Logging功能,以便您能记录Function,Hook或者Job在运行过程当中出现的信息。
命令行工具
能够方便用户云代码项目的上传,部署,中止及版本管理。
云代码做为在云端部署的代码,MaxLeap是如何管理它们的呢?在这项重中之重方面咱们可能会遇到下面这些问题:
每一个开发者的环境不一样,操做系统也不相同,如何下降搭建各类环境的成本以及下降对操做系统的依赖、下降硬件要求和应用环境之间耦合度同时下降虚拟化消耗?
管理的应用可能成千上万,可是服务器资源就那么多,该如何对每一个应用实现虚拟化来整合应用和服务器下降成本?
每一个应用的重要程度也不一样,有重度用户须要高可用高性能的服务,有低度用户可能一天也不会有几个请求,资源该如何分配?
用户的代码部署在云端,如何保证用户的应用代码安全?
用户代码服务如何作到高可用,出现故障该如何转移,如何作到服务不间断,新发布的代码出现异常该如何回滚?
基于上面遇到的问题,咱们把用户的云代码做为一个松耦合的单个服务,也就是如今流行的微服务架构,经过docker来实现对微服务容器化,由于docker自己就是源于Paas,在MBaaS系统也很是适用,咱们不用为每一个云代码应用开启一个虚拟机来下降硬件要求和应用环境之间的耦合度,这能大大下降虚拟化消耗,下降成本,并且docker还能为应用提供一个从开发到部署上线都一致的环境,很是便于管理代码的流水线,让咱们能够对云代码从开发到发布部署简单可靠的控制。同时Docker隔离应用的能力很是适用于用户的云代码,能让咱们比经过虚拟机更好的整合云代码应用和服务器,基于docker,咱们能为每一个不一样的云代码应用建立隔离的环境,并为他们分配指定的服务端口、内存资源等来隔离应用。
在咱们看来用户每次的代码发布都是一个构建镜像并推送镜像到私服上的过程,每次代码部署都是从私服上获取镜像并启动一个容器的过程,每次中止部署都是一个容器卸载的过程,每次升级代码都是一个从新生成不一样标签的应用镜像的过程。用户每次上传发布云代码都须要为它指定一个版本,不一样的版本会生成不一样的镜像标签,能够同时部署多个版本,但咱们作了限制,最多只能同时发布2个版本,咱们称之为灰度发布,这是为了能让你的代码能平滑过渡升级,在灰度发布过程当中用户须要设置版本负载均衡比重,以作到服务不间断,基于版本控制你能够回滚你的代码,你能够选择你发布过的任意版本进行部署,这真的很是方便。
对于用户的云代码镜像、启动的容器、部署的策略以及容器所在的宿主机咱们会有一个专门的CloudCode-Manager服务来进行管理,咱们称这个服务为hydra(海德拉)。它希腊神话中的九头蛇,传说它拥有九颗头,其中一颗头要是被斩断,马上又会生出两颗头来,在这里咱们寓意用户的云代码能够达到高可用,若是用户部署的任何一个云代码实例出现故障达到服务不用,系统会自动在其余宿主机上从新启动一个相同实例。为了达到高可用、故障转移,云代码SDK须要提供心跳接口,在用户部署云代码后每隔一段时间hydra都会作心跳检查,检查失败重试必定次数后便认为该服务已经失效,咱们会在另外一台宿主机上从新部署一个和故障实例如出一辙的实例,而后再卸载故障实例,若是卸载故障实例失败,好比故障实例所在的宿主机发生宕机,那么该故障实例会永久成为一个孤岛实例等待被强制回收。若是应用的云代码被重度使用超过负荷能够随时扩容,或者经过缩容来较少成本,经过任意扩容和缩容也就是经过部署容器任意实例数量来真正达到高可用,最经常使用的使用场景是商家在作活动时有访问高峰能够快速增长实例资源来减小压力,平常时则减小实例以低成本运行。
经过docker来整合应用和服务器,一台宿主机上可能部署了上百个容器应用,那应用是如何分发的呢,在云代码SDK中咱们提供了REST服务,好比云函数、后台任务、心跳等API,全部应用的这些REST服务在启动后都是监听在容器的8080端口,容器须要容许外部访问就必需要映射容器端口到宿主机,因此在应用分发过程当中,宿主机的端口管理很是必要,咱们使用mysql来存储全部宿主机的信息,包括全部提供给云代码容器使用的可用端口,经过乐观锁来保证端口的并发分配,启动任意云代码容器时都会分配一个映射端口给容器,同时在zookeeper中同步应用的云代码服务地址提供给MBaaS云代码服务使用。这个过程使用事务来保证容器启动和数据库信息的一致性,同时使用zookeeper分布式锁来防止同一个应用被同时操做。云代码服务的REST层实时监控zookeeper中云容器访问地址信息变动,经过hosting形式提供路由功能,经过负载均衡算法选择可用地址来访问宿主机上的云代码达到分流效果,这样就能作到简单有效的应用分发。
上面咱们说到云代码容器经过端口映射来容许外部访问,但考虑到用户的代码安全,并非任何机器均可以访问云代码容器,这就须要一个网络安全体系来对用户的访问和网络进行限制。在网络隔离安全方面,咱们在Docker的标准网络桥接接口docker0上启用内核防火墙iptables规则来限制Docker容器的源IP地址范围与外界通信,全部的云代码宿主机只能由maxleap和hydra服务所在的机器访问,而云代码访问maxleap内部服务须要经过反向代理实现。
在宿主机和容器之间安全隔离方面,经过访问控制的安全策略,使用selinux配置Linux内核安全模块,从而实现强制性的访问控制(MAC)用以将进程约束在一套有限的系统资源或权限中。在容器与容器之间经过cgroups防止经过耗尽系统资源引起拒绝服务(DoS)攻击,好比限制容器的CPU使用、内存使用、存储使用。
使用微服务容器化云代码能为应用开发者省去部署和维护方面的负担,但代价是必定程度上减弱了线上环境的透明性,为了能对线上代码的错误和性能特征有更多了解以便优化本身的代码或者扩容、缩容来达到水平扩展,咱们须要给很好的监控云代码。
一、首先是日志信息的收集,云代码的系统日志、用户的日志这些都须要收集起来提供给用户查看,MaxLeap的云代码使用主流的Logstash+elasticsearch来完成日志收集工做,咱们会在每台宿主机上启动一个logstash-forwarder服务做为shipper来收集指定的云代码日志,Logstash汇聚日志后转发到ES存储。
二、其次是对容器资源的监控,Docker容器经过namespace作资源隔离,经过cgroup来作资源限制,咱们有个专门的docker-monitor服务来监控全部宿主机上云代码容器的指标,它会周期性获取已注册的宿主机上全部云代码容器的cgroup stats,收集指标包括CPU MEM IO等,而后将数据PUSH到ES里。
三、最后是展现给用户,MaxLeap经过后台界面的方式展现出全部容器实例的性能和状态,还有部署的云代码版本全部的日志信息,用户能够很直观的了解到本身的云代码有什么错误的信息,在什么地方有瓶颈,该在哪方面优化代码。而咱们内部会经过Kibana来展现,并经过Nagios来报警。
有客户看到这里说:你说了那么多,我就是不想用你的云代码SDK来写,熟悉你的SDK都要花费好长时间,用看官方文档头都大了,我就想用关系型数据库,我就是想用我本身写的后端服务或者以前公司已经写好的程序,咋办?嘿,MBaaS系统的愿景是让用户彻底摆脱服务器,但遇到这种已经有本身服务器和数据库并大量线上使用的客户让他们选择MBaaS系统便得仔细考量是否值得了。考量到这类需求,MaxLeap在云代码的基础上衍生出了云容器的概念,它是能够帮助用户部署及运维其后端应用程序的代码托管服务,用户只须要提供服务端的业务逻辑,包括静态网站或者动态应用程序,而服务端的高可用、多实例、负载均衡、不中断服务的平滑升级等都由云容器提供支持。没错,云代码有的功能它均可以有,云代码没有的功能它也有,一个是数据源功能,不少企业客户内部使用的数据库都是mysql这种关系型数据库,让他们一下切换到MBaaS上的NoSql数据库会很不放心,特别对事务要求很严格的业务逻辑,人家可能一看到你的数据库是使用Nosql就放弃了,能很方便的迁移也不行,就是这么直接,云容器的数据源功能则会帮让他们放下很大一部分顾虑,它可让用户使用并管理本身的关系型数据库,而另外一个二级域名功能可让用户在部署云容器后能够直接访问他的云服务。做为云代码的升级版,云容器的底层架构都是基于云代码的实现,这彻底下降了用户Dev&Ops上的难度。因为篇幅缘由,更多云容器相关的信息本篇文章再也不赘述了。
看到这咱们发现MaxLeap的云代码、云容器的架构基本都是围绕docker容器这个生态圈来实现的,那么如何更好的维护和优化这个生态圈将是咱们未来的重中之重,在这里咱们给出一些咱们将来一段时间将要实现和优化的关键信息:
全部容器资源经过Mesos申请
全部容器生命周期经过Marathon管理
更智能的资源分配机制,更智能的压力监控实现自动扩容/缩容
用户云代码托管方式支持git等第三方仓库
用户上传云代码、云容器支持增量上传来减小等待时间
更多容器安全方面的优化
更多云代码/容器操做的Dev&Ops自动化
更多基建架构方面的调整优化
MaxLeap更强大更优秀的云代码/云容器服务敬请你们期待。
相关阅读:
移动云平台的基础架构之旅-云应用篇
做者系力谱宿云 LeapCloud 团队_云服务研发成员:David Young【原创】
力谱宿云首发地址:https://blog.maxleap.cn/archi...
欢迎关注微信订阅号:从移动到云端
欢迎加入咱们的MaxLeap活动QQ群:555973817,咱们将不按期作技术分享活动。
如有转载须要,请转发时注意自带做者信息一栏并本自媒体公号:力谱宿云 LeapCloud,尊重原创做者的劳动成果~ 谢谢配合~