本节主要讨论在目前的应用中,经常使用的高层的模式和原则。通常会涉及架构风格,包括模式,例如:C/S,分层架构,组件为基础的架构,消息总线架构,SOA架构。对于每一种架构,都会从整体、主要原则、主要优点,和帮助你的应用选择合适的架构风格上讲述一些信息。描述不同类型的应用的风格很重要。例如:一些架构模式描述部署模式,一些描述结构和设计问题,另外一些描述通信因素。因此,在本章中,一个典型的应用将会组合包括一种以上的风格。
架构风格,有时候也叫架构模式,是为一个系统提供的一系列抽象框架。架构风格通过为经常发生的问题提供解决方案,来提高设计重用和改善程序结构。你可以把架构风格和模式想象成规划一个应用的一系列原则。
下面列出主要的关注点和对应的架构模式
关注点 | 架构风格 |
Communication | SOA,Message Bus |
Deployment | c/s,N-Tier,3-Tier |
Domain | Domain Driven Design |
Structure |
Component-Based,Object-Based, Layered Architecture |
架构风格简介
- Client/Server,将应用分成两个部分,client向server提出请求。在大多数情况下,server就是一个database和有一些应用逻辑的存储过程。
- Component-Based,将应用分解为可重用的功能和逻辑组件,向外暴露定义好的通信接口。
- Domain Driven Design,是一种面向对象的架构风格,主要是针对业务领域建模,针对业务领域定义业务对象。
- Layered Architecture,将应用的关注点分为不同的层次。
- Message Bus,使用系统提供的一个或者多个通道获取和发送消息,应用不需要知道另外一个的实现细节。
- N-Tier/3-Tier,将应用分解为不同的层次,分解的方式和Layered Architecture相类似,但是不同的层次会部署到不同的物理机器。
- Object-Oriented,一种分离职责的设计,将系统分解为单个的可重用、自高效的对象,每个对象都包括相关的数据和行为操作。
- SOA,应用以服务的方式,使用协议和消息,暴露和消费功能。
组合架构风格
一个软件系统通常不止使用一种架构风格,通常是组合多种架构风格来完成系统。例如:你可以使用SOA设计,开发方式使用layered architecture和面向对象架构风格。
如果你正在建立一个公共web应用,组合架构风格会很有帮助,通过layered architecture可以对重要的事情进行有效的分离。将你的表现逻辑从业务逻辑和数据访问逻辑中分离。你所在组织的安全需求可能会迫使你使用3-tier的方式部署应用,或者是部署到更多的层上。表现层会部署在组织的内联网和外联网之间,在表现层,可以使用单独的表现模式(分层设计的风格),例如:MVC,作为内部风格。你也可以用SOA架构风格,在web服务器和app服务器之间实现消息为基础的通信。
如果你正在建立一个桌面应用,你可能会有一个client,向服务端发送请求。在这种情况下,你就可以用C/S风格部署client和server,使用组件为基础的架构风格为独立组件之间设计通信的接口。在组建的设计过程中,使用面向对象设计方法,将会提高重用性、可测试性,和灵活性。
许多因素都会在你选择价格风格的时候影响你。这些因素包括你所在组织的设计和实现能力,开发者的经验,你的基础设施和组织规格的参数。下面将继续帮助你选择合适的架构风格。
C/S架构风格
C/S架构风格描述了一个将client和server分离的分布式系统,简单的模式就是一个server端的应用被很多的client直接访问,就是2-tier架构风格。
历史上,client/server架构代表了桌面的UI应用,直接和数据库服务器进行通行,数据库包括了大部分的业务逻辑,或者是一个专用的文件服务器。client/server架构风格描述的是一个client和一个或者是多个server之间的关系,client初始化一个或者是多个请求(客户端有可能会使用UI界面),等待响应,收到响应之后进行处理。server就是授权用户,然后返回结果。server可能会用一系列协议和数据格式于client进行通信。
现如今,使用client/server的架构风格的例子也包括:运行互联网或者是内联网上的,以web浏览器为基础的程序;以windows操作系统为基础的,访问网络服务的应用;访问远程数据的应用(邮件阅读,ftp client,数据库查询工具);操作远程系统的工具(远程系统管理和网络监视器)。
其他client/server风格的变种包括:
- client-queue-client system,这种方式允许client通过一个server为基础的队列和其他的client进行通信。client可以从server获取和发送数据到server的队列中。允许客户端分布和同步文件和信息。是一种被动的队列架构。
- peer-to-peer(P2P)应用,从上面的风格变化而来,为了跨越多个client实现分布和同步文件及信息,允许client和server调换角色。通过响应多个请求,共享数据,资源发现,扩展了client/server风格。
- application servers,一种特殊的架构风格,服务器宿主和执行应用和服务,瘦客户端通过浏览器或者是安装的特殊客户端访问服务。一个例子就是远程桌面,客户端通过远程桌面,在服务执行操作。
client/server的主要好处
- 高安全性,所有的数据都存储在服务器,相比客户端来说提供了更大的控制权。
- 集中数据访问,因为数据只存储在服务器,相比其他类型的架构,访问和更新数据更加容易。
- 易维护,一个计算系统的角色和职责都分布在若干个服务器上,如果服务器进行修改,升级和移动位置,对于客户端来说不受应用。
如果你的应用是以服务器为基础的,需要支持很多的客户端访问,或者是建立的就是通过浏览器访问的web应用,实现的业务逻辑会被整个组织使用,或者是你创建的服务是供其他应用消费的,这种情况可以考虑client/server架构风格。
client/server架构风格,像很多网络风格一样,对于集中化数据存储、备份、管理,或者是你的应用需要支持不同的客户端类型、不同的设备,也比较合适。
但是,典型的2-tier有很大的缺陷,将应用逻辑和应用数据放在一个server,对于系统的扩展性和伸缩性是有负面影响的,它依赖于一个集中的服务器,对于系统的可靠性也有负面的影响。后面降到的3-tier,甚至是n-tier可以解决2-tier中遇到的问题,并且提供额外的好处。