深入Web请求
浏览器缓存机制
为了重新请求看到最新的数据,必须通过HTTP协议来控制
在我们刷新一个页面的时候,在HTTP的请求头会增加一些请求头,告诉服务端需要最新的数据,而不是缓存
请求头会多两个请求头,分别是
Pragma:no-cache 和 Cache-Control:no-cache
Cache-Control && Pragma
整个请求/响应链中必须服从的命令
Http Head 字段的可选值
可选值 | 说明 |
---|---|
Public | 所有内容被缓存,响应头设置 |
Private | 内容缓存到私有缓存,响应头设置 |
no-cache | 所有内容不会被缓存,请求头响应头设置 |
no-store | 所有内容不会被缓存或Internet临时文件中,响应头设置 |
must-revalidation/proxy-revalidation | 如果缓存失败,请求就发送到服务器或者代理重新验证,请求头设置 |
max-age = xxx | 缓存内容将在xxx秒后失效,只在HTTP1.1中生效,响应头中设置 |
Cache-Control请求字段被浏览器支持的较好,优先级较高,和其他字段一起出现(Expires),Cache-Control会覆盖字段
Pragma字段和Cache-Control字段差不多
Expires
通常的使用格式: Expires:Wed, 14 Jun 2023 08:31:12 GMT
日期与时间,超过这个时间,缓存的内容失效,浏览器发请求前,检查该字段,如果失效,重新请求
Last-Modified /Etag
Last-Modified 表示一个服务器上资源的最后修改时间,
资源可以是静态的,静态内容自动加上Last-Modified字段
可以是动态的,Servlet里的一个方法getLastModified()方法,检查某个动态内容是否更新
在响应头返回一个Last-Modified字段
浏览器再次请求的时候,会在请求中加上一个If-Modified-Since:…,询问当前缓存是否是最新,最新返回状态码304,然后服务器不用再传数据
Etag字段和上面这个字段作用差不多,Etag让服务端给每个页面分配一个唯一的编号,然后通过这个辨别是否为最新的,
这个方法比Last-Modified更灵活,但是后端服务器很多台的话,比较难处理,所有服务器都得记住所有资源,没什么意义了.
DNS域名解析
过程
当用户再浏览器输入url之后
第一步
检查浏览器缓存,是否有对应的IP地址,有,直接结束过程.
浏览器的缓存也是有限制的,缓存大小有限制,时间也有限制,被缓存的时间由TTL属性来设置.过长过短都不好.
过长,可能网站更新之后,用户无法解析变化后的IP地址
过短,每次访问都得重新解析域名
第二步
浏览器缓存没有,检查操作系统缓存中的hosts文件,这里有可能就会发生域名劫持的问题
从第三步到之后再图中体现
第三步
前两步都不行,操作系统会把这个域名发到LDNS(本地域名服务器),LDNS也就是我们自己定义的DNS服务器
LDNS是主要域名解析工作的大头
第四步
LDNS直接给Root Server域名服务器
第五步
根域名服务器返回本地域名服务器一个主域名服务器(gTLD Server)
gTLD是国际顶级域名服务器,如.com .cn .org
第六步
本地域名服务器 -> gTLD发请求
第七步
gTLD返回Name Server服务器,这个Name Server一般是运营商提供的服务器
第八步
Name Server 一般根据域名返回一个ip记录,还有一个TTL返回给DNS Server域名服务器
第九步
LDNS 缓存IP和域名对应关系,缓存时间由TTL决定
第十步
用户接受结果,并且再本地缓存写入
清除缓存
Windows
ipconfig /flushdns
几种域名解析方式
A记录,MX记录,CNAME记录,NS记录,TXT记录
A记录
Address ,指定域名对应的IP地址,A记录可以指定多个域名对应一个IP地址,但是不能一个域名多个ip地址
MX记录
Mail Exchange,将某个域名下的邮件服务器,指向自己的Mail Server
CName记录
Canonical Name别名解析,为一个域名设置多几个别名
NS记录
为某个域名指定DNS解析服务器
TXT记录
为某个域名设置说明
CDN工作机制
内容分布网络(content delivery network),目的是再现有的Internet增加一层新的网络架构,将网站的内容发布到离用户最近的网络边缘
提高用户响应速度,有别于镜像
CDN = 镜像 + 缓存 + 整体负载均衡
目前CDN都以缓存静态资源为主,用户在主站请求到动态内容,再从cdn上下载静态资源
通常CDN的目标
可扩展性 性能可扩展性:应对大量的新增的数据,用户,事务 成本可扩展性:低运营成本 提供动态的服务能力和高质量分发
安全性: 减少ddos
可靠性,响应,执行,服务可行性,处理可能发生的故障,提升用户体验
CDN架构
如图,一个用户访问某个静态文件,这个静态文件的域名加入是cdn.taobao.com,
首先向Local DNS 服务器发请求,通过迭代解析后货到这个域名的注册服务器去解析,一般每个公司都会有一个DNS解析服务器.
这时这个DNS解析服务器通常会把它重新CNAME解析到另一个域名,而这个域名最终会指向CDN全局中的DNS负载均衡服务器
再由这个GTM来分配哪个地方的访问用户,返回给力这个访问用户最近的CDN节点
拿到DNS解析结构,用户就直接去这个CDN节点访问这个静态文件,如果文件不存在,就会到源站去获取这个文件,最后再返回给用户
负载均衡
负载均衡对工作任务进行平衡,将任务分到多个操作单元上执行
通常有三种负载均衡架构,分别是链路负载均衡,集群负载均衡,操作系统负载均衡
负载均衡是由DNS的解析来完成的,用户最终访问哪个Web Server是由DNS Server来控制的
链路负载均衡
通过DNS解析成不同的ip,然后用户根据这个ip去访问不同的目标服务器
优点,就是快,直接访问目标服务器,不经过其他代理服务器
缺点,DNS本地和Local DNS Server都有缓存,一旦有一个Web Server挂掉,用户那边域名没有及时更新,后果严重
集群负载均衡
硬件负载均衡和软件负载均衡
硬件就是由一台专门的设备转发请求
设备很贵,一般公司用不起,还有就是当访问量陡然增加超出服务极限时,无法动态扩容
软件
上面两台LVS,使用四层负载均衡,也就是再网络层利用ip地址进行地址转发
下面四台HAProxy进行七层负载,也就是根据用户的HTTP请求头来进行负载均衡,如根据URL来请求转发到特定机器或者根据用户Cookie信息访问指定机器
操作系统负载均衡
备很贵,一般公司用不起,还有就是当访问量陡然增加超出服务极限时,无法动态扩容
软件
[外链图片转存中…(img-esYy7cpF-1686896116304)]
上面两台LVS,使用四层负载均衡,也就是再网络层利用ip地址进行地址转发
下面四台HAProxy进行七层负载,也就是根据用户的HTTP请求头来进行负载均衡,如根据URL来请求转发到特定机器或者根据用户Cookie信息访问指定机器
操作系统负载均衡
利用软中断,或硬件中的中断来达到负载均衡