架构 web请求过程,DNS, CDN

from: https://blog.csdn.net/diandian4014/article/details/79849559

看深入分析javaweb技术内幕,做个摘抄总结

B/S(Browser/Server)网络架构,基于统一的应用层协议HTTP来交互数据,HTTP采用无状态的短连接的通信方式,通常情况下,一次请求就完成了一次数据交互,也对应一个业务逻辑。然后连接就断开了。这种情况下,相比长链接,服务器能够同时服务更多的用户。

B/S架构大多要求满足海量用户的访问请求,同时保持用户请求的快速响应。

请求流程如下:

1,用户浏览器输入URL,www.xx.com。 
2,浏览器请求DNS把这个URL的域名部分(www.xx.com)解析成对应的IP。 
3,浏览器通过ip去寻找对应的服务器地址,向服务器发起一个get请求。 
4,这时的服务器地址,可能是一个负载均衡设备,负责平均分配所有用户的请求,指定真实处理请求的服务器,比如Tomcat/Jetty/JBoos服务器。 
5,Tomcat/Jetty/JBoos服务器收到请求后,会对请求需要的数据类型进行判断,是存储在分布式缓存(比如redis)里,还是静态文件(文件系统)中,还是数据库中,去获取对应的数据后,把处理好的数据返回给浏览器。 
6,浏览器接收到数据,并且解析,解析数据的时候可能会发现,还需要一些静态资源,(如CSS,JS或者图片),于是又再次发起HTTP请求,重复3-4的过程。 
7,服务器这时候把请求通过反向代理,交由CDN去完成静态资源的请求。 
8,浏览器接收并缓存静态资源。

HTTP解析

常见的HTTP请求头

请求头说明
Accept-Charset用于指定客户端接受的字符集
Accept-Encoding用于指定可接受的内容编码,如Accept-Encoding:gzip.deflate
Accept-Language用于指定一种自然语言,如 Accept-Language:zh-cn
Host用于指定被请求资源的Internet主机和端口号,如Host:www.taobao.com
User-Agent客户端将它的操作系统,浏览器和其他属性告诉服务器
Connection当前连接是否保持,如Connection:Keep-Alive

常见的HTTP响应头

响应头说明
Server使用的服务器名称,如Server:Apache/1.3.6(Unix)
Content-Type用来指明发送给接受者的实体正文的媒体类型,如Content-Type:text/html;charset=GBK
Content-Encoding与请求头Accept-Encoding相对应,告诉浏览器服务器采用的是什么压缩编码
Content-Language描述了资源所用的自然语言,与Accept-Language相对应
Content-Length指明实体正文的长度,用以字节方式存储的十进制数字来表示
Keep-Alive保持连接的时间,如Keep-Alive:timeout=5,max=120

常见的HTTP状态码

状态码说明
200客户端请求成功
302临时跳转,跳转的地址通过Location指定
400客户端请求有语法错误,不能被服务器识别
403服务器收到请求,但是拒绝提供服务
404请求的资源不存在
500服务器发生不可预期的错误

浏览器缓存机制

CTRL+F5刷新的页面一定是最新的,因为是直接向目标URL发送请求,而不是用浏览器的缓存数据;并且会在HTTP请求头中增加额外的请求头 
来告诉服务端我们要获取的是最新的数据而不是缓存,比如请求头Pragam:no-cache 和 Cache-Control:no-cache。

1,Pragam 和 Cache-Control的可选字段列表:

可选值说明
Public所有的内容都将被缓存,在响应头中设置
Private内容只缓存到私有缓存中,在响应头中设置
no-cache所有内容都不会被缓存,在请求头和响应头中设置
no-store所有内容都不会被缓存到缓存或Internet临时文件中,在响应头中设置
must-revalidation/proxy-revalidation如果缓存内容失效,请求必须发送到服务器/代理以进行重新验证,在请求头中设置
max-age=xxx缓存的内容将在xxx秒后失效,这个选项只在Http1.1中可用,和Last-Modified一起使用时优先级较高,在响应头中设置

Cache-Control的优先级比较高,如果Cache-Control和其他的一些请求字段(比如Expires)同时出现,Cache-Control会覆盖其他字段。

2,Expires请求字段: 
通常格式是 Expires:Sat,25 Feb 2012 12:22:17 GMT, 浏览器在发送请求之前检查这个页面的字段,看该页面是否已经过期了,如果过期,就向服务端重新发起请求。

3,Last-Modified字段一般用于表示一个服务器上的资源的最后修改时间,如果是静态内容会自动加上Last-Modified字段,如果是动态内容,比如Servlet提供了getLastModified方法用来检查某个动态内容是否已经更新。通过这个最后修改时间可以判断当前请求的资源是否是最新的。 
具体步骤: 
服务端在响应头中返回一个Last-Modified字段 Last-Modified:Sat,25 Feb 2012 12:22:17 GMT, 浏览器在再次请求的时候,在请求头中真假一个 If-Modified-Since::Sat,25 Feb 2012 12:22:17 GMT字段,询问当前缓存的页面是否是最新的,如果是就返回304状态码,服务器就不会传输新的数据给浏览器。

4,Etag字段,与Last-Modified字段类型,这个字段作用是让服务端给每个页面分配一个唯一的编号,然后通过编号来区分当前的页面是否是最新的,这个方式比Last-Modified灵活,但是在分布式的情况下,后端有多台web服务器,就比较难以处理了,因为需要每台服务器都记住所有资源的编号

DNS域名解析过程 #87

DNS负责把域名解析成ip

名词解释:TTL值全称是“生存时间(Time To Live)”,简单的说它表示DNS记录在DNS服务器上缓存时间。

1,浏览器检查缓存中有没有域名对应的ip地址,有,解析结束; 没有,进入下一步; 浏览器缓存域名是有缓存大小,缓存时间限制的,缓存时间通常设定在几分钟到几小时不等,时间太短请求频繁,时间太长不利于及时更新可能导致用户无法访问。可以通过TTL属性来设置

2,浏览器查找操作系统中是否有这个域名对应的DNS解析结果。有,解析结束;没有,进入下一步;系统盘中的hosts文件就是设置域名:ip映射关系的位置之一 c:\windows\system32\drivers\etc\hosts,很容易被黑客劫持。

3,操作系统把域名发送给本地域名服务器Local DNS),这个域名服务器一般是应用提供商(ISP,比如电信\联通\移动)提供的,通常服务器在用户所在城市的某个角落,或者校园网的DNS服务器就在学校范围内,总之不会太远。通常80%的域名解析到这里就能结束了。Local DNS承担了主要的域名解析工作。 
Windows环境下通过命令行输入ipconfig,Linux环境下通过cat /etc/resolv.conf就可以查询配置的DNS服务器了,这个专门的域名解析服务器性能都会很好,它们一般都会缓存域名解析结果,当然缓存时间是受到域名的失效时间控制的。

4,LDNS仍然没有命中,就直接到Root Server域名服务器根域名服务器)请求解析。根域名服务器返回给本地域名服务器一个所查询的主域名服务器(gTLD Server)地址。gTLD是国际顶级域名服务器,如.com、.cn、.org等。

5、本地域名服务器(Local DNS)向gTLD服务器发送请求, 接受请求的gTLD服务器查找并返回此域名对应的域名服务器(Name Server)的地址;通常就是用户申请/注册域名时候,对应的那个域名服务器提供商的服务器。

8、LDNS查询域名服务器(Name Server),域名服务器会查询存储的域名和IP的映射关系表,在正常情况下都根据域名得到目标IP地址,连同一个TTL值返回给DNS

9、LDNS得到该域名对应的IP和TTL值,LDNS会缓存这个域名和IP的对应关系,缓存时间由TTL值控制

10、LDNS把解析的结果返回给浏览器,浏览器根据TTL值缓存在本地系统缓存中,域名解析过程结束。

在实际的DNS解析过程中,可能还不止这10步,如Name Server可能有很多级,或者有一个GTM来负载均衡控制,这都有可能会影响域名解析过程。

刷新域名缓存:清除,刷新缓存 
在windows: “ipconfig/flushdns” 
在linux下通过 /etc/init.d/nscd restart

JAVA中 
Java应用中,JVM也会缓存DNS的解析结果, 这个缓存是在InetAddress类中完成的, 
有两种缓存策略 
1,正确解析结果缓存,配置项为 networkaddress.cache.ttl 默认值是-1(永不失效) 
2,失败解析结果缓存,配置项为 networkaddress.cache.negative.ttl 默认值是10(缓存10秒) 
在lib/security/java.security文件中,在java启动参数中增加-Dsum.net.inetaddr.ttl=xxx均可配置,也可以通过InetAddress类动态修改。 
InetAddress必须用单例模式,因为初始化需要进行一次完整的域名解析,非常耗时。

域名解析记录 
A记录:A代表的是Address,用来制定域名对应的ip地址, A记录可以将多个域名解析到一个ip地址,但是不能将一个域名解析到多个ip地址。 
MX记录:Mail Exchange,可以将某个域名下的邮件服务器指向自己的Mail Server。 比如www.taobao.com可能指向115.238.25.111的A纪录地址,而xxx@taobao.com就会指向配置的MX记录地址,DNS会把xxx@taobao.com地址发送到MX记录所记录的ip. 
CNAME记录:全称是Canonical Name(别名解析),就是可以为域名设置一个或多个的别名,输入别名,在浏览器输入别名,DNS帮我们找到真正的域名。 
NS记录:(Name Server)记录,用来指定该域名由哪个DNS服务器进行解析 
TXT记录:为某个主机名或者域名设置说明用的,没软用,类似注释或者说明文件

CDN工作机制

CDN:内容分布网络(Content Delivery Network),是一种构筑在现有Internet上的一种先进的流量分配网络。目的是在现有系统之上,增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。 
目前CDN都以缓存网站中的静态数据为主,如CSS,JS,图片和静态页面等数据。 
用户从主站服务器请求到动态内容后(相对距离远),再从CDN上下载这些静态数据(距离近),从而加速网页数据的内容下载速度。

CDN需要达到的目标: 
可扩展性;安全性;可靠性,响应和执行

流程: 
1,用户访问某个静态文件,首先向Local DNS服务器发起请求,经过一系列解析后,得到域名对应的注册服务器,交由Name Server去进行解析,返回域名对应的ip地址 
2,Local DNS去ip地址上请求, 地址上的服务器是一个内部的域名服务器,把请求的域名解析后,会通过别名(CNAME)解析,把他解析成另外一个域名,而这个新域名最终会指向CDN服务器。 
3,CDN服务器中由进行负载均衡处理,并根据GTM(应该是时区地区相关)来确实是哪个地方的访问用户,返回距离最近的CDN节点(服务器)给用户。 
4,用户到这个距离最近的CDN节点上去获取数据。

负载均衡 
Load Balance, 对工作任务进行平衡,分桶到多个操作单元上执行。 
可以提高服务器响应速度以及利用效率,避免软件出现单点失效,解决网络拥塞问题,实现地理位置无关系,为用户提供较一致的访问质量

通常有三种负载均衡架构: 
链路负载均衡:DNS解析不同的ip,用户根据ip访问不同的目标服务器 
集群负载均衡:分为硬件负载均衡和软件负载均衡,硬件负载均衡就是一个很贵的硬件来负责所有的转发,一般是一主一备,不可扩容,价格昂贵,性能好;软件负载均衡就是普通pc大件,成本低,访问要经过多次代理服务器,会增加网络延时; 
操作系统负载均衡:利用操作系统级别的软中断或者硬件中断来达到负载均衡,如可以设置多队列网卡等来实现。(个人理解是系统级别的线程挂起设置,来切换不同核之间的任务,保证cpu的使用率和占用率均衡。不会有哪个任务执行特别久都不带停)

软中断是执行中断指令产生的,而硬中断是由外设引发的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值