技术总是随着时代而进步。跟随着硬件的摩尔定律的飞速发展,现在的软件和传统的软件也有了天壤之别。传统的软件由于受到硬件速度和存储空间的制约,不得不在算法上大做文章,以节省本来就少得可怜的硬件空间和有限的CPU资源,而现今的软件则不同,高速的CPU处理能力,超大容量的存储空间,使得软件在算法上的选择空间更大,当然,这里的意思并不是说,现在的软件设计不需要设计算法,而是说在设计过程中可以有更多的选择,可以同时兼顾软件的效率和其他特性(可扩展性、易用性、稳定性等)。于是,系统分层应运而生。
1.1 经典三层结构
1.1.1 经典三层结构概述
三层架构即将系统分为三层,分别是数据访问层、业务逻辑层和表示层。其中,数据访问层实现对数据库操作的封装,以隔离具体业务和数据库之间的联系;而业务逻辑层则实现对业务逻辑的封装,隔离用户操作的界面和具体业务逻辑;表示层即用户界面层,提供用户操作接口。这样分层封装的好处是分化了复杂的系统,同时也提高了系统的可维护性,也使得开发过程中的分工协作更加方便快捷。
以下是经典三层结构的简单图示:
Oracle数据库 |
Sql Server数据库 |
表示层 |
业务逻辑层 |
数据访问层 |
用户 |
从上图中可以看出,用户所能看到的只有他所操作的界面——表示层,其它各层对表示层都是隐藏实现的。这样做的好处在于,一方面提高了安全性,用户只能通过界面上的操作来进行业务,杜绝了违规操作的可能;另一方面,业务逻辑层和数据访问层的分离,在一定程度上保证了系统的可扩展性,在新增一个业务逻辑或者某个已存在的业务逻辑发生改变时,数据访问层可能不需要改变,或者在更改数据库服务器时,业务逻辑层不需要有任何改变,只要更新数据访问层即可。
1.1.2 经典三层结构的详细描述
我们来看一下三层结构中各层的描述及详细结构:
一、数据访问层
数据访问层的主要功能是提供访问不同数据库的方法的封装。该层处在系统的最底层,对上层用户隐藏实现。在业务逻辑层通过调用数据访问层的接口来完成其操作。具体静态结构图如下所示:
其具体实现过程是:首先通过DALFactory创建SQLServerDAL或OracleDAL中类的实例,并将其赋予他们的父类IDAL(接口),然后通过IDAL的类的实例来调用其相应的方法已实现复杂的业务逻辑(面向对象技术)。
二、业务逻辑层
业务逻辑层的主要功能是提供业务逻辑的封装,对其上面的表示层隐藏实现。在表示层通过调用业务逻辑层的接口来实现各操作。其静态结构图如下所示:
业务逻辑层主要依赖于数据访问工厂和数据访问层的接口。
三、表示层
表示层主要是提供用户的操作界面(用户接口),具体的业务逻辑通过调用业务逻辑层的方法实现。
1.1.3 总结
分层架构的主要优点是分化了系统的复杂度,同时也提高了系统的灵活性(这点从系统同时满足各种类型数据库即可看出),另外,分层架构大大提高,由于层次的增多,同一个了系统的可维护性和可扩展性。但是,分层架构在众多优点的背后也隐藏着缺点解决方案下项目也多,过多的跨项目访问对应用程序的效率有一定的影响,但这一点现在可以在越来越快的硬件提升速度中忽略。
1.2 简单三层结构
对于某些小型的MIS项目,如果严格按照经典三层结构来设计,则会因为层次上项目过多而导致系统繁琐,所以提出一个经典三层结构的变体——简单三层结构。
简单三层结构可以有两种表现形式,一种是系统要求数据访问的灵活性较高,而业务逻辑层和表示层却相对固定,此时可以将业务逻辑层和表示层相结合,形成一个两层的结构,即:
Orcale数据库 |
Sql Server数据库 |
表示层 业务逻辑层 |
数据访问层 |
而另一种则是系统要求业务逻辑灵活多变,而表示层却相对固定,此时可以将业务逻辑层和数据访问层相结合,而将相对固定的表示层独立出来,形成一个两层结构,即:
Orcale数据库 |
Sql Server数据库 |
表示层 |
业务逻辑层 数据访问层 |
以上是简单三层结构的两种表现形式,其实这种结构是在综合了小型信息管理系统的性能和灵活性两方面来考虑的,它可以在一定程度上满足系统灵活性的要求,也可以在一定程度上满足性能要求(就目前硬件的速度来看,软件对性能的要求会越来越低,但这并不能说明我们在开发过程中可以不去考虑性能问题,只是说在性能上可以适当放宽要求)。
1.3 三层结构的扩展——五层逻辑架构
逻辑N层架构的好处就是把所有的功能区分开,形成清晰的角色或组,是软件的架构变的更加清晰和克维护。
1.3.1 五层逻辑架构概述
这个扩展的五层逻辑架构的层次分别为:表示层、用户界面层、业务逻辑层、数据访问层、数据存储和管理层。以下将分别对这几个层次进行简单介绍。
表示层 |
用户界面层 |
业务逻辑层 |
数据访问层 |
数据存储和管理层 |
一、 表示层
为什么要将表示层和用户界面层分离开来呢?从Windows桌面应用来说,表示层和UI层是同一层,即用户能操作的图形用户界面(GUI)。但是从Web应用的角度来看,区别就比较明显了。用户所看到的界面(浏览器)只负责将信息显示给用户和采集用户输入的数据信息,而实际的操作逻辑却运行在服务器端。
二、 用户界面层
这一层的作用主要是决定用户程序的外观和解释用户输入的逻辑。在许多的应用程序中,UI代码非常复杂,它是以一种非线性的方式来响应用户的请求(控制用户如何点击控件,或者是进入或离开窗体或页面是很困难的),另外,UI层代码还必须要和业务逻辑层的逻辑互操作来验证用户的输入,并对用户的输入作必要的处理。
UI层存在的作用基本上就是接受用户的输入,然后提供给业务逻辑层,在业务逻辑层中用户的输入得到验证、处理或操作,然后UI层再把业务逻辑层所得到的结果给客户显示出来以响应用户。
三、 业务逻辑层
业务逻辑层包括所有的业务规则、数据验证、数据操作、数据处理和应用程序的安全性。它制定了企业的业务处理方式。
如果你希望所做的软件能够获得不断增加的可维护性和可重用性的好处的话,把业务逻辑层和用户界面层相分离绝对是非常关键的。因为任何延伸到UI层的业务逻辑都只存在于特定的UI当中,任何以后可能创建的UI都无法使用。
四、 数据访问层
数据访问代码是通过与数据管理层进行交互来提取、插入、更新和删除数据信息的。数据访问层并不管理和存储数据,它只是在业务逻辑和数据库之间提供一个接口。
其实,这样做的好处还有一个。大家都知道,数据访问技术的变动是很频繁的(从ODBC到DAO、OLEDB、ADO、ADO.Net等),这意味着每一次数据访问技术的变动都要重写那些数据访问的代码,如果把数据访问放到一个单独的、特定的层里,上面的改变对应用程序的冲击会降低许多。
五、 数据存储和管理层
这一层的关键在于它对所处理的数据进行物理的创建、提取、更新和删除。这和数据访问层不同,数据访问层只是对创建、提取、更新和删除数据提出请求。数据管理层实际上是在数据库中实现这些操作。
下面让我看看这五层分别扮演的角色:
层次 | 角色 |
表示层 | 负责显示和搜集用户输入 |
用户界面层 | 用户和业务逻辑之间的中间层,负责搜集用户输入并提供给业务逻辑,然后把结果返回给用户 |
业务逻辑层 | 负责提供应用程序所有的业务规则、数据验证、数据操作、数据处理和安全 |
数据访问层 | 业务逻辑和数据管理之间的中间层,封装当前主要的数据访问技术、数据库和数据结构的信息 |
数据存储和管理层 | 负责数据在一个持久的数据存储中物理的创建、提取、更新和删除 |
1.3.2 五层逻辑架构的最优性能模型
当所有的焦点都集中在分布式系统的时候,大家很容易地忘记了单层解决方案的价值。我们可以把所与的东西运行在同一台客户机上,系统部署在一个单一的物理层(客户机)上并不会对逻辑架构的分离造成伤害。如下图所示:
表示层 用户界面层 业务逻辑层 数据访问层 数据存储和管理层 |
我觉得这一点的重要性是不言而喻的:N层系统可以运行在同一台电脑上来支持需要独立环境的许多种应用程序。其实,这和两层的胖客户端的物理架构是基本上一样的,唯一的区别就是数据存储和管理层将运行在中央数据库服务器上(如Sql Server或Oracle),如下图所示:
表示层 用户界面层 业务逻辑层 数据访问层 |
数据存储和管理层 |
除了数据存储的位置不同以外,这与单层配置一模一样,而且通常从单层到两层的切换出了修改数据库设置字符串外,几乎没有什么其他要做的。
1.3.3 五层逻辑架构的高可扩展性模型
单层配置适用于独立环境,它们的高性能是毋庸置疑的(不需要考虑任何的网络延迟问题),但缺点也很明显——可扩展性能差。通常会使用两层的配置,这样可以兼顾性能和可扩展性。
进一步来看,我们可以通过将数据库访问层移到一台独立的电脑上的办法来牺牲一部份性能以换取可扩展性。如果你有超过一百个并行的用户,你就可以从使用单独的服务器来处理数据访问中获得好处。这样做的另一种好处是安全。因为数据访问层包含有直接操作数据库的代码,所以运行数据库访问层的电脑一定要有用来访问数据库服务器的用户名和密码。与其在客户机上保存这些用户名和密码,不如将它移到应用服务器上,这样用户的电脑就不需要保存访问数据库服务器的用户名和密码,提高了安全性。
另外,我们也可以将业务逻辑层移到应用服务器上,这对于非交互的业务逻辑非常有用,如批量更新或数据密集型的业务算法。然而,大多数的应用程序允许用户交互,所以又要求业务逻辑运行在客户机端,提供高级别的用户交互性能。
这样,数据访问层可以移到单独的应用服务器上,而业务逻辑层可以同时运行在客户机端和应用服务器上,如下图所示:
表示层 用户界面层 业务逻辑层 |
业务逻辑层 数据访问层 |
数据存储和管理层 |
客户机端 |
数据库服务器 |
应用服务器 |
1.4 逻辑架构总结
逻辑架构定义了如何分离应用程序中不同的代码。一个好的逻辑架构的目的是使代码更容易维护、理解和可重用。而物理架构的定义则指定了运行应用程序的电脑,一个好的物理架构目的在于使系统在性能、可扩展性、安全性和容错能力之间取得最好的平衡,来满足你的特定环境。
分层架构的主要优点是分化了系统的复杂度,同时也提高了系统的灵活性(这点从系统同时满足各种类型数据库即可看出),另外,分层架构大大提高了系统的可维护性和可扩展性。但是,分层架构在众多优点的背后也隐藏着缺点,由于层次的增多,同一个解决方案下项目也多,过多的跨项目访问对应用程序的效率有一定的影响,但这一点现在可以在越来越快的硬件提升速度中忽略。