1.1.1 应用系统的发展史
早期应用软件系统大都采用C/S(客户机/服务器模式)结构,C/S结构的软件分为客户机和服务器两层。客户机不是毫无运算能力的输入/输出设备,在客户端需要部署大量的应用程序,而且可能还具有一定的数据存储能力。
C/S结构应用的服务器端通常主要安装数据库管理系统,当然也可能包含一些业务逻辑实现(这些业务逻辑实现通常以函数、存储过程和触发器的形式存在)。通过把软件系统的计算和数据合理地分配在客户机和服务器两端,可以有效地降低网络通信量和服务器运算量。
C/S结构应用的结构图如图1.1所示。
图1.1 C/S结构应用
对于 C/S 结构的应用而言,因为可以直接在客户端部署应用程序,所以可以让应用的人机交互界面更加友好,并可充分美化应用程序的人机界面。但由于服务器连接个数和数据通信量的限制,这种结构的软件适用于用户数目不多的局域网内。早期的大部分ERP软件产品即属于此类结构。
随着 Internet 技术的兴起,B/S(浏览器/服务器模式)结构得到了大规模应用。B/S 结构是对 C/S 结构的一种改进。在这种结构下,应用的业务逻辑完全在应用服务器端实现,用户表现完全在Web 服务器上实现,客户端只需要浏览器即可进行业务处理,是一种全新的软件系统结构技术。这种结构是当今应用软件的首选体系结构。
在这种应用结构下,客户端的所有处理请求都以HTTP请求形式发送,而服务器端则将响应以HTML页面的形式送回客户端,由客户端浏览器负责显示HTML页面。B/S结构应用的结构图如图1.2所示。
图1.2 B/S结构的应用
B/S结构得到迅速推广是有原因的。在大部分情况下,B/S结构的应用比C/S结构的应用更加优秀,适应性更广。相对而言,B/S结构的系统有如下方面的优势:
数据安全性高。由于C/S结构软件的数据分布特性,客户端所发生的火灾、地震、盗抢、病毒、黑客攻击等都成了可怕的数据杀手。另外,对于集团级的异地软件应用, C/S 结构的软件必须在各地安装多台服务器,并在多台服务器之间进行数据同步。因此,每个数据点上的数据安全都会影响到整个应用的数据安全。对于跨区域的大型应用而言,C/S 结构软件的安全性是令人无法接受的。而对 B/S 结构的系统而言,数据集中存放于总部的数据库服务器(服务器数据可以通过多种方式备份存放),客户端不保存任何业务数据和数据库持久化信息,无须进行数据同步,所以这些安全问题自然也就不存在了。
数据一致性好。在C/S结构的解决方案里,对于跨区域的大型企业应用都采用各地安装区域级服务器,然后再进行数据同步的模式。这些服务器每天必须同步完毕之后,总部才可得到最终的数据。由于局部网络故障等原因,可能造成个别数据库无法正常同步。即使都能正常同步,但各服务器往往不能同时同步,因而数据也无法绝对一致,不能用于决策。而对于B/S结构的系统而言,数据是集中存放的,客户端发生的每次数据修改都直接进入到中央数据库,不存在数据一致性的问题。
数据实时性好。对于大型的跨区域应用而言,C/S 结构不可能随时跟踪各客户端的业务发生情况,因为数据都不是实时更新的,因而看到的数据都是滞后的;而B/S结构则不同,因为其数据都是实时存入服务器端的数据库,因而服务器端可以实时看到当前发生的所有业务,能提供更好的企业决策支持。
系统更新方便。软件供应商提供的软件不可能是完美无缺的。即使是一个绝对完美的软件系统,当具体的业务环境发生改变后,系统也应随之改变。因而,必须经常对已部署的软件产品进行维护、升级。对C/S结构的软件而言,由于其应用是分布的,需要对每一个节点手动进行程序安装,所以,即使非常小的程序缺陷都需要很长的时间来重新部署。重新部署时,为了保证各程序版本的一致性,必须暂停业务进行更新(即“休克更新”)。在很多情景下,这是不可忍受的。而B/S结构的软件则不同,其应用程序集中于服务器上,各应用节点没有任何程序,应用的更新只需要更新服务器端程序即可,因而可以做到快速的服务响应。
传统的C/S结构软件开发工具有早期的Visual Basic、Visual FoxPro等,这些开发工具目前已经趋于淘汰。目前依然使用的开发工具有PowerBuilder、Delphi等。除早期的一些系统外,现在新开发的系统大部分使用B/S结构。
B/S结构的应用开发早期有ASP、JSP和PHP等。早期这些B/S结构开发技术相当混乱,系统中业务逻辑、数据持久化、控制逻辑混在一起,这些处理逻辑都通过页面的脚本实现。早期的B/S结构应用面临着后期维护困难、难以扩充的问题。
MVC设计模式重新定义了B/S结构应用的开发模式,规定B/S结构应用应该分成Model (M:模型)、View(V:视图)和 Controller(C:控制器)三个部分。MVC 模式分离的数据访问和数据表现,给系统提供了更好的解耦。MVC架构的核心思想是,将程序分成相对独立而又能协同工作的三个部分。通过使用MVC架构,可以降低模块之间的耦合,提供应用的可扩展性。MVC中的每个组件只关心组件内的逻辑,不应与其他组件的逻辑混合。
Java EE的出现,则更加规范了B/S结构应用的开发。Java EE推荐将应用分为数据持久层、业务逻辑层和Web层,各层之间以松耦合的方式组织在一起。
目前,Ajax的出现,再次完善了传统的Web应用。Ajax应用强调异步发送用户请求:用户在浏览页面的同时可以发送请求,在第一个请求的服务器响应还没有完全结束时,可以再次发送请求。这种请求的发送方式非常类似于传统的C/S结构的应用。
在传统的Web 应用里,因为用户总是需要加载新页面时才提交请求,而提交请求后又需要等待服务器响应,所以如果服务器响应还没有完全结束,则用户只能等待,不能继续发送请求。
与传统Web应用不同的是,Ajax将请求与页面分离:在传统的Web应用里,每个请求即对应一个页面,不管客户端以POST还是GET方式提交请求,每次请求都会丢弃当前页面,等待服务器生成新页面。在等待期间,旧的页面已经丢弃,新的页面还没有完全生成,整个浏览器将一片空白,而用户什么都做不了,只能等待,对于用户而言,这是一种不连续的体验,感觉非常不好。