云服务console新版本上线适配华为云及HCS场景的解决方案
背景
近几年华为公有云业务发展迅猛,为了满足客户需求,华为云推出了一系列新的云服务,对于已有云服务也在持续迭代中。最近,华为云某云服务推出新版本,然而新版本的上线并不是一蹴而就的,新版本的发布,并不意味着旧版本立马下线,新旧版本会在华为云现网同时运行一段时间,等旧版本租户完成所有割接任务之后,才能将旧版本彻底下线。如此一来,摆在我们面前的首要问题是:怎么保证同一个云服务的两个版本,在用户不感知的情况下同时在线上运行,又相互不影响呢?
每个华为云服务的控制台在线上环境都有一个唯一标识ID,该云服务的新旧版本在线上的标识ID分别为newserv和serv。自然地,要上线新版本,华为云及其他合营云局点将使用newserv作为标识ID。但是,由于HCS局点的标识ID在内部存在强绑定关系,只能使用serv作为唯一标识ID。那么,新版本既保证newserv的正常使用,也需要兼容HCS场景下serv的需要,我们该如何应对?
为了保障业务的连续性,在没完成将所有租户从旧版本迁移到新版本的割接之前,该云服务必须满足线上同时支持新旧版本。新旧版本在线上运行,分别对应一套控制台console。站在客户的角度,如果客户以前使用的是旧版本,那么在访问该云服务的时候,需要跳转到旧版本的控制台;如果是新客户,以前没有使用过旧版本,登陆华为云之后访问该云服务,则需要跳转到新版本的控制台,具体的实现,描述如下:
华为云官网对该云服务只提供链接到新版本的唯一入口;
进入新版本控制台之后,请求后台API,判断当前租户是旧版本租户还是新版本租户;
如果是新版本租户,则继续渲染页面,如果是旧版本租户,则跳转到旧版本的控制台;
华为云现网客户访问该云服务流程图:
华为云现网客户访问该云服务伪代码实现如下:
const promise = http.get({params: xxx});
promise.then(data => {
// 如果是旧版本租户,跳转到旧版本控制台
if (data.isOldUser) {
window.href = 'xxx/serv';
}
});
通过上述方案,客户通过浏览器访问该云服务的问题得以解决,实际上,还需要注意另外一个场景,客户在该云服务进行包周期购买操作,完成服务选型,订单确认之后,页面会跳转到订单支付中心进行付费,待客户成功完成付费之后需要返回到该云服务,此时页面上提供了一个返回按钮,点击之后即可返回该云服务,这里,怎么实现新旧版本用户能正确返回到该云服务控制台呢?
对于上面提到的问题,有两个解决方案:
返回按钮支持提前识别购买前的云服务控制台地址,点击返回按钮之后,能做到“从哪个云服务控制台来,返回到哪儿去”;
由于该云服务的唯一入口确定为新版本的控制台,那么点击返回按钮之后,肯定会链接到该云服务新版本控制台,这样,就回到华为云现网客户访问该云服务的问题,最终能正确返回到购买前的控制台。
目前,我们使用的是第二种解决方案,这一方案无需再去其他云服务做适配兼容,开发与维护成本较低。但是,在旧版本客户购买包周期的场景下,存在一次不必要的对该云服务新版本控制台访问的问题。
新版本使用serv和newserv
该云服务不管是华为云还是其他合营云,默认使用newserv作为唯一标识ID。
华为云现网,该云服务新旧版本同时运行:
serv,对应该云服务旧版本控制台
newserv,对应该云服务新版本控制台
本文背景部分提出的第二个问题,对于HCS这种特殊场景,我们给出以下的解决思路:
首先,要保证HCS局点的该云服务有且仅有一个版本(旧版本,或新版本)在线上环境运行,否则本方案失效;
其次,该云服务在出包之前,需要将代码中关于唯一标识ID(默认为newserv)的部分通过shell脚本替换成serv,这样就能保证HCS环境在线上可以使用serv。
HCS环境使用serv作为唯一标识ID,伪代码参考如下:
##将newserv替换为serv
function a() {
replace(newserv, serv, dir1)
...
replace(newserv, serv, dir2)
...
}
if HCS场景
a()
else
执行原有逻辑
总结
- 点赞
- 收藏
- 关注作者
评论(0)