B/S网络架构概述
基于同一应用层协议HTTP来交互数据,与大多数C/S互联网应用程序采用的长连接的交互模式不同,HTTP协议采用无状态的短连接的通信方式,一次请求就完成来一次数据交互,通常也对应一个业务逻辑,然后这次通信就断开了。采用这种方式能服务更多的用户。
当一个用户在浏览器中输入www.baidu.com会发生哪些操作,首先它会请求DNS对域名解析成对应的ip地址,然后根据这个ip地址在互联网上找到对应的服务器,向这个服务器发送一个get请求,由这个服务器决定返回默认的数据资源给访问的用户。在服务器端可能还有更复杂的业务逻辑:服务器可能会有多台,到底指定哪台服务器来处理请求,这需要一个负载均衡设备来平均分配所有用户请求;还有请求的数据是存储在分布式缓存里还是一个静态文件中,或者是数据库;当数据返回浏览器时,浏览器解析数据发现还有一些静态资源(如css、js或者是图片)时又会发起另外的HTTP请求,而这些请求很可能会在CDN上,那么CDN服务器又会处理用户的请求,大体上一个用户请求会涉及这么多操作。
不管网络架构如何变化,但是始终有一些固定不变的原则需要遵守。
互联网上的资源都要用一个URL表示。URL就是统一资源定位符,且世界上独一无二。
必须基于HTTP协议与服务器交互。
数据展示必须在浏览器中进行。
HTTP协议解析
浏览器缓存机制
思考下:Ctrl+F5刷新页面,就一定能够请求到没有缓存的页面?
请求时从服务端返回数据,最重要的是在请求头中增加了两个请求项:
pragma: no-cache和cache-control: no-cache。
1.Cache-control/Pragma
这个HTTP Head字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令,不仅可以控制浏览器,还可以控制和HTTP协议相关的缓存或代理服务器。
Cache-control和其他一些请求字段(如Expires)同时出现时,.Cache-control会覆盖其他字段。
Pragma字段的作用和Cache-control有点类似,它也是在HTTP头中包含一个特殊的指令,使相关的服务器来遵守。
2.Expires
Expires通常的使用格式是Expires:Sat,25 Fed 2012 12:22:17 GMT,后面跟一个日期和时间,超过这个时间值后缓存的内容失效,也就是浏览器在发出请求之前先检查这个页面的这个字段,看该页面是否缓存已经过期了,过期了就重新向服务器发起请求.
3.Last-Modified/Etag
Last-Modified字段一般表示一个服务器上的资源的最后修改时间,资源可以是静态(静态内容自动加上Last-Modified字段)或者动态的内容(如Servlet提供了一个getLast-Modified方法用于检查某个动态内容是否已经更新),通过这个最后修改时间可以判断当前请求的字段是否是最新的。
Etag作用是让服务端给每个页面分配唯一的编号,通过这个编号区分是否是最新。
DNS域名解析过程
当用户在浏览器中输入www.abc.com时,DNS解析会有将近10个步骤。
1.浏览器会检查缓存中有没有这个域名对应的解析过的ip地址,如果缓存中有,这个解析过程就将结束。浏览器缓存域名是有限制的,不仅缓存大小限制,时间也有限制,通常下几分钟到几小时不等,域名的缓存时间限制可以通过TTL属性来设置。这个时间太长太短都不好,一旦域名被解析到的ip有变化,会导致无法解析出ip,如果太短会导致每次访问网站都要重新解析一次域名。
2.如果缓存中没有,浏览器会查找操作系统中是否有这个域名对应的DNS解析结果。在C:\Windows\System32\drivers\etc\hosts文件来设置,在linux中对应的是/etc/named.conf,缓存的时间同样受到回这个域名的失效时间和缓存的空间大小控制的。
前面两步都是在本机中完成。
3.在网络配置中都会有DNS服务器地址,前面两步无法解析时,操作系统会把这个域名发送给LDNS,也就是本地区的域名服务器。windows通过ipconfig查询这个地址。 linux中通过 cat /etc/resolv.conf查看.缓存时间受域名失效时间控制的。
4.如果LDNS仍然没有命中,就直接到Root Server域名服务器请求解析.
5.根据域名服务器返回给本地域名服务器一个所查询的主域名服务器(gTLDServer)地址。gTLD是国际顶级域名服务器,如.com、.cn、.org等,全球只有13台左右。
6.本地域名服务器(Local DNS Server)再向上一步返回的gTLD服务器发送请求。
7.接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是你注册的域名服务器。
8.Name Server域名服务器会查询存储的域名和ip的映射关系表,正常情况下都根据域名得到目标ip记录,连同一个TTL值返回给DNS Server域名服务器。
9.返回该域名对应的ip和TTL值,Local DNS Server会缓存这个域名和IP的对应关系,缓存时间由TTL值控制。
10.把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束。
清除缓存的域名
DNS域名解析后会缓存解析结果,其中主要在两个地方,一个是Local DNS Server,另一个是用户本地机器。缓存时间基本由TTL控制的,可以通过ipconfig /flushdns ,linux下可以使用 /etc/init.d/nscd restart 来清除缓存。重启依然是解决很多问题的第一选择。
在java应用中JVM也会缓存DNS的解析结果,这个缓存是在InetAddress类中完成的,缓存时间配置项在%JAVA_HOME%\lib\security\java.security文件中,分别是networkaddress.cache.ttl
和networkaddress.chache.negative.ttl ,它们默认值分别是-1(永不失效)和10(缓存10秒)。要修改的话直接修改java.security文件中的默认值、在java的启动参数中增加-Dsun.net.inetaddr.ttl=xxx来修改默认值、通过InetAddress来动态修改。如果用InetAddress解析域名的话一定要是在单例模式下,不然又严重的性能问题,每次创建InetAddress类每次都要域名解析,非常耗时。
CDN工作机制
CDN也就是内容分布网络(Content Delivery Network),它是构筑在现有Internet上的一种先进的流量分配网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站内容发布到最接近用户的网络“边缘”,使用户可以就地取材,提高访问网站速度。可以做这样一个比喻:CDN=镜像(Mirror)+缓存(Cache)+整体负载均衡(GSLB),目前CDN都以缓存网页中的静态数据为主。
负载均衡
负载均衡(Load Balance)就是对工作任务进行平衡、分摊到多个操作单元上执行,如图片服务器,应用服务器等,共同完成工作任务,可以提高服务器响应速度及利用效率,避免软件或者硬件模块出现单点失效,解决网络拥塞问题,实现地理位置无关性,为用户提供较一致的访问质量。
通常分为链路负载均衡、集群负载均衡和操作系统负载均衡。链路负载均衡就是通过DNS解析成不同ip,然后根据这个ip来访问不同的目标服务器,用来最终访问哪个web Server是由DNS Server来控制的,优点访问不需要经过代理服务器,速度快,缺点是DNS在用户本地和Local DNS Server都有缓存,一旦某台Web Server挂掉,那么很难及时更新用户的域名解析结构。
集群负载均衡分为硬件负载均衡和软件负载均衡,硬件负载均衡一般使用一台专门硬件设备来转发请求,价格昂贵。软件负载均衡使用最为普遍,可以使用廉价的pc搭建,一般一次访问请求要经过多次代理服务器。
操作系统负载均衡,就是利用操作系统级别的软件中断或者硬件中断来达到负载均衡,如可以设置多队列网卡等来实现。