1.3 Web应用程序架构
目前流行的应用软件架构模式有两种:客户机/服务器(client/server, C/S)模式和浏览器/服务器(brower/server, B/S)模式。在客户机/服务器模式中,服务器通常采用高性能的计算机、工作站或小型机,客户端需要安装专用的客户端软件,如图1-1所示。在浏览器/服务器模式中,客户端只要安装一个浏览器,通过浏览器与Web服务器进行数据交互,如图1-2所示。Web应用程序则属于B/S结构的软件系统。
图1-1 客户机/服务器模式
图1-2 浏览器/服务器模式
1.3.1 客户机/服务器模式
客户机/服务器(C/S)架构的发展过程经历了两层C/S架构、三层C/S架构以及多层C/S架构的演变。
两层的C/S架构是由客户端和后台数据库组成。数据库用于存放数据,并且使用数据库编程语言编写业务逻辑,客户端则采用VB、VC、Delphi这样的可视化编程语言,以便捷地开发客户端的应用程序。用户通过界面向服务器发送请求,服务器发回的数据则通过界面进行显示,服务器的角色就由数据库来充当。这样做的好处就是开发效率高,能满足企业需求。但是这种架构存在着很大的弊端,第一是可移植性差,如当数据库从SQL Server更换为Oracle时就必须将业务逻辑用新的语言重新编写一遍;第二则是大型系统做不了,因为客户端与数据库需要建立持续的连接,而数据库能够支持的最大连接数是有限制的。
2000年之后,三层C/S架构慢慢开始流行。三层的C/S架构指的是客户端+应用服务器+数据库,即将混合在数据库端的业务逻辑从中分离出来,放入应用服务器,数据库只负责数据的管理、存储及检索。客户端负责界面。三层之中的应用服务器其实也是程序,任何支持TCP编程的语言都可以作为应用服务器。用户通过图形用户界面(GUI)进行操作,然后调用客户端的通信模块。通信模块依据自定义协议将请求数据打包,通过网络发送该请求,到达应用服务器时,应用服务器同样也有一个通信模块,将收到的数据包按照协议进行拆包,调用相应的业务处理模块处理数据。其中可能需要访问数据库来完成数据的获取,将处理完的结果再次发送给通信模块。通信模块将结果按照自定义协议进行打包,然后将数据包发送给客户端的通信模块,客户端进行拆包获取响应数据,将结果显示在界面上,更新界面上的数据显示。三层C/S架构虽然在一定程度上降低了对数据库编程的依赖,并且能够适应大型的应用程序,但数据通信模块的增加却加大了开发的难度以及整体架构的复杂度。
· 优点
①能充分发挥客户端计算机的处理能力,很多工作可以在客户端处理后再提交给服务器,所以C/S客户端响应速度快;②操作界面漂亮、形式多样,可以充分满足客户自身的个性化要求;③C/S结构的管理信息系统具有较强的事务处理能力,能实现复杂的业务流程;④安全性有保证,C/S一般面向相对固定的用户群,程序更加注重流程,它可以对权限进行多层次校验,提供了更安全的存取模式,对信息安全的控制能力很强。一般高度机密的信息系统宜采用C/S结构。
· 缺点
①需要专门的客户端安装程序,分布功能弱,针对点多面广且不具备网络条件的用户群体,不能够实现快速部署安装和配置;②兼容性差,对于不同的开发工具,具有较大的局限性;③若采用不同工具,需要重新改写程序;④开发、维护成本较高,需要具有一定专业水准的技术人员才能完成,发生一次升级,则所有客户端的程序都需要改变;⑤用户群固定,由于程序需要安装才可使用,因此不适合面向一些不可知的用户,所以适用面窄,通常用于局域网。
1.3.2 超文本传输协议
超文本传输协议(hyper text transfer protocol, HTTP),是TCP/IP协议的一个应用层协议。客户端通过HTTP协议向服务器端发送的数据,称为请求消息(request),反之则为响应消息(response)。HTTP是一种无连接的协议。无连接是指Web浏览器与Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应,连接就被关闭了,在服务器端不保留连接的有关信息。也就是说,HTTP请求只能由客户端发起,而服务器不能主动向客户端发送数据。
· HTTP请求
HTTP请求信息由4部分组成:
(1)请求行:请求方法(GET/POST)、URI、协议/版本。
(2)请求消息头。
(3)空行。
(4)请求正文。
· HTTP响应
HTTP应答与HTTP请求相似,HTTP响应也由3个部分构成,分别是:
(1)状态行。
(2)响应头。
(3)响应正文。
· HTTP状态码
当用户访问一个网页时,浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。我们常见的状态码有五种:
1xx:信息提示,表示请求已被成功接收,继续处理。
2xx:请求被成功提交。
3xx:客户端被重定向到其他资源。
4xx:客户端错误状态码,格式错误或者不存在资源。
5xx:描述服务器内部错误。
下面列举几种常见的状态码含义,如表1-1所示。在后面的程序开发中,我们会经常见到它们。
表1-1 HTTP状态码含义
1.3.3 浏览器/服务器模式
为了降低三层C/S架构中与通信有关的复杂度,浏览器/服务器(B/S)架构成为网络程序中的一种流行架构。在B/S架构中,客户端使用HTTP协议进行数据打包拆包的程序是各厂商依据标准开发的浏览器,Web服务器也是基于HTTP协议由一些厂商提供,如IIS、Apache等。在B/S架构中,由于协议已被限定,所以与通信有关的数据打包拆包的过程都不用我们开发人员来编写程序,只需要考虑怎么将HTTP协议解析出来的数据进行业务处理,以及根据不同的结果产生响应。这大大降低了网络程序的开发难度,所以这种架构得到了大量的应用。
· 优点
①开发简单,共享性强;②分布性强,客户端零维护;③只要有网络和浏览器,就可以随时随地进行查询、浏览等业务处理;④业务扩展简单方便,通过增加网页即可增加服务器功能;⑤维护简单方便,只需要改变网页,即可实现所有用户的同步更新。
· 缺点
①个性化特点明显降低,无法实现具有个性化的功能要求;②在跨浏览器上,B/S架构不尽如人意;③客户端与服务器端的交互是请求-响应模式,通常动态刷新页面,响应速度明显降低(Ajax可以在一定程度上解决这个问题); ④无法实现分页显示,给数据库访问造成较大的压力;⑤在速度和安全性上需要花费巨大的设计成本。
1.3.4 动态Web应用访问过程
所谓动态Web,是指网页数据是由程序产生的,不同时间点、不同地点、不同人访问同一个URL看到的内容和界面可能不一样,且网页具有交互性,内容可以动态更新。在动态Web中,客户端使用浏览器(IE、Chrome等),通过网络连接到服务器上,使用HTTP协议发起请求。所有请求都先经过服务器插件(web server plugin)来处理,此插件用于区分所请求的是静态资源还是动态资源,如图1-3所示。
图1-3 Web应用程序访问过程
如果服务器插件发现客户端请求的是静态资源,比如.htm或者是.html,则将请求直接转交给Web服务器。Web服务器从文件系统中取出内容,发送回客户端浏览器进行解析执行。
如果服务器插件发现客户端请求的是动态资源,比如JSP、ASP/ASPX、PHP,则先将请求转交给Web容器,通过Web容器连接数据库,再从数据库中取出数据,动态拼凑页面的展示内容;最后,把所有的展示内容交给Web服务器,通过Web服务器将内容发送回客户端浏览器进行解析执行。