四种软件架构演进史,程序员会一种就很牛了!

阿里巴巴技术专家三画:如何画好架构图 技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也体现在优秀工程师在工作效率提升、产品性能优化和用户体验改善等经验方面的分享,以提高我们的专业能力。 本文作者阿里巴巴技术专家三画,分享了自己和团队在画好架构图方面的理念和经验,首发于阿里内部技术分享平台,阿里巴巴中间件授权转载,梓敬、鹏升和余乐对此文亦有贡献。 当我们想用一张或几张图来描述我们的系... 阅读详情

如果一个软件开发人员,不了解软件架构的演进,会制约技术的选型和开发人员的生存、晋升空间。这里我列举了目前主要的四种软件架构以及他们的优缺点,希望能够帮助软件开发人员拓展知识面。

一、单体架构

单体架构比较初级,典型的三级架构,前端(Web/手机端)+中间业务逻辑层+数据库层。这是一种典型的Java Spring mvc或者Python Django框架的应用。其架构图如下所示:

13894260-96ed918c9b5c18c5.png
image

单体架构

单体架构的应用比较容易部署、测试, 在项目的初期,单体应用可以很好地运行。然而,随着需求的不断增加, 越来越多的人加入开发团队,代码库也在飞速地膨胀。慢慢地,单体应用变得越来越臃肿,可维护性、灵活性逐渐降低,维护成本越来越高。

下面是单体架构应用的一些缺点:

  • 复杂性高:以一个百万行级别的单体应用为例,整个项目包含的模块非常多、模块的边界模糊、 依赖关系不清晰、 代码质量参差不齐、 混乱地堆砌在一起。可想而知整个项目非常复杂。每次修改代码都心惊胆战, 甚至添加一个简单的功能, 或者修改一个Bug都会带来隐含的缺陷。
  • 技术债务:随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务, 并且越积 越多。“ 不坏不修”, 这在软件开发中非常常见, 在单体应用中这种思想更甚。已使用的系统设计或代码难以被修改,因为应用程序中的其他模块可能会以意料之外的方式使用它。
13894260-303143aa162fd52a.png
image
  • 部署频率低:随着代码的增多,构建和部署的时间也会增加。而在单体应用中, 每次功能的变更或缺陷的修复都会导致需要重新部署整个应用。全量部署的方式耗时长、 影响范围大、 风险高, 这使得单体应用项目上线部署的频率较低。而部署频率低又导致两次发布之间会有大量的功能变更和缺陷修复,出错率比较高。
  • 可靠性差:某个应用Bug,例如死循环、内存溢出等, 可能会导致整个应用的崩溃。
  • 扩展能力受限:单体应用只能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩。例如,应用中有的模块是计算密集型的,它需要强劲的CPU;有的模块则是IO密集型的,需要更大的内存。由于这些模块部署在一起,不得不在硬件的选择上做出妥协。
  • 阻碍技术创新:单体应用往往使用统一的技术平台或方案解决所有的问题, 团队中的每个成员 都必须使用相同的开发语言和框架,要想引入新框架或新技术平台会非常困难。

二、分布式应用

  1. 大型互联网架构演进过程
  2. 架构师应具备的分布式知识
  3. 主流分布式架构设计详解
13894260-ebb706cf57e9dd11.png
文末有架构图集领取

中级架构,分布式应用,中间层分布式+数据库分布式,是单体架构的并发扩展,将一个大的系统划分为多个业务模块,业务模块分别部署在不同的服务器上,各个业务模块之间通过接口进行数据交互。数据库也大量采用分布式数据库,如redis、ES、solor等。通过LVS/Nginx代理应用,将用户请求均衡的负载到不同的服务器上。其架构图如下所示:

13894260-3e91ea1301e58313.png
image

分布式架构

该架构相对于单体架构来说,这种架构提供了负载均衡的能力,大大提高了系统负载能力,解决了网站高并发的需求。另外还有以下特点:

  1. 降低了耦合度:把模块拆分,使用接口通信,降低模块之间的耦合度。
  2. 责任清晰:把项目拆分成若干个子项目,不同的团队负责不同的子项目。
  3. 扩展方便:增加功能时只需要再增加一个子项目,调用其他系统的接口就可以。
  4. 部署方便:可以灵活的进行分布式部署。
  5. 提高代码的复用性:比如service层,如果不采用分布式rest服务方式架构就会在手机wap商城,微信商城,pc,android,ios每个端都要写一个service层逻辑,开发量大,难以维护一起升级,这时候就可以采用分布式rest服务方式,公用一个service层。

缺点 : 系统之间的交互要使用远程通信,接口开发增大工作量,但是利大于弊。

三、微服务架构

  1. 服务的前世今生
  2. 基于分布式思想下的RPC解决方案
  3. Dubbo应用及源码解读
  4. SpringBoot
  5. SpringCloud应用及源码解读
  6. Docker虚拟化技术
13894260-ca0cb61d37e4dd2f.png
文末领取清晰图片

微服务架构,主要是中间层分解,将系统拆分成很多小应用(微服务),微服务可以部署在不同的服务器上,也可以部署在相同的服务器不同的容器上。当应用的故障不会影响到其他应用,单应用的负载也不会影响到其他应用,其代表框架有Spring cloud、Dubbo等。其架构图如下所示:

13894260-08eb95d972bee780.png
image
  • 易于开发和维护:一个微服务只会关注一个特定的业务功能,所以它业务清晰、代码量较少。开发和维护单个微服务相对简单。而整个应用是由若干个微服务构建而成的,所以整个应用也会被维持在一个可控状态。

  • 单个微服务启动较快:单个微服务代码量较少, 所以启动会比较快。

  • 局部修改容易部署:单体应用只要有修改,就得重新部署整个应用,微服务解决了这样的问题。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可。

  • 技术栈不受限:在微服务架构中,可以结合项目业务及团队的特点,合理地选择技术栈。例如某些服务可使用关系型数据库MySQL;某些微服务有图形计算的需求,可以使用Neo4j;甚至可根据需要,部分微服务使用Java开发,部分微服务使用Node.js开发。

  • 微服务虽然有很多吸引人的地方,但它并不是免费的午餐,使用它是有代价的。使用微服务架构面临的挑战。

13894260-2d15a96a28119ff2.png
image
  • 运维要求较高:更多的服务意味着更多的运维投入。在单体架构中,只需要保证一个应用的正常运行。而在微服务中,需要保证几十甚至几百个服务服务的正常运行与协作,这给运维带来了很大的挑战。
  • 分布式固有的复杂性:使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟、分布式事务等都会带来巨大的挑战。
  • 接口调整成本高:微服务之间通过接口进行通信。如果修改某一个微服务的API,可能所有使用了该接口的微服务都需要做调整。
  • 重复劳动:很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复。尽管可以使用共享库来解决这个问题(例如可以将这个功能封装成公共组件,需要该功能的微服务引用该组件),但共享库在多语言环境下就不一定行得通了。

四、Serverless架构

当我们还在容器的浪潮中前行时,已经有一些革命先驱悄然布局另外一个云计算战场:Serverless架构。

13894260-cd974e52a3b6ff89.png
Serverless架构

2014年11月14日,亚马逊AWS发布了新产品Lambda。当时Lambda被描述为:一种计算服务,根据时间运行用户的代码,无需关心底层的计算资源。从某种意义上来说,Lambda姗姗来迟,它像云计算的PaaS理念:客户只管业务,无需担心存储和计算资源。

13894260-65b9041d6e855cc7.png
image

在此前不久,2014年10月22日,谷歌收购了实时后端数据库创业公司Firebase。Firebase声称开发者只需引用一个API库文件就可以使用标准REST API的各种接口对数据进行读写操作,只需编写HTML+CSS+JavaScrip前端代码,不需要服务器端代码(如需整合,也极其简单)。

相对于上两者,Facebook 在2014年二月收购的 Parse,则侧重于提供一个通用的后台服务。这些服务被称为Serverless或no sever。想到PaaS(平台即服务)了是吗?很像,用户不需要关心基础设施,只需要关心业务,这是迟到的PaaS,也是更实用的PaaS。这很有可能将会变革整个开发过程和传统的应用生命周期,一旦开发者们习惯了这种全自动的云上资源的创建和分配,或许就再也回不到那些需要微应用配置资源的时代里去了。

对于Serverless架构,我没有全部展示出来,那如果有感兴趣了解的老友们呢...可以加入我私人群一起讨论学习!

点击链接加入群聊【架构华山论剑:836442475】:https://jq.qq.com/?_wv=1027&k=5MIzBWe

喜欢我的分布式、微服务系统图的也能分享给大家哦~我对架构体系做了一系列的系统图,很开心能分享给大家,可以啦!

13894260-f28ca3e386153de3.jpg
image
软件设计画图,流程图、甘特图、时间轴图、系统架构图、网络拓扑图、E-R图、思维导图 阅读详情

相关推荐

软件架构入门:不就是如何把代码摆得更明白吗?

软件架构:程序员成长的“认知拐点” 软件架构如同建筑设计图,决定了模块划分、数据流向与扩展性,是避免“意大利面代码”的关键。架构三大核心要素包括:模块化结构(功能分区)、清晰接口(模块交互规范)和非功能设计(性能、安全等)。架构演进从单体到微服务,需避免过度复杂化或一劳永逸的误区。优秀架构师需兼顾全局视野与落地能力,年轻程序员应培养“架构感”,平衡业务需求与技术选型。架构如同广场舞队形,既需规范协作,又需灵活适应变化。

IT技术分享社区 885

软件架构图该怎么画?架构设计如何标准化?

本文试图回答以下问题: 1. 如何标准化软件架构设计? 2. 如何把软件架构设计拆解成一个个小任务,渐进完成,辅助敏捷开发? 3. 如何共享软件架构设计内容,让团队成员都能更新,而不只是存在于架构师的PPT里?...

surfirst的博客 1万+

架构演进史,技术选型的秘密

以六十年架构演进史为主线,回答"每一代架构师在什么约束下选型、为何选、事后对错"。不吹新贬旧,只讲约束:硬件贵、交付快、组织大、运维贵、智能不确定。沉淀五条规律——先识别约束、可逆性优先、算总账、康威定律、谁为失败买单——并附可执行检查清单,助你在下次选型中问对问题。

m0_38095869的博客 349

一次性讲清楚常见的软件架构图

业务架构服务于业务目标,通过描绘业务上下层关系,梳理一整套完整、简单的业务视图,降低业务系统的复杂度,提高客户理解度,最终给客户最直观的业务体现。画业务架构图需要对业务熟悉掌握,并对业务进行收集、拆解、提炼、归纳、分类,从而绘制出业务的上下层级关系和主要结构模块。为后续围绕业务内容展开的工作提供可视化支持。比如做一个团购网站,你只需要把商品类目、货品库存、订单服务、支付退款等进行清晰划分,而不需要考虑以下问题:我用什么技术开发、我的并发大怎么办、我选择什么样的硬件等。

uzong 2万+

互联网架构演进之路

目录 1 单体架构 2 分布式架构 2.1 应用集群 2.2 分布式缓存 2.3 业务拆分 2.4 分库分表和读写分离 2.5 静态化和CDN 2.6 异步解耦 3 微服务架构 3.1 为什么需要服务化 3.2 服务化的好处 3.3 服务化的问题

赵广陆 3022

MIT经典软件架构基础课程精讲课件

聊了这么多技术细节,我想说的是:所有架构问题归根结底都是人的问题。一个好的架构不仅要考虑性能、扩展性、可靠性,更要考虑:- 新人能否快速上手?- 团队成员能否高效协作?- 系统能否在人员变动时保持稳定?这才是Java生态历经二十多年仍能屹立不倒的根本原因。它不是一个追求极致性能的语言,而是一个优先考虑工程可管理性的技术体系。下次当你面对架构决策时,不妨先问问自己:记住,最优雅的架构,是那种让你感觉不到它存在的架构。

weixin_35756373的博客 1060

软件项目各种架构图_四种软件架构演进史,程序员会一种就很牛了!

如果一个软件开发人员,不了解软件架构的演进,会制约技术的选型和开发人员的生存、晋升空间。这里我列举了目前主要的四种软件架构以及他们的优缺点,希望能够帮助软件开发人员拓展知识面。一、单体架构单体架构比较初级,典型的三级架构,前端(Web/手机端)+中间业务逻辑层+数据库层。这是一种典型的Java Spring mvc或者Python Django框架的应用。其架构图如下所示:单体架构单体架构的应用比...

weixin_39784263的博客 4755

使用ExcelJS向XLSX单元格居中插入图片

本文记录了使用ExcelJS库向XLSX单元格里居中写入图片的方法。本文内容包括:xlsx 文件格式;xlsx 图片定位的长度单位;使用nativeColOff和nativeRowOff进行定位,不要使用官网给的定位方式;添加图片到数据表的总体流程和样例代码;注意事项等。

weixin_43678000的博客 3456

四种JAVA架构演进史,程序员能学会最后一种就非常厉害了,至少50k

前言 如果一个JAVA开发人员,不了解常见架构的演进,肯定会制约自己技术的选型和晋升空间。这里我列举了目前主要的四种软件架构以及他们的优缺点,希望能够帮助软件开发人员拓展知识面。(如有说的不对之处还望指正) 一、单体架构 单体架构比较初级,典型的三级架构,前端(Web/手机端)+中间业务逻辑层+数据库层。这是一种典型的Java Spring mvc或者Python Django框架的应用。其架构图如下所示: ​ 单体架构的应用比较容易部署、测试, 在项目的初期,单体应用可以很好地运行。然而,随着需求的不断

weixin_51702416的博客 3382

电影票购票小程序搭建(源码部署)

答:为用户提供便捷的购票方式,包括授权登录、个性化推荐、在线选座、订单管理等功能,同时在界面设计上注重用户友好性,简化用户的购票流程。答:通过展示电影院的优惠活动和票价信息,同时提供电影推荐功能,根据用户的历史购票记录和电影评分推荐个性化的电影列表,吸引用户购票。编写页面逻辑代码:使用JavaScript编写小程序页面的逻辑代码,实现电影列表的获取、电影详情的展示、座位选择的逻辑等。设计小程序界面:使用WXML和WXSS编写小程序的界面代码,实现电影列表的展示、电影详情的样式、座位选择页面的布局等。

2301_79072569的博客 2068

电机控制基础,小白入门篇

电机,这个藏在风扇、电动车、机器人里的“动力心脏”,如何精准控制它的转速、方向甚至力量?这篇博客专为完全零基础的小白打造,用“说人话”的方式拆解电机控制的底层逻辑,帮你从“看不懂电路图”到“能调个简单电机”。 电机控制不是“大神专属”,只要掌握“电生磁、磁生力”的底层逻辑,加上动手实践,小白也能快速入门。这篇博客会陪你从“看电机转”到“让电机听话”,把复杂的控制原理变成能上手玩的“小实验”。准备好你的面包板和电机,我们一起开启“电控之旅”吧!

汽车电子软件领域知识分享 5621

《从代码工匠到架构大师》--- 架构演进史

本文将通过六大核心阶段——单体架构、垂直应用架构、分布式架构、SOA架构、微服务架构、服务网格与云原生架构——解析软件架构如何随着时代变迁而进化,并附上每种架构的架构图,以及探讨其背后的技术逻辑与业务动因。

xianzehua的专栏 1110

广东省道路工程检测练习试题(单选题)真题

1.一般项目的合格点率应达到( ),且不合格点的最大偏差值不得大于规定允许偏差值的1.5倍。A.不低于75%B.不低于80%C.不低于85%D.不低于90%答案:B2.进行土路基平整度检测时,当路宽小于9m,检测点数应为( )A.1B.2C.3D.4答案:A3.根据《城镇道路工程施工与质量验收规范》,在分部工程中,根据工种、材料、施工工艺等划分的是( )A.单位工程B.分项工程C.分部工程D.工序工程答案:B4.根据《城镇道路工程施工与质量验收规范》,土方路基压实度的检测频率为每1000m每压实层抽检( )

ZShy001238的博客 686

程序员必知之前端演进史

摘要: 程序员必知之前端演进史 细细整理了过去接触过的那些前端技术,发现前端演进是段特别有意思的历史。人们总是在过去就做出未来需要的框架,而现在流行的是过去发明过的。如,响应式设计不得不提到的一个缺点是:它只是将原本在模板层做的事,放到了样式(CSS)层来完成。 程序员必知之前端演进史 细细整理了过去接触过的那些前端技术,发现前端演进是段特别有意思的历史

yunqishequ1的博客 752

基于 YOLOv26 的金属表面缺陷检测系统:智能视觉质检方案

摘要: 基于YOLOv26的金属表面缺陷检测系统采用深度学习技术,实现对划痕、裂纹、腐蚀等8类常见缺陷的自动化检测。系统通过数据增强预处理和YOLOv26模型的高精度识别能力,具备多类别分类、实时推理和强鲁棒性特点,适用于不同金属材质与光照条件。架构包含数据采集、预处理、YOLOv26检测和后处理模块,代码实现采用PyTorch框架,支持训练数据增强与标准化处理,为工业质检提供高效智能解决方案。

一键难忘的博客 591

深度学习-176-知识图谱技术之langchain与neo4j的嵌入向量Neo4jVector

使用Neo4jVector将输入的文档向量化,并创建向量索引,然后进行语义检索。

qq_20466211的博客 440

编程语言演进史:从汇编到高级语言的变革

从汇编语言到现代高级语言,编程语言的演进是一个不断追求更高编程效率、更好代码可读性和可维护性、更强硬件适应性的过程。每一种编程语言都在特定的历史时期和应用领域发挥了重要作用,推动了计算机技术的发展和应用的普及。随着计算机技术的持续创新,如人工智能、大数据、云计算等新兴领域的崛起,编程语言也将不断发展和创新,以满足新时代的编程需求,为程序员提供更强大、更便捷的编程工具。图注:编程语言演进历程示意图。

xiayan827的博客 1247

华为服务器BMC方式安装系统-官方文档解读

华为服务器BMC方式安装系统 安装完成之后我们有两种方式去安装系统, > 一、服务器连接显示屏、键盘、鼠标和启动盘去启动服务器安装系统(弊端:需要制作单独启动盘并且需要硬件资源) > 二、使用BMC方式安装系统,也就是说使用网线连接我们的笔记本和服务器的BMC口或者mgt口去进行安装。

王明的博客 4580

5G 浪潮来袭!程序员在风口中有何机遇?

整理 | 胡巍巍出品 | 优快云(ID:优快云news)七月流火,上蒸下煮的大暑小暑,是我们奋斗的注脚。5G牌照发布了,高考榜单揭晓了,白天更长了,但是程序员下班,仍...

优快云资讯 1万+

手把手教你学simulink实例--基于Simulink的储能系统性能评估与仿真

储能系统是现代能源体系中的关键组成部分,广泛应用于可再生能源并网、电网调峰调频、电力质量改善以及电动汽车充电等领域。为了提高储能系统的运行效率和可靠性,对其性能进行准确评估至关重要。基于MATLAB/Simulink平台,可以构建储能系统的动态模型,并通过仿真分析其在不同工况下的性能表现。本项目旨在研究储能系统的建模方法、控制策略及其性能评估指标,并通过Simulink仿真验证系统的动态特性和稳态性能。

MHD0815的博客 195

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

下一篇: 北京面试:Java程序员一天收33个面试通知,面试经验让你弯道超车
普通网友
博客等级 码龄8年 342粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值