关于多层架构一些思考

1:关于多层架构(N-Tier)

多层架构是一种被行业证实过的软件架构模型,对开发一些解决可扩展性、安全性、容错性方面的企业级(客户端/服务端)应用程序支持是至关给力。但在.NET世界里,咱们有许多工具和产品,却没有指导手册是关于如何设计和实现一个良好的多层架构模型,好比一些样例版,Demo等等,咱们或许多少有听到、看到一些关于多层架构模型的用途和益处,但更多知道的仅仅是如何使用和实现,没有过多的思考为什么咱们要这样设计呢?这样设计符合了哪些设计模式呢?遵循哪些设计原则呢?或者了解一点多层的概念,甚至是根本不理解其中的定义。因此本篇文章主旨是围绕“多层架构”来打造,介绍其中的概念、优缺点、与其余架构区别、使用场景等等。但,整体来讲,这是一个良好的软件架构的解决方案之一。程序员

2:名词介绍

物理层和进程(Tier And Process)
在英文中都有表示层的意思,简单来讲——物理层和逻辑层。有一种说法是Layer是水平方向切割的,Tier是垂直方向切割的,这个只是从观察角度不一样来定义的。Tier一般意味着物理部署的计算机,在一层能够单独运行某一个服务。而Layer则意味着软件功能类似的组件逻辑组合,Layer是为了可以更好的开发,更好的组织。严格定义来讲,
Tier是这样的:客户机->web服务器->应用服务器->数据库,仅此而已。若是想要更多的Tiers,只能去扩展应用服务器,把应用服务器分割出若干的Tier。更多时候,一个Tier能够Host多个Layer外,某个Layer能够分布到多个Tier,好比提供基础公共服务的Layer,对于富客户端的应用程序,就是这种状况。
同时,Layer还暗示了"下面的Layer通常要为上面的Layer提供服务",那么用逻辑层来表达就显得比较合适,而Tier这方面的暗示比较薄弱,用物理层来表达也贴切。
图1:
 
  在图1中咱们能看到,持久层(persistence layer)包含了两部分:持久操做类库(persistence lib)和wcf数据服务(wcf Data Service)。持久操做类型在持久层中一般运行同一个进程并结合wcf数据服务,做为业务层的提供者,而wcf数据服务,又能够单独的运行在独自的一物理层。另外一个例子是,咱们可能会从业务层中提取数据验证来做为独立的类库(此时逻辑定义上,数据验证还在业务层中),是为了给客户展示层调用提供更好的交互性能。那这样的话,数据验证类库与客户展示层运行的同一个进程中,而业务层剩余的部分则单独运行在一个物理层。
 
物理层和进程(Tier And Process)
一般来讲,一个逻辑层运行一个进程,并同时运行在一台单独的计算机上。两个不一样逻辑层能够是在两个不一样的进程中独立运行,进程间也互相通讯。但若是碰到IPC状况,不是基于分布式的,那么这两个进程就会共享内存空间,那么不一样进程的处理得放在一个计算机中,那么相对来讲,一个物理层对应两个进程,至关于对应两个逻辑层
 
逻辑层和进程(Layer And Process)
一般,一个逻辑层运行在一个独立的进程中,也有多个逻辑层运行在一个独立的进程中,也有一个逻辑层运行多个进程。能够分不一样种状况
 

3:三层架构

首先先介绍下三层架构,三层是多层架构中典型的例子。包括了:表示层、应用层、数据层,顺序是从顶层到底层依次继承。
 
表示层(Presentation layer):用户能够直接访问和交互的层次,好比桌面UI、网页页面等等,也能够叫为客户端。
 
应用层(Application layer):这个层封装了业务逻辑(简单来讲就是业务运算的规则和数据验证),领域概念、数据访问逻辑等等,也能够叫为中间层
 
数据层(Data layer):用来存取应用程序数据的外部数据源,好比数据库服务,CRM系统,ERP系统,主机或者其余遗留系统等等。其中一个是咱们常见的是数据库服务,在多层架构中,咱们须要使用到非嵌入式的数据服务系统,好比SQL Service,Oracle,DB2,MySql或者PostgraSQL.非嵌入式的数据库服务能够运行在独立计算机中,而嵌入式数据库服务,好比access,db在独立计算机,因此这种数据库服务类型是不能在三层架构中使用的。
 

4:1-Tier,2-Tier,3-Tier或More-Tier架构

1-Tier:全部的逻辑层运行在一台计算机中,为了实现1-Tier架构,咱们须要用到签入式类型的数据库系统,而且是不能运行在单独的进程中,相反,那些至少2-Tier由于是非嵌入式数据库一般能够在独立的计算机中运行。
 
2-Tier:表示层和应用层,其中一个单独运行在一台计算机中,或应用层和数据层,其中一个单独运行在一台计算机中,整个应用程序不超过两台计算机。
 
3-Tier:是多层架构中,最典型的一种。三层中的每一层均可以单独运行在分离的计算机中,但也能够被部署在同一台计算机(其中最多见的是,三层架构,但最终部署做为一台中)。
 
N-Tier:3或者更多层架构。图3描绘的是一个N层架构体系。一些三层类型能够进一步分割,变为多层架构。好比应用层能够进一步划分为业务层和持久层,表示层能够进一步划分为客户端层和客户端表现层。固然,全部这些逻辑层均可以部署在同一台计算机中的。
 
 
客户端层:这个层是直接与用户交互的,可能有几种不一样的类型共存,如WPF窗口,HTML网页等等
客户端表现层:包含客户所需的表现逻辑。如asp.net mvc 的IIS服务器,也适应不一样客户的业务层
业务层:处理并封装业务所涉及的全部领域和逻辑,也可被称为领域层
持久层:处理和对业务数据到数据层进行读写操做,也可被称为数据访问层
数据层:外部的数据源,好比数据库
 

5:N-Tier与MVC架构有什么区别

MVC模式(Model-View-Controller)是 软件工程中的一种 软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
1.控制器(Controller)- 负责转发请求,对请求进行处理。
2.视图(View) - 界面设计人员进行图形界面设计。
3.模型(Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(能够实现具体的功能)。
 
 
就拿多层架构中最典型的三层来讲,在三层中,数据访问层(DAL)、业务逻辑层(BLL),Web层各司其职,目的是职责分离。MVC是Model-View-Controller。严格提及来这三个加起来才是三层架构中的Web层,换种说法就是MVC就是表示层中再度分化,分红了控制器、视图、实体三个部分。View完成页面逻辑,Model则封装须要传递到View进行显示的数据,而控制层则与三层中的BLL进行通讯。
MVC的优势:耦合性低、重用性高、部署快、可维护性。
 

6:不一样层架构优点和劣势

1 or 2-Tier 架构
优点:因为流程和层次比较少,对于用户数量少的应用程序是简单又快速部署,同时又低成本的硬件、网络维护。
劣势:但当用户数量增大时,将会出现大问题。因为只能部署1到2台计算机,在程序的安全性、可扩展性、容错性等方面会有局限性。
 
N-Tier架构
优点:
1,可伸缩性。这是因为多层的功能和低耦合性所决定的。好比,因为没有其余层的耦合,数据层能够扩大数据库集群,web客户端能够经过负载平衡器扩大而不影响其余层,Windows服务器能够轻松进行集群经过负载平衡和故障转移。
2,可安全性。更好和更安全的控制整个系统,咱们能够对每一个层执行不一样的安全策略,好比,业务层和数据层一般比表示层须要更高的安全级别,咱们能够把这两高安全层放在防火墙后面进行保护。
3,可容错性。好比,在不影响其余层的状况下,数据库在数据层中能够为故障转移,进行负载平衡集群。
4,可独立性。在不影响其余层状况下,能够进行独立升级和改变。在面向对象世界里,接口依赖实现能够把全部层解耦的很是好,那么就会致使若是其中某一层改变了,对于其余层是影响是很是小甚至是不影响。接口依赖意味着层跟层之间仅仅经过接口来互相通讯,一层依赖于另外一层的接口,而不是内部类来通讯。固然,在改变整个系统时候,层的依赖性影响到的只是他低层次的实现,进而把其中反作用的影响降到最低。好比,若是接口不改变,在不影响整个系统下,咱们能够更改或替换这个接口所实现的层。
5,可便捷性。更便捷和更高效的开发环境,解耦主要是经过软件组件组合来实现某一模块,这样软件开发是很是便捷和高效的。能够把每一层要实现的功能单独分配给不一样的开发组,只需经过接口来互相通讯,每一个层又能够本身作单元测试,到最后完成时组合起来就变成一个完整的系统。
6,可维护性。
7,可扩展性。因为对业务开发是以组件式来的,对于新功能的添加和删除是很是方便的。
8,可重用性。因为是高内聚和低耦合,通用的功能和代码能够重复使用,也能够被其余更多的应用程序调用。
劣势:
1,因为许多网络、计算机和进程都是独立运行的,一旦系统的硬件和网络带宽比较差的话,整个系统运行的性能就会比较慢。
2,若是须要更好的硬件和网络带宽,对于硬件和网络、维护和部署的成本比较高。
 

7:多层架构中的业务数据验证

在多层架构中,为了保证整个业务系统健康的和良好的,其中数据验证是很是必须和重要的步骤。那么首先有一个问题对于数据验证?哪一个层咱们应该进行数据验证,而且在哪里进行验证呢?这里有几个点:
1,能够任何一个层中进行数据验证。一般,数据验证离客户层越近,是越高效。离客户端越远,则须要越可靠、越健壮。
2,当咱们决定哪一个层进行数据验证时,咱们须要处理好性能、可靠性和健壮之间的平衡关系。
3,客户端验证是是一种很是有效的手段,列如:Javascript客户端验证,当同时,用户也能够轻松绕过客户端验证,好比网页黑客所干的事情。所以,在考虑性能和可靠性时候,在客户端和服务的数据验证是很是须要的。
4,对于一些数据交互的应用程序,不管咱们是否将在服务器端进行验证,咱们都须要在客户端作可接受数据验证。
 

8:多层架构中的开发技巧

设计、维护、实现、部署在多层架构中是一项艰巨的任务。若是一开始没清晰的规划,那么有可能致使后期开发的时候会作无用功。这里有几点以下建议:
1,用一些松散耦合的技术,尽量把层和层之间的关系解耦,好比soap xml或接口等。在面向对象中,每个层仅仅依赖于它接口所直接实现的具体层,而不是经过内聚类。这样咱们就能够尽量的最大解耦,对于咱们以后的开发会带来更大的好处,好比单元测试、维护、系统升级,可扩展和可靠性。
2,尽量多的自动生成技术或对于整个系统,经过poco版本方式进行业务实体的维护。利用特性、分部类、DTO等方法。
3,利用一些自动工具或包进行实体映射在业务实体和传统的关系数据库之间。好比Entity Framework 和 NHibernate 等工具。
4,利用代码生成器。
5,咱们应该尽可能避免业务层与持久层的高度耦合,。好比,咱们能够经过WCF业务服务来直接访问Entity Framework,这种状况很常见。但这样作有一个问题是,会把业务层和持久层进行高度耦合。而这种高度耦合会带来更多的问题。一般咱们经过一种适配器来解决这种耦合,进而把高耦合变成松散耦合,他们仅仅经过接口来通讯。
6,在客户表现层,咱们把共同的代码抽象并封装,以达到通用的目的。
7,为了提升性能,每每要增长缓存。
8,为了适应需求的变动,良好的多层架构能够轻松应对部署的伸缩性和配置的灵活性。
 

9:结论

描述了多层架构的概念和定义,介绍多层架构中的典型表明——"三层架构"。并说明了一个完整的三层架构应该是表示层、应用层、数据层分别运行在单独的计算机中。并描述了三层架构和MVC架构之间的关系,应该是属于和被属于的关系。分析了多层架构的优点和劣势,在多层架构中的数据验证的重要性,最后说明在多层架构中能够用到的一些工具和技术技巧,谨记层和层之间的通讯是经过接口来交互,而不是内聚类,那样才会作到开发时模块的高内聚和通讯的低耦合。

这是学习了《N-Tier Architecture and Tips》这篇文章 所思考,若有理解错误,望不吝赐教。
相关文章
相关标签/搜索