深入分析Java Web技术内幕 笔记4

来源:互联网 发布:在线客服聊天软件 编辑:程序博客网 时间:2024/05/21 15:00

1. B/S网络架构概述

   当一个用户在浏览器里输入www.csdn.net这个URL时,将会发生很多操作。首先,它会请求DNS把这个域名解析成对应的IP地址,然后根据这个IP地址在互联网上找到对应的服务器,想这个服务器发起一个get请求,由这个服务器决定返回默认的数据资源给访问的用户。在服务器端实际上还有很多复杂的业务逻辑;服务器可能有很多台,到底指定哪台服务器来处理请求,这需要一个负载均衡设备来平均分配所有用户的请求;还有请求的数据是存储在分布式缓存里还是一个静态文件中,或是在数据库里;当数据返回浏览器时,浏览器解析数据发现还有一些静态资源(如CSS、JS或者图片)时又会发起另外的HTTP请求,而这些请求很可能会在CDN上,那么CDN服务器又会处理这个用户的请求,大体上一个用户请求会涉及这么的的操作。每一个细节都会影响这个请求最终是否能取得成功。

2. CDN工作机制

  CDN也就是内容分布网络(Content Delivery Network),它是构筑在现有Internet上的一种先进的流量分配网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的相应速度。有别于镜像,它比镜像更智能,可以做这样一个比喻:CDN = 镜像(Mirror)+缓存(Cache)+整体负载均衡(GSLB)。 因此,CDN可以明显提高Internet中信息流动的效率。

    目前CDN都以缓存网站中的静态数据为主,如CSS、JS、图片和静态页面等数据。用户在从主站服务器请求到动态内容后,再从CDN上下载这些静态数据,从而加速网页数据内容的下载速度,如淘宝有90%以上的数据都是由CDN来提供的。

3.负载均衡

    负载均衡(Load Balance)就是对工作任务进行平衡、分摊到多个操作单元上执行,如图片服务器、应用服务器等,共同完成工作任务。它可以提高服务器响应速度及利用效率,避免软件或者硬件模块出现单带你失效,解决网络拥塞问题,实现地理位置无关性,为用户提供较一致的访问质量。

    通常有三种负载均衡架构,分别是链路负载均衡、集群负载均衡和操作系统负载均衡。所谓链路负载均衡就是通过DNS解析成不同的IP,然后用户根据这个IP来访问不同的目标服务器。

4.Java Socket的工作机制

   主机A的应用程序要能和主机B的应用程序通信,必须通过Socket建立连接,而建立Socket连接必须由底层TCP/IP来建立TCP连接。 建立TCP连接需要底层IP来寻址网络中的主机。我们知道网络层使用的IP可以帮助我们根据IP地址来找到目标主机,但是在一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过TCP或UDP的地址也就是端口号来指定。这样就可以通过一个Socket实例来唯一代表一个主机上的应用程序的通信链路了。

5. 网络I/O优化

  通常有如下一些基本原则:

减少网络交互的次数。

减少网络传输数据量的大小。

尽量减少编码。

根据应用场景设计合适的交互方式。所谓的交互场景主要包括同步与异步、阻塞与非阻塞方式:

(1)同步与异步

    所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能完成,这是一种可靠的任务序列。要成功都成功,要失败都失败,两个任务的状态可以保持一致。而异步不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。 可以用打电话和发短信来很好的比喻同步与异步操作。

   在涉及I/O处理时通常都会遇到是同步还是异步的处理方式的选择问题,因为同步与异步的I/O处理方式对调用者的影响很大,在数据库产品中都会遇到这个问题,因为I/O 操作通常是一个非常耗时的操作,在一个任务序列中 I/O 通常都是性能瓶颈。但是同步与异步的处理方式对程序的可靠性影响非常大,同步能够保证程序的可靠性,而异步可以提升程序的性能,必须在可靠性和性能之间保持平衡,却没有完美的解决办法。

(2)阻塞与非阻塞

     阻塞与非阻塞主要是从CPU的消耗上来说的,阻塞就是CPU停下来等待一个慢的操作完成以后,CPU才接着完成其他工作。非阻塞就是在这个慢的操作执行时,CPU去做其他工作,等这个慢的操作完成时,CPU再接着完成后续的操作。虽然从表面上看非阻塞的方式可以明显地提高CPU的利用率,但是也带来另外一种后果,就是系统的线程切换增加。增加的CPU使用时间能不能补偿系统的切换成本需要好好评估。

6. Servlet 如何工作

 用户从浏览器向服务器发起的一个请求通常会包含以下信息: http://hostname: port/contextpath/servletpath, hostname 和 port用来与服务器建立TCP连接,后面的URL才用来选择在服务器中哪个子容器服务用户的请求。 服务器是如何根据这个URL 来到达正确的Servlet 容器中的呢? Tomcat 7是利用org.apache.tomcat.util.http.mapper这个类实现的,它保存了Tomcat的Container容器中的所有子容器的信息, org.apache.catalina.connector.Request 类在进入Container容器之前,Mapper将会根据这次请求的hostname 和 contextpath将host 和 context 容器设置到Request的mappingData属性中。  所以当Request进入Container 容器之前,对于它要访问哪个子容器就已经确定了。


  Servlet能够帮我们完成所有的工作,但是现在的Web应用很少直接将交互的全部页面用Servlet来实现,而是采用更加高效的MVC 框架来实现。 这些MVC框架的基本原理是将所有的请求都映射到一个Servlet,然后去实现service 方法,这个方法也就是MVC框架的入口。

7. Session与Cookie的作用都是为了保持访问用户与后端服务器的交换状态。 它们有各自的优点,也有各自的缺点,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的。 例如,使用Cookie来传递信息时,随着Cookie个数的增多和访问量的增加,它占用的网络带宽也很大,试想假如Cookie占用200个字节,如果一天的PV 有几亿,那么它要占用多少带宽? 所以有大访问量时希望用Session,但是Session的致命弱点是不容易在多台服务器之间共享,这也限制了Session的使用。

8. Spring的骨骼架构和设计理念

    在Spring框架中的核心组件只有三个: Core、Context和Bean。 它们构建起了整个Spring骨骼架构,没有它们就不可能有AOP、Web等上层的特性功能。

    其实Spring 就是面向Bean的编程,Bean在Spring中才是真正的主角。

    Bean在Spring 中的作用就像Object 对OOP的意义一样,没有对象的概念就没有面向对象的编程,在Spring中没有Bean 也就没有Spring存在的意义。  Spring之所以流行,是因为Spring解决了一个非常关键的问题,它可以让你把对象之间的依赖关系转而用配置文件来管理, 也就是它的依赖注入机制。 而这个注入关系在一个叫做Ioc 的容器中管理。

 Bean包装的是Object,而Object必然有数据,如何给这些数据提供生存环境就是Context 要解决的问题, 对Context 来说它就是要发现每个Bean之间的关系, 为它们建立这种关系并且维护好这种关系。 所以Context就是一个Bean关系的集合, 这个关系集合又叫Ioc容器,一旦建立起这个 Ioc 容器,Spring就可以为你工作了。 Core组件又有什么用武之地呢? 其实Core就是发现、建立和维护每个Bean之间的关系所需要的一系列工具,从这个角度来看,把Core组件叫做Util 更能让人理解。

9. Velocity工作原理解析

  在MVC开发模式下,View离不开模板引擎, 在Java语言中模板引擎使用最多的是JSP、Velocity和FreeMarker。 在MVC编程开发模式中,比不可少的一部分就是V部分。 V负责前端的页面展示,也就是负责生产最终的HTML, 它通常会对应一个编码引擎,当前众多的MVC框架都已经可以将V部分独立开来,可以与众多的模板引擎集成。 

0 0
原创粉丝点击