架构风格:万金油CS与分层
计算机科学家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架构风格+分层架构风格!
上面所提到的对架构属性的影响,也是加成的!即会提高「伸缩性」,「组件复用」,「可移植性」,「可维护性」,但是会更加的影响「性能」!
参考资料
- 维基百科
- Azure文档
- 《Architectural Styles and the Design of Network-based Software Architectures》Roy Thomas Fielding
- 《恰如其分的软件架构》
架构风格:万金油CS与分层相关推荐
- 【REST系列】详解REST架构风格 —— 带你阅读Web发展史上的一个重要技术文献
文章目录 REST详解 词组解释 论文摘要 REST架构约束 一.Client–server:客户端-服务器 二.Stateless:无状态 三.Cacheability:缓存 四.⭐Uniform ...
- (转)架构风格与基于网络的软件架构设计(介绍REST)
随着软件水平在国内的发展,中国程序员的水平也逐渐的在提高,从当年英雄式,到后来的软件作坊,现在越来越多的人开始关注软件架构设计,软件架构师培训也越来越火了,,甚至也有国人自己编著软件架构设计方面的书籍 ...
- 什么是架构模式和架构风格
本文探讨如下几个问题: 架构模式和架构风格有区别吗? 什么是架构模式? 什么是架构风格? 架构模式和架构风格的区别是什么? 有哪些架构模式? 有哪些架构风格? 架构模式=架构风格? 如果你搜索「架构模 ...
- bs cs架构区别_软件架构设计分层模型和构图思考
今天谈下架构设计中的分层思维和分层模型以及基于分层思维下的架构构图逻辑. 架构思维概述 对于架构思维本身仍然是类似系统思维,结构化思维,编程思维等诸多思维模式的一个合集.由于架构的核心作用是在业务现实 ...
- 架构风格与基于网络的软件架构设计
原文链接 https://blog.csdn.net/on_1y/article/details/60358117 架构风格与基于网络的软件架构设计 如今许多服务都采用了 RESTful API, 而 ...
- Rest架构风格详解
Rest架构风格详解 何为架构风格? 设计模式 架构模式 架构风格 Rest架构风格 客户端-服务器(Client-Server, CS) 无状态(Stateless) 缓存(Cache) 统一接口 ...
- Fielding的博士论文学习笔记(一)——REST架构风格形成
REST风格并不是一种新造出来的风格,完全是对过去的架构风格的一个合理的整合.见下图: RR:Replicated Repository,产生多个数据库的副本同时接收和处理请求,这个架构风格的代表是分 ...
- [架构之路-109]-《软考-系统架构设计师》-软件架构设计-2-软件架构概述:架构风格
引言 建筑风格指建筑设计中在内容和外貌方面所反映的特征,主要在于建筑的平面布局.形态构成.艺术处理和手法运用等方面所显示的独创和完美的意境.建筑风格因受时代的政治.社会.经济.建筑材料和建筑技术等的制 ...
- 漫谈 REST 架构风格
1. 什么是REST REST是REpresentational State Transfer的缩写,来源于R. Fielding的一篇博士论文:<Architectural Styles an ...
最新文章
- ado控件连接oracle,在Delphi 7中用ADOConnection控件连接Oracle 9i的问题
- 在word中的公式以代码形式体现在web上的方法
- excel实现套用模板批量打印_#数据清洗#Excel数据批量填入Word模板
- 开源工具 @sap/ux-ui5-tooling 介绍
- Message popover
- 友盟消息推送服务器demo,友盟消息推送总结
- Android onKeyDown、onKeyUp、dispatchKeyEvent的区别
- 阅读构建之法10、11、12章
- Oracle中group by用法
- 手把手玩转win8开发系列课程(14)
- JavaTutorials之Operators
- 4G模块配置、概念、调试记录
- React基础之事件机制
- android studio官方教程 pdf,android studio教程pdf
- 户外直播 4G/5G户外高清直播 5G视频回传
- 选好核心交换机六个关键指标有哪些?
- android原生分享功能,Android原生分享到微博、微信等平台的实现方式
- 我的iMac苹果电脑的系统崩溃和恢复
- 如何让搜索引擎搜索到自己的个人博客网站(如何提交网站到各搜索引擎,如百度、必应Bing,以及提交页面URL的地址)
- 有效的亚像素图像配准算法