一文总结软件架构设计常用概念、原则与思想

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

导读

本文一文总结软件架构设计常用概念、原则与思想,包括面向对象六大原则,DID原则,ACID、CAP、BASE理论,中间层思想,缓存思想等。

面向对象设计六大原则

一 单一职责原则(SRP):

定义是就一个类而言,应该仅有一个引起他变化的原因。也就是说一个类应该只负责一件事情;

二 开闭原则(OCP):

定义是软件中的对象(类,模块,函数等)应该对于扩展是开放的,但是对于修改是关闭的;当需求发生改变的时候,我们需要对代码进行修改,这个时候我们应该尽量去扩展原来的代码,而不是去修改原来的代码,因为这样可能会引起更多的问题;

三 里氏替换原则(LSP):

所有引用基类的地方必须能够透明地使用其子类的对象;子类可以去扩展父类的功能,但是不能改变父类原有的功能,它包含以下几层意思:
1.子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法;
2.子类可以增加自己独有的方法;
3.当子类的方法重载父类的方法时候,方法的形参要比父类的方法的输入参数更加宽松;
4.当子类的方法实现父类的抽象方法时,方法的返回值要比父类更严格;

四 依赖倒置原则(DIP):

高层模块不应该依赖底层模块,两个都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象;定义有点绕,说白了,就是要针对接口编程,而不是对实现编程;(抽象指的是接口或者抽象类,两者皆不能实例化;而细节就是实现类,也就是实现了接口或者继承了抽象类的类,它是可以被实例化的;高层模块指的是调用端,底层模块是具体的实现类,在java中,依赖倒置原则是指模块间的依赖是通过抽象来发生的,实现类之间不发生直接的依赖关系,其依赖关系是通过接口来实现的,这就是通俗的面向接口编程)

五 接口隔离原则(ISP):

客户端不应该依赖他不需要的接口;

六 迪米特原则(LOD):

一个对象应该对其他对象保持最小的了解;

Robert C Martin在21世纪早期将单一职责,开闭原则,里氏替换,接口隔离和依赖倒置5个原则定义为SOLID原则。

DID原则

Design(D)设计20倍的容量;Implement(I)实施3倍的容量;Deploy(D)部署1.5倍的容量。
DID为产品扩展提供了经济,有效,及时的方法。

中间层思想

计算机系统软件体系结构采用一种层的结构,有人说过一句名言:

Any problem in computer science can be solved by another layer of indirection.
(计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。)

这句话几乎概括了计算机系统软件体系结构的设计要点,整个体系结构从上到下都是按照严格的层次结构设计的,不仅是计算机系统软件整个体系是这样的,体系里面的每个组件比如OS本身,很多应用程序、软件系统甚至很多硬件结构都是按照这种层次的结构组织和设计的。
纵观计算机体系,中间层思想无处不在,比如

  • MVC三层架构
  • 四层/七层网络模型
  • 添加缓存层提升系统性能
  • ……

缓存思想

世界是相似的,在商业的世界中,有一句经典语录叫 “现金为王”。在互联网乃至整个软件技术世界中,与之对应的一个说法就是 “缓存为王”。 纵观整个系统,缓存无处不在。

CPU缓存

由于CPU的运算速度要比内存读写速度快很多,CPU总有等待数据的时候,而高速缓存则解决了CPU运算速度与内存读写速度不匹配的矛盾。当CPU调用数据时,先从缓存中调用,从而加快读取速度。而且,CPU是有多级缓存的。

浏览器缓存

前端页面缓存有两层含义,一个是页面自身对某些页面元素或全部元素进行缓存,另一层意思是服务端将静态页面或动态页面的元素进行缓存,然后给客户端使用。这里的页面缓存指的是页面自身的缓存或者离线应用缓存。 HTML5 支持了离线缓存和本地存储,使用这种特性可以很方便的创建页面应用。

网络中的缓存

  • CDN缓存
  • 反向代理缓存

服务端缓存

  • 内存级缓存
  • 分布式缓存

数据库缓存

拿mysql来说。mysql使用查询缓冲机制。将select语句和结果存在缓冲区。下次遇到相同select就直接从缓冲区拿数据。

ACID(酸)

ACID,指数据库事务正确执行的四个基本要素的缩写。数据库必须同时满足ACID支持强一致性,ACID指如下内容:

A:原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

C:一致性(Consistency)

事务前后数据的完整性必须保持一致。

I:隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

D:持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

CAP(帽子原理)

CAP原则又称CAP定理,指的是在一个分布式系统中,CAP三个要素最多只能同时实现两点,不可能三者兼顾。 CAP分别是指

C:一致性(Consistency)

所有节点在同一时间的数据完全一致,这里的一致性指的是强一致性

A:可用性(Availability)

对于一个可用性的分布式系统,每一个非故障的节点必须对每一个请求作出响应。通常我们用几个9来描述可用性,比如5个9的可用性意思为可用水平是99.999%,即全年停机时间不超过 (1-0.99999)36524*60 = 5.256 min。

P:分区容错性(Partition tolerance)

分区容错性指分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。比如现在的分布式系统中有某一个或者几个机器宕掉了,其他剩下的机器还能够正常运转满足系统需求。

BASE(碱)

eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。

BA:基本可用(Basically Available)

基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。
电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。

S:软状态(Soft state)

软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。

E:最终一致(Eventually consistent)

最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

酸碱平衡理论

ACID是传统数据库常用的设计理念,追求强一致性模型。BASE支持的是大型分布式系统,提出通过牺牲强一致性获得高可用性。
ACID和BASE代表了两种截然相反的设计哲学,基于根据ACID与BASE提出了酸碱平衡理论,即在不同场景下,分别使用ACID与BASE解决分布式一致性问题。

感谢阅读,如有收获,求点赞、求关注让更多人看到这篇文章,本文首发于不止于技术的技术公众号 Nauyus ,欢迎识别下方二维码获取更多内容,主要分享JAVA,微服务,编程语言,架构设计,思维认知类等原创技术干货,2019年12月起开启周更模式,欢迎关注,与Nauyus一起学习。

福利一:后端开发视频教程

这些年整理的几十套JAVA后端开发视频教程,包含微服务,分布式,Spring Boot,Spring Cloud,设计模式,缓存,JVM调优,MYSQL,大型分布式电商项目实战等多种内容,关注Nauyus立即回复【视频教程】无套路获取。

福利二:面试题打包下载

这些年整理的面试题资源汇总,包含求职指南,面试技巧,微软,华为,阿里,百度等多家企业面试题汇总。
本部分还在持续整理中,可以持续关注。立即关注Nauyus回复【面试题】无套路获取。

如何做好软件架构设计 本文总结的四个部分就是从需求到落地实施的四个步骤,把这些步骤做好了才能保证整个系统的成功。明确需求是为了确定好整个系统的目标和意义,确定好架构模式是为了讲需求进行宏观拆解,将需求拆解到服务是具体拆解,是为明确各个服务的职责,服务设计就是为了能指导软件代码的开发工作。上面这四个部分也是对着应作为一个软件从业人员需要掌握得四个方面知识,分别是沟通能力、软件架构知识、需求理解能力、软件开发知识。自己在这四个方面也还欠缺得很多。 阅读详情

相关推荐

【四】一文吃透五大软件架构设计方法:概念+落地场景+案例

本文将逐一拆解五大架构设计方法,摒弃晦涩理论,搭配真实业务场景、实战案例以及可视化原理图,讲清「是什么、核心特点、什么时候用、项目里怎么落地」,帮大家彻底打通理论实战。

weixin_44762713的博客 206

软件开发常见详细设计说明

一般的软件开发项目所需要的设计说明书,包含基本的框架,融入相对应的资料内容,即可完成交付存档详细设计说明书,对外包等也适用。

软件架构设计思想模式

中科院计算所培训中心,高级软件系统构架师培训教材,软件构架设计思想模式

设计模式中的几种思想

设计模式中的几种思想。* 1.中间层思想,灵活。两个价值类之间加了一个中间层。 1.1 工厂模式 1.2 创建者 1.3 适配器 1.4 抽象工厂* 1.5 外观 1.6 中介者 1.7 代理 1.8 命令模式:由命令对象代理命令 桥接中也有中间件的思想,桥接也有倾向于中间件的 2.组合思想,两个价值类的直接关系。 等同于桥接指针做为中间件。 2.1 桥接 2.2 装饰 2.3 状态 2.4 策略...

xie__jin__cheng的博客 725

概念架构设计的理解杂记(优秀)

概念架构是对系统设计的最初构想,通过主要的设计元素及它们之间的关系来描述系统,是最初的架构设计成果。包括一些高层次的设计选择,重在点明关键机制,其中部分架构模式大都借助隐喻的手段来描述。 概念架构=概念性组件 抽象交互机制,其中概念性组件往往是粗粒度的。   概念架构范例一:MySQL 概念架构范例二:J2EE 概念架构范例三:JBoss

每天积累一点,一年后你会发现,自己变化很大 1082

简单聊聊架构设计

这个章节简单聊聊架构设计。 很多技术人员,比较热衷技术,认为技术学好了,架构设计就能手到擒来,但是我的一个观点是,脱离业务的技术都是耍流氓,不是说技术不重要,而是技术必须是服务业务的。 架构,可以说是系统的蓝图,是对系统高层次的定义和描述,在一些复杂情况下,架构可以分为面向业务的业务架构和面向计算机(系统)的软件架构。 业务架构主要是从业务方面描述软件系统,定义了系统能够实现的业务。在业务架构中,动态的内容包括业务流程、节点、输入输出,静态的内容包括业务域、业务模块、单据模型等。 软件架构有两个主要的概念

LeoHan 781

软件架构思想

记得我曾服务于一家软件公司任项目主管(项目总监)时,刚进公司时由于开发工作处于无序状态(也就是CMMI中定义的0级),所有项目几乎均是一再延期、质量低下。于是我建议并得到公司老板的大力支持下,根据公司人员的当前能力并稍高一点要求,以并行开发模式SPP为主、借鉴部分CMMI3RUP规范,制订了公司的开发流程、规范、模板制度,并强调需求、架构品质保证活动的作用。经过一段时间的培训后,我在试点项目

seaskycheng的专栏 746

框架设计思想

1.框架设计: 在设计框架时,从使用者的角度去考虑问题,让使用者可以简便的使用,完成相应的业务。所以,我们需要定义好框架的api接口,方便用户使用,也让用户不需要了解框架源码或者框架细节也可以进行项目开发。 比如:框架初始化日志,配置文件加载。创建服务对象,加载服务,开始run。 2.框架接口定义 框架api接口,要使用抽象接口,不应该依赖具体实现,实现抽象化编程,方便扩展业务开发 3.框架模块设计 模块功能要符合单一原则,不是该模块改干的事情就不要干,分模块写,虽然这样代码量会多,但是好处也很

m0_46392035的博客 1057

软件架构设计常用概念原则思想

导读 本文一文总结软件架构设计常用概念原则思想,包括面向对象六大原则,DID原则,ACID、CAP、BASE理论,中间层思想,缓存思想等。 软件架构设计常用概念原则思想 ❑面向对象设计六大原则 单一职责原则(SRP) 定义是就一个类而言,应该仅有一个引起他变化的原因。也就是说一个类应该只负责一件事情; 开闭原则(OCP) 定义是软件中的对象(类,模块,函数等)应该对于扩展是开放的,但是对于修改是关闭的;当需求发生改变的时候,我们需要对代码进行修改,这个时候我们应该尽量去扩展原来的...

Tech My Life 870

软甲架构设计软件_软件架构设计

导读本文一文总结软件架构设计常用概念原则思想,包括面向对象六大原则,DID原则,ACID、CAP、BASE理论,中间层思想,缓存思想等。面向对象设计六大原则一 单一职责原则(SRP):定义是就一个类而言,应该仅有一个引起他变化的原因。也就是说一个类应该只负责一件事情;二 开闭原则(OCP):定义是软件中的对象(类,模块,函数等)应该对于扩展是开放的,但是对于修改是关闭的;当需求发生改变的时候,...

weixin_39727402的博客 316

软件架构设计_一文一点你是如何理解软件架构设计

这是【一文一点】的第5篇文章,不拘泥于篇幅字数,用一篇文章说清一个知识点。1、当谈到软件架构的时候你不能只想到spirng、springmvc、mysql,你也真不应该想到它们,虽然它们是你落地的载体。至少你不能先想到它们,软件架构不依赖这些框架或者具体的数据库,这些东西统统需要延后,延后。正像《架构整洁之道》序言中余晟老师讲到的,架构设计是一门复杂的学问,要综合考虑编码、质量、部署、运...

weixin_39955732的博客 100

一文一点|你是如何理解软件架构设计

这是【一文一点】的第5篇文章,不拘泥于篇幅字数,用一篇文章说清一个知识点。1、当谈到软件架构的时候你不能只想到spirng、springmvc、mysql,你也真不应该想到它们,虽然它们...

新栋BOOK 274

一文一点 | 康威定律和单一职责原则的关系

你好,这是【一文一点】的第4篇文章,不拘泥于篇幅字数,用一篇文章说清一个知识点。康威定律,也有反康威定律,我们结合这两个一起来说说。我曾经有段时间都理解成,反康威定律就是反对康威定律...

新栋BOOK 2260

一文讲清 API 接口的概念设计和实现

在这个例子中,我们创建了一个简单的Express服务器,并定义了一个​​的POST接口来处理登录请求。我们使用​​中间件来解析请求体中的JSON数据,并在接口内部进行简单的用户名和密码验证。七、接口文档模板根据上述内容,整理了一稿API 接口文档模板,有需要的同学, 可以在公众号输入关键词“接口文档”,或点击公众号菜单栏的获取模板按钮选择对应的链接获取。若有什么问题和建议,也欢迎交流~

WBKJ_Noah_的博客 1882

探寻软件架构的本质,到底什么是架构

不论是开发人员还是架构师,我们都一直在跟软件系统打交道,架构是在工作中出现最频繁的术语之一。那么,到底什么是架构?你可能有自己的答案,也有可能没有答案。对“架构”的理解需要我们不断在实践中思考、归纳、演绎,形成自己的认知。

系统工程实验室 1126

一文搞懂设计模式--外传之为什么要使用设计模式

在思考为什么要使用设计模式之前,让我们先来思考如何设计一款优秀的软件?当然这里的软件指的是软件的实现架构。让我们思考一下软件架构设计所需要达成的目标,以及设计模式如何在这其中发挥作用对于软件开发而言,成本和时间永远是最重要的。代码复用是减少开发成本最常用的方式之一,这个想法看起来非常自然,但是实际在开发过程中,要让已有代码能够适配新的场景往往还是需要付出额外的代价。例如,不同的模块之间存在紧密的耦合关系,这使得复用这些代码变得更加困难。对于代码复用来说,最底层的复用通常会涉及到类、类库、容器等等可以独立存在

qq_43896330的博客 265

软考高级:软件架构风格-仓库风格概念和例题

明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。

悟鸣的技术博客 1612

软考高级:软件架构评估-质量属性:可用性概念和例题

明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。

悟鸣的技术博客 2404

软考高级:系统设计原则(多扇入,少扇出等)概念和例题

明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。

悟鸣的技术博客 1627
上一篇: 【一分钟系列】一分钟了解git常用操作
下一篇: 疫情下的远程办公实践指南
Nauyus
博客等级 码龄13年 4粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值