【初出江湖】剖析软件架构发展之路

2024-09-01 17:12

本文主要是介绍【初出江湖】剖析软件架构发展之路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录标题

  • 架构发展历程
    • 单体架构(Monolithic)
    • 垂直拆分
    • 分布式服务
    • 微服务架构
  • SOA
  • ESB
  • 分布式
  • 微服务
  • SOA,ESB,微服务的区别和关系
  • 分布式与微服务之间的区别于关系

架构发展历程

单体架构(Monolithic)

单体应用时代:应用程序无论如何分层,都是一个解决方案,或者说都是一个项目,这里的“解决方案”和“项目”不是我们使用的Visual Studio里面的概念,最终的程序代码都会在一个进程里运行。

  • 优点:开发简单,集中管理,没有分布式的损耗,都是系统进程内的通信。
  • 缺点:不好维护,升级困难,耦合严重,无法应付高并发和大数据场景,无法快捷迭代。

垂直拆分

随着业务规模的越来越庞大,系统设计就越来越复杂,大的系统就开始进行业务的垂直拆分。比如:有专门做商品秒杀的部门,有专门做生鲜商品的部门,有专门做超市的部门,等等,当然这是根据部门天生划分的,也有根据业务需求进行系统划分的。

  • 优点:垂直拆分,系统独立部署和维护,每个系统在自己进程内执行,分而治之。
  • 缺点:拆分越多,存储越复杂,系统间重复的东西也越多,单个系统还是单体模式。

分布式服务

随着业务系统的越来越庞大,软件系统设计起来越来越复杂。为了避免过度复杂的业务需求,开始对业务系统的进行垂直拆分,形成多个独立的业务系统,如果多个系统之间要通信,可以通过跨进程的技术完成通讯。但是垂直拆分也导致了大量重复代码、重复模块的产生,比如:用户模块、日志模块、支付模块、认证授权模块等,这样分散的代码也给系统的维护和升级带来了困难。我们对业务重新划分,把独立的模块接口化、服务化,提高重用,这个时候,我们就开始进入了分布式服务的时代。

优点:

  • 独立进程部署,独立进程运行,独立演化。服务之间可以做到高内聚,低耦合。
  • 独立开发和维护,业务解耦,无论是业务系统还是分布式服务都独立演化。
  • 分布式管理
  • 隔离性增强
  • 由一系列服务组装成系统,不用重复建设,模块、代码可以复用。

缺点:

  • 数据一致性(多服务完成一个任务)和系统的可用性(集群)成为问题
  • 数据库也进行了拆分
  • 维护、设计、架构成本增加,调试、纠错更难
  • 网络传输分布式损耗成本
  • 不适合高并发和大数据的环境

微服务架构

微服务的出现时分布式架构已经很成熟了,架构中各种问题已经有了很成熟的解决方案,对于现在的业务系统来说,分布式架构已经变成了一种常规手段,这个时候,微服务就出现了。微服务架构是一个用分布式服务拆分业务逻辑,完成解耦的架构模式(架构风格)。微服务肯定是分布式的一种,是在分布式技术成熟之后,然后把分布式当成解耦手段来架构系统——因为拆分的服务很细致,服务数量规模开始变多了,服务的体量开始缩小了,由以前几个大的服务,转变为多个独立运行的、原子性质的服务。如图:
在这里插入图片描述

微服务最重要的特性是:

  • 可用性:描述一个系统在一段时间内提供有用资源的能力,从而减少停工时间,而保持其服务的高度可用性。
  • 伸缩性:根据需求动态添加和删除系统中资源的能力,是水平或垂直扩展的专门实现。

集群(负载均衡)可以解决系统的高可用和伸缩特性。

优点:

  • 可以使用不同语言或者相同语言的不同版本开发各个模块。
  • 系统耦合性低,各个模块分而治之,独立部署,独立发布,独立维护。
  • 可以更快的相应市场的需求,更符合敏捷开发。
  • 可以对不同模块使用集群策略,哪里有问题治哪里。

缺点:

  • 开发难度更大,系统结构更复杂。
  • 运行效率低,网络调用成本很大。

SOA

SOA----面向服务架构,实际上强调的是软件的一种架构,一种支撑软件运行的相对稳定的结构,表面含义如此,其实SOA是一种通过服务整合来解决系统集成的一种思想。不是具体的技术,本质上是一种策略、思想。

简单的理解,我们可以把SOA看作是模块化的组件,每个模块都可以实现独立功能,而不同模块之间的结合则可以提供不同的服务,模块之间的接口遵循统一标准,可以实现低成本的重构和重组。在SOA的技术框架下,可以把杂乱无章的庞大系统整合成一个全面有序的系统,从而增加企业在业务发展过程中应用系统的灵活性,实现最大的IT资产利用率。

SOA是一种理念,有去中心化和中心化两种实现方式,ESB是SOA的中心化实现。SOA的特征:可重用、松耦合、明确定义的接口、无状态的服务设计、基于开放标准。解决了分布式的缺点。SOA体系结构中的角色包括:服务请求者、服务提供者、服务注册中心。实际上SOA只是一种架构设计模式,而SOAP、REST、RPC就是根据这种设计模式构建出来的规范!

ESB

ESB----企业服务总线,像一根“聪明”的管道,用来连接各个“愚笨”的节点。为了集成不同系统,不同协议的服务,ESB做了消息的转换解释与路由等工作,让不同的服务互联互通。

分布式

分布式系统面向的是运维,更多的是考虑系统性能和部署环境之间的问题,通过分布式解决在没有大型主机的部署环境情况下,系统性能的高可用和吞吐量,是个一个很早就提出来的一个概念,是由集中式系统过渡来的,随着计算机系统向网络化和微型化的发展日趋明显,同时业务的发展,传统的集中式处理模式越来越不能适应人们的需求,学习成本高,大型主机贵、容错性差,扩容困难。

为了解决业务快速发展给IT系统带来的巨大挑战,从2009年开始,阿里集团启动了去IOE计划,其电商系统开始正式迈入分布式系统时代。

在《分布式系统概念与设计》生一书中,对分布式系统做了如下定义:

「分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。」

微服务

微服务 (Microservices) 是一种软体架构风格,它是以专注于单一责任与功能的小型功能区块 (Small Building
Blocks) 为基础,利用模组化的方式组合出复杂的大型应用程式,各功能区块使用与语言无关
(Language-Independent/Language agnostic) 的API 集相互通讯。 微服务的起源是由 Peter
Rodgers 博士于 2005 年度云端运算博览会提出的微 Web 服务 (Micro-Web-Service) 开始,Juval
Löwy 则是与他有类似的前导想法,将类别变成细粒服务 (granular services),以作为 Microsoft
下一阶段的软体架构,其核心想法是让服务是由类似 Unix 管道的存取方式使用,而且复杂的服务背后是使用简单 URI
来开放介面,任何服务,任何细粒都能被开放 (exposed)。这个设计在 HP 的实验室被实现,具有改变复杂软体系统的强大力量。
2014年,Martin Fowler 与James
Lewis共同提出了微服务的概念,定义了微服务是由以单一应用程式构成的小服务,自己拥有自己的行程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用
HTTP API 通讯。同时服务会使用最小的规模的集中管理 (例如 Docker) 能力,服务可以用不同的程序语言与资料库等元件协作。

微服务架构更多的是面向开发,更多的是考虑编码和项目业务之间的问题,根据功能把应用拆分为服务。解决的是开发问题和应用复杂性,是在对于业务的快速发展中单体应用不能满足需要的时候,提出来的一个概念!

在《微服务架构设计模式》一书中对微服务架构做如下定义:把应用程序功能性分解为一组服务的架构风格。

SOA,ESB,微服务的区别和关系

我们看到微服务架构的些特点与 SOA 服务化架构相似, 事实上微服务架构与 SOA服务化架构并不冲突,它们一脉相承,却略有不同:

区别说明
目的不同微服务使用 系列的微小服务来实现整体的业务流程,目的是有效地拆分应用,实现敏捷开发和部署,在每个微小服务的团队里,减少了跨团队的沟通,让专业的人做专业的事,缩小变更和迭代影响的范围,并达到单一微服务更容易水平扩展的目的。SOA 服务化涉及的范围更广 些,强调不同的异构服务之间的协作和契约 ,并强调有效集成、业务流程编排、历史应用集成等,典型代表为 Web Service 和ESB。
部署方式不同微服务将完整的应用拆分成多个细小的服务,通常使用敏捷扩容、缩容的 Docker 技术来实现自动化的容器管理 每个微服务运行在单 的进程内,微服务中的部署互相独立互不影响。SOA 服务化通常将多个业务服务通过组件化模块方式打包在 War 包里,然后统部署在一个应用服务器上。
服务粒度不同微服务倡导将服务拆分成更细的粒度,通过多个服务组合来实现业务流程的处理,拆到职责单一,甚至小到不能再进行拆分。SOA对粒度没有要求,在实践中服务通常是粗粒度的,强调接口契约的规范化,内部实现可以更粗粒度。

SOA去中心化的实现方式的根本诉求是扩展性,实现方式就是微服务。

分布式与微服务之间的区别于关系

「分布式系统」 更多是偏水平扩展,在ops方面的解决办法,利用部署系统环境的空间分布性,比如SOA架构中利用分布式集成大型、复杂的单体应用程序;比如对实例进行克隆,以副本的形式对应用的数据和服务提供一种冗余方式(数据副本和服务副本),从而对外提供高可用,高并发的服务。分布式需要解决分布式数据一致性以及分布式环境通信异常、网络分区等问题。比如通过Zookeeper解决分布式数据一致性的问题。分布式系统可以理解为以解决硬件层面的压力从而对应用进行扩展。

「微服务架构」 更多的是垂直方向的扩展,在dev方面解决问题,利用应用程序的功能性分解,,把应用拆分为一组服务,每个服务负责特定的功能。每个服务都相对较小并容易维护,使大型的复杂应用程序可以持续交付和持续部署。服务可以独立部署、可以独立扩展。同时微服务架构可以实现团队的自治。更容易实验和采纳新的技术。更好的容错性。即服务之间松耦合,但是单个服务又是高内聚的。微服务架构可以理解为解决软件层面的压力对应用进行扩展。

两者不属于包含关系,都是对于应用扩展的不同解决办法。一般情况下,微服务架构的应用一般为分布式系统。但分布式系统不一定是微服务架构。

在这里插入图片描述

这篇关于【初出江湖】剖析软件架构发展之路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127552

相关文章

从戴尔公司中国大饭店DTF大会,看科技外企如何在中国市场发展

【科技明说 | 科技热点关注】 2024戴尔科技峰会在8月如期举行,虽然因事未能抵达现场参加,我只是观看了网上在线直播,也未能采访到DTF现场重要与会者,但是通过数十年对戴尔的跟踪与观察,我觉得2024戴尔科技峰会给业界传递了6大重要信号。不妨简单聊聊:从戴尔公司中国大饭店DTF大会,看科技外企如何在中国市场发展? 1)退出中国的谣言不攻自破。 之前有不良媒体宣扬戴尔将退出中国的谣言,随着2

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易

新一代车载(E/E)架构下的中央计算载体---HPC软件架构简介

老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节能减排。 无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事.而不是让内心的烦躁、焦虑、毁掉你本就不多的热情和定力。 时间不知不觉中,快要来到夏末秋初。一年又过去了一大半,成

【IT】软件行业发展的前瞻性和希望的广度

我说一下我对程序应用的一个看法就是 我其实个人不太建议自动驾驶技术的发展因为这个东西它说到底还是什么那么一点安全隐患 ,虽然我们平常考虑用同时实行各种各样的高级的自动作用, 但是自动驾驶可能是个特例,其实我个人觉得程序可以在以下方面发展 1.医学(包括诊断 治疗 手术等)因为现在也有很多的疾病是医学还没有能力去解决的 ,2.国防 有的时候因为国家安全真的非常重要的,因为我们每个人

深度剖析AI情感陪伴类产品及典型应用 Character.ai

前段时间AI圈内C.AI的受够风波可谓是让大家都丈二摸不着头脑,连C.AI这种行业top应用都要找谋生方法了!投资人摸不着头脑,用户们更摸不着头脑。在这之前断断续续玩了一下这款产品,这次也是乘着这个风波,除了了解一下为什么这么厉害的创始人 Noam Shazeer 也要另寻他路,以及产品本身的发展阶段和情况! 什么是Character.ai? Character.ai官网:https://

最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)

文章目录 一、自动配置概念二、半自动配置(误~🙏🙏)三、源码分析1、验证DispatcherServlet的自动配置2、源码分析入口@SpringBootApplication3、@SpringBootConfiguration的@Configuration4、@EnableAutoConfiguration的@AutoConfigurationPackage和@Import5、Auto

C语言深度剖析--不定期更新的第四弹

哈哈哈哈哈哈,今天一天两更! void关键字 void关键字不能用来定义变量,原因是void本身就被编译器解释为空类型,编译器强制地不允许定义变量 定义变量的本质是:开辟空间 而void 作为空类型,理论上不应该开辟空间(针对编译器而言),即使开辟了空间,也只是作为一个占位符看待(针对Linux来说) 所以,既然无法开辟空间,也无法作为正常变量使用,既然无法使用,干脆编译器不让它编译变

Java CAS 原理剖析

在Java并发中,我们最初接触的应该就是synchronized关键字了,但是synchronized属于重量级锁,很多时候会引起性能问题,volatile也是个不错的选择,但是volatile不能保证原子性,只能在某些场合下使用。   像synchronized这种独占锁属于悲观锁,它是在假设一定会发生冲突的,那么加锁恰好有用,除此之外,还有乐观锁,乐观锁的含义就是假设没有发生冲突,那么我正

系统架构的发展历程之模块化与组件化

模块化开发方法 模块化开发方法是指把一个待开发的软件分解成若干个小的而且简单的部分,采用对复杂事物分而治之的经典原则。模块化开发方法涉及的主要问题是模块设计的规则,即系统如何分解成模块。而每一模块都可独立开发与测试,最后再组装成一个完整软件。对一个规约进行分解,以得到模块系统结构的方法有数据结构设计法、功能分解法、数据流设计和面向对象的设计等。将系统分解成模块时,应该遵循以下规则: (1)最高模

STL源码剖析之【二分查找】

ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。      ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val