从浏览器输入url到页面加载(八)你的web网站有几台服务器?

你有没有想过一个问题,做为一名前端开发,你的网站上线后,准备了几台服务器?前端静态资源用了几台,你调接口的那个后端部署了几台?

目录

[1 没接触过这个问题很正常](#1 没接触过这个问题很正常)

[2 当访问量上升的时候](#2 当访问量上升的时候)

[2.1 提升带宽](#2.1 提升带宽)

[2.2 换服务器](#2.2 换服务器)

[2.3 分布式架构](#2.3 分布式架构)

[2.4 分布式的缺点](#2.4 分布式的缺点)

[2.5 重定向式](#2.5 重定向式)


1 没接触过这个问题很正常

很多人会说,我自己部署的,我能不知道部署了几台服务器嘛,连IP地址我都能告诉你,那恭喜你,你们公司还是挺不错的,而且我断定你一天如果工作8小时的话,每天还会花费一定的时间去搞服务器。

但没接触过部署也很正常,比如说我,在最初工作的几年里,我就从来不关心这些问题,要么本地SVN上传了,跟后端说,好了部署吧。要么本地npm run build一下,打个压缩包,发给后端说,来,大哥,部署一下。然后后端过会儿跟我说,部署好了看一下。我一看,哎呀,有问题,我再给你打个压缩包,你先别走啊,等着我。

就这种情况,我敢断定,一直到现在,还有很多前端就是这种工作流程,他接触不到部署,或者前端的dist文件,最终就是在服务端的某个web目录下。你让他怎么回答这个问题?

2 当访问量上升的时候

我之前就遇到过这种问题,平时好好的,疫情期间突然在线课程网站点不动了,按钮不动了,页面打开的慢了,然后后端就跟领导说,不行了,前端出问题了,更可恶的是,领导还真找到我说,你赶紧看一下,有bug赶紧改,这也让我催吗?

2.1 提升带宽

这就是很明显的,当服务器访问量上升的时候,性能跟不上了。服务器线路的带宽毕竟是有限的,你加带宽有时候效果也不是很明显,带宽增加了,很有可能你的服务器性能就是跟不上,一旦访问量大了,网络线路传输了大量的数据包,网页不就卡住了嘛。

2.2 换服务器

提升带宽了,如果服务器性能还是跟不上,那好办,换一台性能更好的服务器不就行了。不过这也是一种比较简单的办法,如果你的网站真的用户量很大,或者某一时间流量很大的话,很显然,这并不可行。也就是说,紧靠一台服务器,难堪重任,除非你们公司的网站其实就没打算让更多的人访问,人多了,我关了他。

2.3 分布式架构

如果多用几台服务器,分担流量压力是不是就更好了呢,这样总体访问量并没有减少,而且恰恰可以使每一天的压力变小。假设我们现在有3台服务器,这样,每一台的压力不就是之前的三分之一了嘛,对吧。

想解决这个问题,必须有一个机制将客户端发送的请求分配到每台服务器上。比如我们发送一个前端请求:

javascript 复制代码
const url = 'http://a.text.com/getUser';
axios(url, data).then((res) => {
    console.log('res:', res.data);
})

那么按之前正常的思路来说,我们把请求发送到这个目标URL的域名上,然后请求的接口是getUser,希望获取用户信息。当我们访问服务器的时候,这个URL域名就可以通过DNS设置,分配多个IP地址,比如我们3台服务器的IP地址分别是123.123.123.1 和 123.123.123.2 和 123.123.123.3。那么当我们访问这个URL的时候,DNS服务器会将IP地址按顺序返回,例如

第一次查询域名的时候,服务器IP顺序是

23.123.123.1 123.123.123.2 123.123.123.3

第二次查询域名的时候,服务器IP顺序是

23.123.123.2 123.123.123.3 123.123.123.1

第三次查询域名的时候,服务器IP顺序是

23.123.123.3 123.123.123.1 123.123.123.2

这样就可以每次调用接口的时候,轮询着访问了。

2.4 分布式的缺点

这么做看似是不错的,而且很多公司也都是这么用的。但这样做有个缺点,因为DNS不知道这3台机器的健康情况,比如第一台机器宕机了,他肯定不知道,然后就还会往过发送请求,这样一来,我们访问第2台,第3台的时候,发现没问题,但总是有那么一会儿发现,就是不返回数据,很难查到这个问题。

再比如说,我们很多公司有自己的机房,而很多时候,刚一分配的机器没有太多的网络权限。这个时候,你就会发现有时候接口通,有时候接口不通,排查起来特别麻烦。

2.5 重定向式

刚才我们说了DNS轮询IP,部署多台服务器,来缓解流量压力。还有一种方式也挺好使的,比如我们有2个接口请求

javascript 复制代码
const url = 'http://a.text.com/getUser';
axios(url, data).then((res) => {
    console.log('res:', res.data);
})

const urlList = 'http://a.text.com/getList';
axios(urlList, data).then((res) => {
    console.log('res:', res.data);
})

分别是查询用户和查询列表的(咱就说这么个意思) ,这个时候,都会访问到这个域名的机器上,你可以对getUser和getList这两个路由做重定向啊,比如nginx重定向代理

python 复制代码
server {
    listen 80;
    server_name a.text.com;

    location /getUser {
        proxy_pass http://other_machine_ip/getUser;
    }

    location /getList {
        proxy_pass http://another_machine_ip/getList;
    }
}
  • listen 指令指定 Nginx 监听的端口和协议。
  • server_name 指令指定了服务器的域名。
  • location 指令用于匹配特定的 URI 路径。
  • proxy_pass 指令将请求转发到指定的后端服务器地址。

当然,这其实也是准备了多台服务器,甚至你需要getUser这个重定向后的机器,再通过负载均衡,准备多台服务器来解决大流量的问题。

相关推荐
上海运维Q先生8 分钟前
面试题整理14----kube-proxy有什么作用
运维·面试·kubernetes
RealName-Wang9 分钟前
联想 P368-C3 thinkstation服务器介绍
运维·服务器
叫我菜菜就好12 分钟前
【Flutter_Web】Flutter编译Web第三篇(网络请求篇):dio如何改造方法,变成web之后数据如何处理
前端·网络·flutter
NoneCoder18 分钟前
CSS系列(26)-- 动画性能优化详解
前端·css·性能优化
滚雪球~19 分钟前
@vue/cli启动异常:ENOENT: no such file or directory, scandir
前端·javascript·vue.js
GDAL29 分钟前
vue3入门教程:ref函数
前端·vue.js·elementui
sone1213834 分钟前
计算机网络(第8版)第四章 网络层(4.7.1~4.7.3)
服务器·网络·计算机网络
GISer_Jing37 分钟前
Vue3状态管理——Pinia
前端·javascript·vue.js
DO_Community1 小时前
DigitalOcean Droplet 云服务器:新增自动扩展池功能
服务器
安科瑞刘鸿鹏1 小时前
老旧小区用电安全保护装置#限流式防火保护器参数介绍#
运维·服务器·物联网·能源