应用结构?
为了提升node应用的,响应速度,抗压能力,稳定性,以及负载均衡的考量,通常会添加一个反向代理层,一般由nginx来完成,我们称之为web层。 它的下层是app层(app层拥有横向扩展能力,位于VPC内),一个web对应多个app,每个app既是一个node 应用。总体流程如下:
智能DNS,选择国内,国外服务器 > ELB负载均衡 > Nginx Web 层 > ELB For VPC > Node App 层
何时,何处发布?
预发布为程序上线前的最后一个阶段,部署阶段即在预发布阶段进行,预发布服务器上运行着AMS系统,即(Application Manager System)应用管理系统,管理应用的发布过程(编译,预览,发布),缓存,日志。
为何要在预发布服务上进行发布操作?
这是由应用的结构决定的,我们的应用,分布于多个服务器上,为了达到部署时应用间的一致性,这就要求我们必须要有一个集中统一的处理过程,就是AMS系统,而预发布服务器是承载AMS系统的最佳选择,1,它是应用发布的最后一道关口,确保即将发布的程序结果唯一,正确。 2,只对应唯一一台服务器,可以一致的变更,添加各种,预处理及发布脚本,控制流程。
A/B 发布,与VPC
VPC(Virtual Private Cloud) 1,动态弹性扩展 官网一个最重要的作用,就是承载新品发布时的第一波流量,这时候的流量非常大,虽然比双十一差远了,但是并发量也会达到上万,VPC就可以实现应用的横向扩展,即AWS会根据流量来动态的扩展app服务器的数量,那它根据什么来扩展呢?就是你的应用镜像。
2,白名单限制 同时,VPC的存在也解决了一个横向扩展中至关重要的问题,就是白名单限制。白名单,在服务器端API中运用比较广泛,为了更高的安全性,源服务器只允许,特定IP地址的服务器访问API,这既是白名单限制。 我们如果按正常的横向扩展,就会面对一个麻烦的问题,扩展一台服务器后,各个API系统的白名单需要及时更改,否则数据将无法获取,但是由于外部系统较多,很难,及时,全面的更改所有API系统的白名单。VPC可以很好的解决这个问题,它只有一个出口IP,你可以在VPC这个虚拟网络内部,进行APP扩展,而这些APP将共享一个唯一的出口IP。这样就可以适应白名单限制,而快速准确的进行横向扩展了。
获取APP服务器的IP VPC有一个问题,由于内部服务器都没有外网IP,而且,IP是不固定的,新扩展的服务器IP无法预知,这就给发布带来了很大挑战,发布需要基于IP来进行。那么如何知道当前VPC里的服务器IP呢?AWS提供了一个API来查询IP,先通过组名称,拿到此分组下面的IP列表,然后挑选其中在运行的健康的APP,拿到IP List,即可按正常流程进行发布了。 AWS JS API中两个比较关键的函数: autoscaling.describeAutoScalingGroups 获取分组,及instanceId ec2.describeInstances 根据 Id,获取 instance
A/B 发布
上面谈的只是一方面,另外一个方面,我们的新品保密性非常严格,要求不到发布时,不得泄露新品的任何信息,这就要求我们,只能在产品发布的那一个时刻,才能最后发布代码上线,使用户可见。正常情况下,我们一个发布流程,要经过,编译,预览,并最后发布到各个服务器,更新缓存这样一个过程,至少也需要10分钟。所以,我们需要提前完成这个过程,但有不能上线,最后一刻要能够以秒级的速度上线。这就衍生除了A/B发布模式。
我们把服务器分为2组,A,B组,平时两组都发布,运行,当发布新品时,A组先下线,B组在线上服务。我们提前一个小时左右将代码发布到线下的A组服务器,完成编译,预览,发布等过程(这个过程,由于页面改动平凡可能会反复执行)。等到要上线时,A上线,B暂时下线。这个快速的切换过程如何实现呢? 修改nginx Web层面的 应用 app的upstream,并重启。这个过程,由shell脚本控制,在AMS对应的就是一个按钮,操作简单。关键是,生效时间非常快,不超过一秒,即可生效。
小结
系列文章: sails js 在 DJI 官网的应用(一)—— 前言 & 概述 sails js 在 DJI 官网的应用(二)—— 多语言 sails js 在 DJI 官网的应用(三)—— 缓存
下一章节将讲述: sails js 在 DJI 官网的应用(五)—— 补充&总结 以及开始 关于 Koa,React在 DJI 商城移动版应用的文章讲解
DJI官网 团队持续招人中 ,欢迎NB的前端/全栈工程师们,加入我们一起奋斗,打造一流的技术团队, 来吧朋友,国内绝对一流的工资、福利,甚至期权,等你来拿,简历可发送至 fei.pan@dji.com
图片来源: 天空之城