线上多域名实战

本文博主给大家分享线上多域名实战,当线上主域名不可用的情况下,启用备用域名完成网站高可用保障。

网站的高可用性一直是网站运维的重中之重。一旦网站宕机,不仅会造成巨大的经济损失,也会严重影响用户体验。备份域名就是一种实现网站高可用的重要手段。通过备份域名,可以在主域名不可访问时快速切换域名,保证网站正常运行。

一、前情回顾

博主上个星期,线上项目突然出现了少量用户无法打开项目网站,技术支持联系技术人员(也就是博主我)在用户电脑上复现了这一情况。

经过博主排查,发现在客户电脑访问主域名时,会出现连接超时,通过 curl 进一步分析连接详情,举例如下:

C:\Users\16697>curl -v www.wayn.com

* Uses proxy env variable http_proxy == 'http://11.22.11.22:4780'
*   Trying 11.22.11.22:4780...

发现线上主域名在用户电脑上返回的 CDN 节点 11.22.11.22 存在访问不通的情况。博主便跟运维沟通 CDN 节点不通的问题,运维回复是 CDN 节点不通是无法避免的,要看 CDN 厂商对于用户的覆盖情况,建议线上项目使用多域名,并且每个域名使用不同的 CDN 厂商,最大限度避免主备域名都不可用。

OK,得到的运维的意见,我们开始着手做多域名实现方案。

二、购买备用域名

实现域名高可用解决方案,首先需要准备一到两条与主域名功能和形式相似的备份域名。如下

主域名
www.wayn.com

备用域名一
bak1.wayn.com

备用域名二
bak2.wayn.com

购买备份域名后,需要注意一下两点:

  1. 需要在域名服务商那设置DNS记录,将主域名和备份域名指向同一个IP地址。同时也需要为两个域名设置相同的CDN加速和安全证书,保证用户访问体验一致。
  2. 将备份域名的网站配置(nginx配置文件)与主域名保持一致。确保使用备份域名也可以访问我们的网站。

三、主备域名切换实战

这里我们介绍一下通过 JavaScript 代码来实现网站的主备域名如何进行切换。

JavaScript 实现域名切换的流程如下:

  1. 在页面启动时,首先发起对主域名的请求,判断其是否能够正常响应。如果启动时主域名不可访问,就会访问备份域名。针对每个备用域名每隔一秒发送三次请求,如果都能访问成功则认为备用域名可用。代码如下:
// ES6 的模块引入方式
import fetch from 'node-fetch'

const domain = 'https://www.wayn111.com'
const bakDomains = ['http://bak1.wayn.com', 'http://baidu.com']

masterDomainCheck()

// 主域名检测,如果不可用会检查备用域名是否可用
async function masterDomainCheck() {
  try {
    await fetch(domain)
    console.log('主域名启用成功')
  } catch (e) {
    // console.log(e)
    try {
      await getBakDomain()
      console.log('备用域名可用')
    } catch (e) {
      console.log('备用域名也不可用')
    }
  }
}

// 访问备用域名,返回其中可用的一个域名
async function getBakDomain() {
  const apiPromiseList = []
  for (let i = 0; i < bakDomains.length; i++) {
    apiPromiseList.push(
      new Promise((resolve, reject) => {
        bakDomainCheck(bakDomains[i], 3, resolve, reject)
      })
    )
  }
  return await Promise.any([...apiPromiseList])
}

// 域名检测逻辑
async function bakDomainCheck(url, count, resolve, reject) {
  console.log(count)
  if (count > 0) {
    try {
      await fetch(url)
      bakDomainCheck(url, --count, resolve, reject)
    } catch (e) {
      console.log('e')
      reject(e)
    }
  } else {
    console.log(`bak domain:${url} access success`)
    resolve({ url, count })
  }
}

以上代码经过博主实测,大家感兴趣可以将代码拷贝在本地跑一遍。

  1. 如果主域名启动时正常,则开始定时监测主域名的可访问性。每30秒发起一次请求,判断主域名的HTTP状态码是否为200。
// 主域名正常,开始定时监测
setInterval(() => {
  fetch('https://www.wayn111.com')
    .then(res => {
      if (res.status !== 200) {
        switchDomain() 
      }
    })  
}, 30000)
  1. 一旦监测到主域名故障,开始调用 JavaScript 函数,找到页面所有包含主域名的链接,并将其替换为备份域名。
// 开始替换页面内域名为备份域名
function switchDomain() {
  let links = document.querySelectorAll('a')
  for (let i=0; i<links.length; i++) {
    if (links[i].href.indexOf('https://www.wayn111.com') > -1) {
      links[i].href = links[i].href.replace('https://www.wayn111.com'
              , 'https://bak1.wayn.com')
    }
  }
}
  1. 继续定时监测主域名,在主域名恢复正常时,调用 JavaScript 函数将备份域名的链接替换回主域名。
// 定时检查主域名故障恢复,一旦恢复再切回主域名  
setInterval(() => {
  fetch('https://www.wayn111.com')
    .then(res => {
      if (res.status === 200) { 
        switchDomainBack()
      }
    })  
}, 5000)

function switchDomainBack() {
  let links = document.querySelectorAll('a')
  for (let i=0; i<links.length; i++) {
    if (links[i].href.indexOf('https://bak1.wayn.com') > -1) {
      links[i].href = links[i].href.replace('https://bak1.wayn.com'
              , 'https://www.wayn111.com')
    }
  }
}
  1. 这样通过 JavaScript 检测域名状态与自动切换,可以最大限度减少域名切换造成的访问中断时间,确保网站高可用。

希望大家通过这个案例,能对线上用多域名来实现高可用网站有一个较为全面的认知。网站过于依赖某单一域名存在潜在风险,备份域名的引入主要是解决少数场景下用户访问不通我们网站的问题。

最后感谢大家阅读,喜欢的朋友可以点赞加关注,你的支持将是我的更新动力?。

公众号【waynblog】每周更新技术干货、线上项目实战经验、高效开发工具等。

原文链接:https://www.cnblogs.com/waynaqua/p/17344128.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:线上多域名实战 - Python技术站

(0)
上一篇 2023年4月24日
下一篇 2023年4月25日

相关文章

  • JavaScript 性能优化小结

    JavaScript 性能优化小结 JavaScript 是一门弱类型的脚本语言,为了提升 JavaScript 代码的性能,需要注意以下几个方面: 1. 减少 HTTP 请求 在加载网页时,每个请求都需要耗费时间。因此应减少 HTTP 请求,可以采用以下策略: 合并脚本文件和样式表文件 使用 CSS sprites 技术合并样式表图片 组合和压缩文件,使文…

    JavaScript 2023年5月18日
    00
  • 跟我学习javascript的函数调用和构造函数调用

    下面是“跟我学习JavaScript的函数调用和构造函数调用”的完整攻略。 函数调用 函数调用是指直接调用一个函数,不带 new 关键字。 基本语法 function funcName(param1, param2) { // 函数体 } // 调用函数 funcName(arg1, arg2); 示例说明1 下面是一个简单的函数调用示例: function…

    JavaScript 2023年5月27日
    00
  • JS 截取字符串substr 和 substring方法的区别

    首先我们先来讲一下substr和substring的共同点,它们都是用来截取字符串的方法,所不同的是它们的参数和使用方法略有不同。 substr方法 substr方法接受两个参数,第一个参数是起始位置,第二个参数是截取的字符串长度。如果第二个参数是负数,则表示从起始位置开始往后数n个字符,并截取到字符串结束的位置。如果第一个参数是负数,表示从字符串末尾开始往…

    JavaScript 2023年5月28日
    00
  • PHP中cookies使用指南

    首先让我们来介绍一下PHP中cookies的概念和使用方法。 什么是cookies? 在HTTP协议中,cookie是指服务器通过 HTTP 协议向客户端(通常是浏览器)发送的小型数据文件,该文件会在客户端下次通过 HTTP 协议访问同一服务器时发送到服务器,以便服务器能够获取和识别客户端信息。通俗的说,cookie就是浏览器和服务器之间的一种通信方式。 c…

    JavaScript 2023年6月11日
    00
  • Android studio 混淆配置详解

    Android Studio 混淆配置详解 什么是混淆? 混淆(Proguard)是 Android 应用程序构建工具中的一个开源的代码缩减、优化和混淆工具。在编译 APK 文件的过程中,代码混淆可以将类名、方法名、变量名等一些敏感信息混淆成一个无法识别的字符串,以增加代码的安全性和减小 APK 大小。 如何进行混淆? 在 Android Studio 中进…

    JavaScript 2023年6月10日
    00
  • javascript数组去重常用方法实例分析

    JavaScript数组去重常用方法实例分析 在 JavaScript 中,对于数组去重的方法有很多种,接下来我们分别介绍两种常用的方法,分别是“使用 Set 数据结构去除重复项”和“双重循环判断去除重复项”。 方法一:使用 Set 数据结构去除重复项 Set 数据结构是 ES6 中新增的一种数据类型,它类似于数组,但是成员的值都是唯一的,没有重复的值。我们…

    JavaScript 2023年6月10日
    00
  • JS原型链怎么理解

    JS原型链是JS中一个非常重要的概念,理解原型链可以帮助我们更好地理解JS中的对象,继承以及函数等相关知识。下面是JS原型链的详细讲解攻略。 什么是原型链? 在了解什么是原型链之前,我们首先要了解JS中对象的原型。 在JS中,每个对象都有一个原型对象 prototype,其包含了一组属性和方法,并且可以和其他对象形成继承关系。在访问一个对象的属性或方法时,如…

    JavaScript 2023年6月10日
    00
  • 微信小程序实现数字滚动动画

    实现数字滚动动画需要用到小程序中的 animation 和 setData 方法,具体步骤如下: 1. 页面结构 在 wxml 文件中,需要准备一个数字占位符,以及一个用于显示数字的文本框。 <view class="number-placeholder">{{ number }}</view> <view …

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部