50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

1688 域名切换——看我空中换引擎

  • 2013-08-01
  • 本文字数:3369 字

    阅读完需:约 11 分钟

一、背景

经过 10 多年发展、沉淀,阿里巴巴中文站从最初的单个应用系统发展超过 100 个应用系统,500 个以上域名。

早期有不少域名切换案例,但这次切换跟之前项目规模、复杂度要大许多, 且要求严格,需要一次性全部干干净净的切换。

二、挑战

协调超过 100 个应用系统、几百个域名同时切换,各个应用之间往往有各种依赖关系,一个地方出错很容易引起连锁效应,造成大面故障。所以,在这种情况下,我们必须保证中文站以及各个兄弟部门的业务正常的情况下,完成这个域名切换乾坤大挪移。

同时在商业上,需要保障客户的权益,防止 SEO 流量下降,防止 P4P、外投广告的收益保持稳定,等等,项目组感到压力重大。

三、切换方案

1、切换域名面临的技术挑战

1)一次性整体切换

如果按照应用维度逐一切换到 1688 域,需要考虑 cookie 双域读写和跨域请求问题。cookie 分三类:

a、永久 cookie,保存在用户本地电脑上,比如用户标识,访问行为跟踪,识别是否新用户等。

b、登录状态 cookie(session cookie),全站共享,在主域名下。

c、业务 cookie,各个业务应用读写的 cookie,在子域名或者主域名下。

Web 标准无法实现 cookie 的双域直接读写,只能通过 302 跳转或者内嵌 url 的方式间接实现。但是这种方案对应用浸入性比较大,非常复杂,难以大面积的实施;且即使使用,首 pv 的 cookie 丢失问题同样难以接受。所以,考虑到用户体验和切换效果及实施成本,项目组决定选择一次性整体切换。

2)各应用需要独立修改实施

目前有 150 个左右 web 应用,大约 600 个域名,还有部分数据库保持有模板信息,应用之间的相互依赖关系复杂,很难在同一时刻完成所有应用和数据库内容的修改且一次性发布。所以,必须采取策略保证各应用能够独立发布修改,解除应用之间的改造耦合。

2、方案策略

1)保护罩。给整个中文站所有与外界(用户)交互的应用系统(在系统边界)套上一个保护罩,这个保护罩对内部应用系统的修改实施过程进行保护,使应用的修改发布对外界不影响,这样各个应用之间的依赖关系解耦,各个应用可以逐个独立修改发布,在整个过程屏蔽外界用户的感知,保证在实施过程用户保持在同一个主域名及其子域名(*.alibaba.com)下访问,在实施过程中现有功能不会受到任何影响,网站所有功能照常提供服务。

2)为了保证全套环境——包括应用服务器、数据库、配置服务器、文件系统——在保护罩保护之下,线上(生产)环境支持双模式运行:一个是正式模式(对应域名 _.alibaba.com),正常用户在正式模式下访问;另外一个是测试模式(对应域名 _.1688.com),在测试模式下,保护罩不起作用,测试人员看到的效果跟实际代码一致,这样就可以利用线上全套真实环境进行全站联测,线上系统、配置服务器和数据库可以随时进行修改并订正。

3)待所有应用修改完成,全站线上新域名联测,完成联测之后去除保护罩,实现一次性切换。

3、方案实现

1)全站实施支持双域 cookie 工作改造,支持多套域配置,老域名采用老 cookie 配置,新域名采用新 cookie 配置。

2)web 内容输出增加保护罩,在 web 内容完成渲染输出时对内容以及 http head location 替换(考虑到静态内容替换,在 apache 层替换,需要开发一个 apache replace module)。这个模块支持双模式工作,在正式模式下,对输出的 web 内容(已经修的内容),扫描分析并反向替换回老域名模式,即把内容里面发现新域名的替换回到老域名,因此对用户屏蔽了改变,在实施过程用户不会影响现有功能;在测试模式下不做替换,测试模式下访问返回的内容和已经修改的代码保持一致,这样就可以提供线上全套测试解决方案,且可以逐个应用发布上线,应用之间的依赖完全解耦。

3)双模式支持,除了 AliSession 和 apache replace module 对双模式工作支持之外,apache 配置也需要增加虚拟主机配置来支持双域名访问,保证外部用户用老域名访问,内部测试人员和实施过程中 apache 反向代理、httpclient 方式,新域名能访问。

一次性切换,完成所有联测之后,把 apache 替换模块一次性下线(也可以做成开关模式,但最终需要下线),去除系统和用户之间的感知屏蔽层,实现全站一次性切换。

4)切换之后,所有老域名的访问 301 跳转至新域名。

总体方案设计图

替换工作原理图解

4、补偿方案

无论方案多么完美,难免会有些内容(不包含 url)绕过保护罩泄露出去,比如邮件内容,这些内容不经过 web 服务器 request/reponse 模式出去,因此 apache 替换模块不起作用。如果逐一去封闭各个出口,成本会比较大,而且这类途径泄露出去的内容占比很小,所以采用泛域名方式来解决。如保护罩设计图中的路径 2,所有新域名(新增的 *.1688.com 域名)会泛解析到 static 集群,这个集群做 302 跳转到相应的 alibaba.com 的 url,从而保障了可用性。但是对于先前已经提供了 1688 域名的应用,如路径 3,需要单独采取类似的方案。

5、服务器间的访问保护方案

服务器之间通常存在反向代理,或者通过 httpclient、rmi 等调用方式的数据服务访问,一旦这些访问的域名修改为了对应的 1688 域名,没有提前支持,肯定是有问题故障的(因为域名没开发,服务不可达)。我们采取的方案是,对内部环境新域名提前开放,保证服务器之间通过新域名访问可达。

6、测试模式识别

线下环境直接提供两种模式:正式模式和测试模式。为了把测试模式和正式模式区分开,我们采用在 cookie 下记录一个标志来区分。为了方面使用,开发一个简单页面,测试人员在进入测试模式之前,点击这个页面按钮切换模式,这个页面功能在双域下记录一个测试标记 cookie,apache 根据这个来判断是否属于测试模式。在测试模式下,apache replace module 不做替换,apache rewrite rule 不会外部重定向至 alibaba 域的域名。

四、其他问题解决方案

1、基于 cookie 数据统计跟踪断层问题解决

采取的方案是将老域名的永久 cookie 迁移至新域名。实现很简单,成本也很低,在通用 js(覆盖大部分页面)埋入迁移 js 即可。注意在迁移 cookie 的过程中,有可能改变 cookie 的值,因为 cookie 标准的不一样,对于有些值会加引号,使用方没有兼容的话,很容易产生故障。

2、SEO 流量影响的解决

  1. 各重要应用重新在百度站长平台,google,bing 的 webmaster 重新验证新的域名权限。
  2. 重要应用都在百度站长平台网站改版功能中,提交域名切换规则,同时,调整各大搜索引擎爬虫的抓取压力。
  3. 修改 sitemap 文件生成规则,将 sitemap 文件中的 URL 全部替换成新的 URL,同时实施 sitemap 地址安全化。
  4. 修改百度开发适配协议,重新调整 URL 的映射关系。
  5. 对于各应用暴露出去的 RPC 服务,或者 URL 服务,添加到 robots 禁止策略中,禁止各搜索引擎抓取,提升爬虫抓取效率。
  6. 寻求百度,360,sogou,soso 等搜索引擎帮助,请求搜索引擎算法部门实施域名切换,进行数据归一化,索引更新。(依赖新老域名映射清单,便于搜索引擎算法部门实施域名切换)

3、代码替换工具

首先建立核心映射关系表,梳理域名切换转换关系表格,老 <–> 新域名关系,包含一对一和一对多的关系,包括三级域名升级为二级域名,域名换名称等,后续所有工作都围绕这个表格进行。整个梳理过程相当繁琐,对几百个域名逐一沟通确认。

开发代码替换工具,同时可以提供给替换数据库,这个工具依赖的核心是域名映射列表。

五、总结

通过三大利器(保护罩、替换工具、补充模式)解决了切换存在的各种技术难题和大大降低了切换实施成本,并通过 SEO 优化策略确保切换之后影响尽可能小。

1688 域名切换项目正式上线一周全站业务系统非常稳定,未产生任何重大故障,客户反应也比较平滑,项目非常成功,达到了我们的预期目的,同时还顺带解决了一些历史包袱:

1、静态资源(图片、js、css 等)彻底独立于主域名,迁移至无 cookie 环境,解决了历史包袱,节省大量网络带宽消耗。

2、域名优化改善,包括域名合并,不合理域名清理,域名升级等。

作者简介

冯凌圣,阿里巴巴应用架构师,2004 年底加入阿里巴巴,主导过中文站许多重点项目及应用架构、性能优化,独自研制开发 json 安全解决方案、jmemory(java 版嵌入式堆外内存使用,类似简单 memcached 的嵌入式版本),目前主导阿里巴巴中文站应用架构。


感谢丁雪丰对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2013-08-01 02:196823

评论

发布
暂无评论
发现更多内容

Sugar BI 增强分析能力全场景解析

XxinQi

数据分析 可视化 BI 商务智能 预测模型

【Rust学习】内存安全探秘:变量的所有权、引用与借用

京东科技开发者

spring rust slice 企业号 2 月 PK 榜 可变引用

有关TCP协议,这是我看过讲的最清楚的一篇文章了!

程序员小毕

程序员 TCP 程序人生 计算机网络 架构师

关于小程序游戏变现方式你还知道哪些?

没有用户名丶

前端开发 小程序游戏

状态机的概念与设计

timerring

FPGA

Apipost自动化测试功能概述

不想敲代码

自动化测试 测试自动化 apipost

我的快速调优线上服务器CPU利用率通用办法,震惊面试官

KINDLING

Java cpu 服务器 性能调优 ebpf

GaussDB(DWS)现网案例:collation报错

华为云开发者联盟

数据库 后端 华为云 企业号 2 月 PK 榜 华为云开发者联盟

十年老程序员:再见了Navicat,以后多数据库管理就看这款SQL工具

雨果

sql navicat 数据库管理工具

小游戏内测|小游戏脱离微信运行在其它 App

Onegun

微信小程序 小游戏 小游戏开发 微信小程序-游戏

全新视觉,升维体验!全栈可观测中心嘉为鲸眼产品全新体验升级

嘉为蓝鲸

可观测 自动化运维 嘉为蓝鲸

成熟的自动化运维平台是怎样练成的?

嘉为蓝鲸

自动化运维 嘉为蓝鲸

《数字经济全景白皮书》出海篇:选对路径下好棋,热点出海行业如何实现增长?

易观分析

数字化 经济 出海

Portraiture4最新简体中文li磨皮滤镜插件

茶色酒

Portraiture Portraiture4

兴业证券打造更“自然”的数字人,火山语音提供技术支持

科技热闻

【活动报名】re:Invent - AI 应用助力企业构建数字战略

亚马逊云科技 (Amazon Web Services)

高校数据库/SQL教学用什么样的SQL工具?管理更方便,学习更轻松

雨果

数据库管理工具 :MySQL 数据库 SQL开发工具

重识Flutter 用于解决复杂滑动视窗问题的Slivers - part1

编程的平行世界

flutter 前端 an'droid

支付对接常用的加密方式介绍以及java代码实现

京东科技开发者

Java 安全 哈希算法 加密算法 非对称加密算法

前端图片最优化压缩方案

凉城

前端 图片处理 图片压缩 前端图片压缩

第六周作业-拆分电商系统为微服务

不爱学习的程序猿

Java高手速成 | 单例模式实现方式——枚举

TiAmo

单例模式 枚举 Java 开发

100 行 shell 写个 Docker

vivo互联网技术

Docker Shell

嘉为蓝鲸携手麒麟软件共建国产化一站式DevOps解决方案

嘉为蓝鲸

DevOps 自动化运维 嘉为蓝鲸

MASA Stack 1.0 发布会讲稿 —— 产品篇

MASA技术团队

.net 云原生 MASA MASA Blazor

百度APP iOS端内存优化-原理篇

百度Geek说

ios 内存 企业号 2 月 PK 榜

Boom 3D免费电脑环绕音乐软件2023最新版下载

茶色酒

Boom 3D

极客时间运维进阶训练营第十三周作业

9527

对线面试官:浅聊一下 Java 虚拟机栈?

王磊

java面试

ChatGPT集成之前,让我们复习一下即将过时的知识

newbe36524

搜索引擎; ChatGPT

嘉为科技蝉联信创工委会“卓越贡献成员”荣誉称号

嘉为蓝鲸

自动化运维 嘉为蓝鲸

1688域名切换——看我空中换引擎_阿里巴巴_冯凌圣_InfoQ精选文章