看深入分析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的使用率和占用率均衡。不会有哪个任务执行特别久都不带停)
软中断是执行中断指令产生的,而硬中断是由外设引发的。