架构风格:万金油CS与分层

简介: 计算机科学家David Wheele曾说过这么一句话:All problems in computer science can be solved by another level of indirection意思是:「 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决」。

计算机科学家David Wheele曾说过这么一句话:

All problems in computer science can be solved by another level of indirection
意思是:「 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决」。

这也是CS架构和分层架构的核心思想!

将CS架构和分层架构放在一起讨论除了上面的原因之外,还有如下几个原因:

  • CS架构和分层架构是使用很频繁的两种架构风格
  • CS架构和分层架构一般都会结合使用
  • CS架构中的2-tier,3-tier,N-tier与分层架构容易混淆,毕竟Tier和Layer都翻译为「层」

本文将探讨如下几个问题:

  • CS架构风格的约束
  • CS架构风格对架构属性的影响
  • 2-tier,3-tier,N-tier架构模式
  • 分层架构风格的约束
  • 分层架构风格对架构属性的影响
  • Tier和Layer的区别「为什么两层架构(2-tier)、三层架构(3-tier)、N层架构(N-tier)是CS架构风格的具体体现,而不是分层(Layer)架构风格的具体体现?!」
  • CS架构风格和分层架构风格适用哪些场景

CS架构风格的约束

  • Server组件提供了一组服务,并监听对这些服务的请求,
  • Client组件通过一个连接器将请求发送到Server,希望执行一个服务,
  • Server可以拒绝这个请求,也可以执行这个请求并将响应发送回Client。

CS架构风格最简单的实现就是2-tier!即两层架构模式。比如SSH,FTP就是两层架构。以FTP来说:

  • 远程有一个FTP文件服务器
  • 我们需要使用FTP客户端去连接那个文件服务器
  • 如果用户名密码错误,服务器会拒绝连接
  • 连接上以后,客户端可以下载或上传文件到服务端

最常用的CS架构风格的实现应该是3-tier!三层架构一般分为:

  • Presentation tier 表现层
  • Logic tier 业务逻辑层
  • Data access tier 数据访问层

CS架构风格使得客户端与服务端能够独立进化,提高了架构的「伸缩性」;架构层面代码隔离,提高了「可维护性」。
由于系统被拆分成了Client和Server,Client与Server端的通信可能会稍微影响「性能」!

分层架构的约束

  • 按照层次来进行组织,每个层都有特定的责任
  • 每一层为在其之上的层提供服务,并且使用在其之下的层所提供的服务
  • 较低层不可使用较高层中的服务
  • 一般不跨层调用

分层架构一般分为四层,和CS架构风格非常类似,:

  • Presentation layer 表现层 (Controller层可以属于这一层)
  • Application layer 应用层 (常说的Service层就属于这一层)
  • Business layer 业务逻辑层(领域对象层属于这一层)
  • Data access layer 数据访问层(持久层,日志,网络层等)

分层架构风格使得组件高内聚、低耦合,每个组件能独立进化,提高了架构的「伸缩性」;组件层面代码隔离,提高了「可维护性」;层与层之间调用限制,可方便的替换对应的层,方便了「组件复用」以及「可移植性」!
由于一个请求可能需要经过多层来处理,层与层之间的通信会影响到「性能」!

Tier与Layer

不知道你有没有疑问?2-tier、3-tier、N-tier架构模式为什么是CS架构风格的实现?而不是分层架构风格的实现?毕竟Tier与Layer都翻译为「层」!

这里先说下Tier和Layer的区别!

网络上有两种解释:

  • 一种解释是,Tier是纵切,Layer是横切
  • 另一种解释是,Tier是物理层,Layer是逻辑层

先说第一种解释,纵切和横切是什么意思呢?看上面三层架构图,表现层、逻辑层、数据层由上至下排列,看起来好像是被刀横向切过一样,这就是横切。纵切就是表现层、逻辑层、数据层由左至右排列,看起来好像是被刀纵向切过一样。

很明显,这个解释说不通,架构图只是示意而已,组件如何摆放可能和个人习惯有关。上面的三层架构图来自wiki,它是一个横切图,但是它是3-tier!

相对的,第二种解释就比较合理。Tier是物理层,Layer是逻辑层。上面的例子中,三层架构的表现层、逻辑层、数据层都是可独立部署的,也就是物理层。而Controller层,Service层,Model层等,是在一个应用中的,是逻辑划分的,不能独立部署。

维基百科在「多层架构」里也间接支持了这个观点:

In a 「logical multilayered architecture」 for an information system with an object-oriented design, the following four are the most common:Presentation layer,Application layer,Business layer,Data access layer
在面向对象设计的「逻辑分层架构」中,系统一般被分为:表现层,应用层,业务层和数据访问层

那我们如何解释「2-tier、3-tier、N-tier架构模式是CS架构风格的实现这个问题呢?」!

其实很简单,2-tier是一个Client和Server进行通信!那么你可以这么看3-tier架构模式:

  • 数据层相对于逻辑层来说,就是个Server,为逻辑层提供数据服务;逻辑层相对于数据层来说,就是个Client,请求数据层获取数据
  • 逻辑层相对于表现层来说,就是个Server,为表现层提供服务;表现层相对于逻辑层来说,就是个Client,请求逻辑层处理相应逻辑

N-tier架构模式类似,就不赘述了!

微妙关系

CS架构风格和分层架构风格其实关系比较微妙!

举个简单的例子,一般架构设计时,会先设计逻辑视图!比如Controller层,Service层和Model层。如果我新增了一个缓存层用来缓存Model数据,那么请问这个缓存层是个Layer还是Tier?答案是不一定。如果你使用了redis来缓存数据,那么缓存层就是个Tier。而如果你直接在系统里写代码实现,那么就是Layer!

使用场景

CS架构风格+分层架构风格可以说是个万金油组合!如果你无法确定该使用哪种架构风格的时候,那么可以先使用CS架构风格+分层架构风格!

上面所提到的对架构属性的影响,也是加成的!即会提高「伸缩性」,「组件复用」,「可移植性」,「可维护性」,但是会更加的影响「性能」!

参考资料

目录
相关文章
|
7月前
|
负载均衡 关系型数据库 应用服务中间件
高可用系列文章之二 - 传统分层架构技术方案
高可用系列文章之二 - 传统分层架构技术方案
|
2月前
|
人工智能 前端开发 JavaScript
前端架构思考 :专注于多框架的并存可能并不是唯一的方向 — 探讨大模型时代前端的分层式微前端架构
随着前端技术的发展,微前端架构成为应对复杂大型应用的流行方案,允许多个团队使用不同技术栈并将其模块化集成。然而,这种设计在高交互性需求的应用中存在局限,如音视频处理、AI集成等。本文探讨了传统微前端架构的不足,并提出了一种新的分层式微前端架构,通过展示层与业务层的分离及基于功能的横向拆分,以更好地适应现代前端需求。
|
15天前
|
数据库
分层架构
表现层(Presentation Layer):处理用户界面和用户交互逻辑。 业务逻辑层(Business Logic Layer):处理业务相关的逻辑和规则。 数据访问层(Data Access Layer):负责与数据库或其他数据源进行 [Something went wrong, please try again later.]。
|
2月前
|
JSON 前端开发 Java
Spring Boot框架中的响应与分层解耦架构
在Spring Boot框架中,响应与分层解耦架构是两个核心概念,它们共同促进了应用程序的高效性、可维护性和可扩展性。
61 3
|
2月前
|
存储 前端开发 API
DDD领域驱动设计实战-分层架构
DDD分层架构通过明确各层职责及交互规则,有效降低了层间依赖。其基本原则是每层仅与下方层耦合,分为严格和松散两种形式。架构演进包括传统四层架构与改良版四层架构,后者采用依赖反转设计原则优化基础设施层位置。各层职责分明:用户接口层处理显示与请求;应用层负责服务编排与组合;领域层实现业务逻辑;基础层提供技术基础服务。通过合理设计聚合与依赖关系,DDD支持微服务架构灵活演进,提升系统适应性和可维护性。
|
4月前
|
存储 消息中间件 JSON
|
5月前
|
运维 Java Docker
业务系统架构实践问题之在某些情况下,将能力代码和业务逻辑严格分层可能是一个挑战问题如何解决
业务系统架构实践问题之在某些情况下,将能力代码和业务逻辑严格分层可能是一个挑战问题如何解决
|
5月前
|
存储 搜索推荐 API
业务系统架构实践问题之分层架构中的四层定位是什么
业务系统架构实践问题之分层架构中的四层定位是什么
151 0
|
5月前
|
缓存 项目管理
项目管理定义问题之DDD架构的分层架构中基础层作用是什么
项目管理定义问题之DDD架构的分层架构中基础层作用是什么
|
5月前
|
存储 消息中间件 Kafka
细说数据仓库分层架构
【7月更文挑战第20天】数据仓库分层架构包括缓冲层、操作数据层、明细数据层、汇总数据层和数据集市层。