教育培训 > 软件产品架构中什么是单体架构、SOA架构、微服务架构?

软件产品架构中什么是单体架构、SOA架构、微服务架构?

2020-07-31 21:13阅读(61)

软件产品架构中什么是单体架构、SOA架构、微服务架构?单体架构、SOA架构、微服务架构的区别是什么。:软件产品架构是不断迭代演化的,从单体服务架构发展到现在

1

软件产品架构是不断迭代演化的,从单体服务架构发展到现在的服务化、微服务的架构。

单体架构

单体架构就是所有的业务模块都是耦合在一个项目中,开发、部署都在一起;如果其中一个模块需要上线升级,那么所有模块都要一起启停;

在早期,单体架构的项目团队成员需要是“全栈”,因为前端、后端、数据库都是一波人负责,后来开始进行了逻辑分层,团队也分成了前端 UI 团队、后端和 DBA 团队,每个团队都有自己负责的职责。

然而随着业务逻辑越来越复杂,模块和模块之间的耦合度越来越高;另外随着用户和数据量的增多,单体架构也不再能够支撑高并发和大数据。

SOA 架构

为了解决上面的问题,SOA 出现了。

SOA 代表了面向服务的架构,SOA 将应用程序的业务模块进行拆分,形成独立的应用系统,系统和系统之间通过明确的接口串联起来;

每个系统内部结构和逻辑发生改变,并不影响对外提供的服务,只要保持接口不变,服务内部对外是透明的;

SOA 架构中,服务定义标注的接口,可以提供给多个调用方使用,增加了服务的重用性。

SOA 架构时代有两个很重要技术实现方式:Web Service 和 ESB :前者提供了标准的数据传输协议,后者实现了服务编排和协议转换。

微服务架构

但是随着用户和数据量的进一步增长,SOA 也暴露出来一些缺点,比如 SOAP 协议、XML较重;服务管理不完善;ESB本身就比较重,而且它本身算是一个单点,在软件架构中,单点意味着风险。

在微服务的架构中,各个微服务可以独立开发,独立部署;微服务之间通常使用Restful风格的API通信,传输格式也通常选择JSON;

微服务是SOA架构的延续,它们和单体应用相比,大大提高了系统的负载能力,解决了应用高并发的需求;

服务和服务之间的耦合度也被降低,并且项目团队可以被拆分成多个小团队,每个微服务都可以进行敏捷开发部署;

每个团队的技术栈也可以不相同,只要遵守接口协议即可。

至于微服务和 SOA 架构的区别,我是这样理解的:SOA 架构和微服务架构都属于分布式架构,分布式的思想就是把不同的业务模块,部署在不同的服务器上,以应对高并发的问题;SOA 是一种分布式架构,把业务系统分成多个子系统,提供不同的服务,再通过服务组合、编排实现业务流程;微服务是SOA的升华,如果非要说点儿不同的,那么微服务更加强调服务的细分和专业,去ESB总线、去中心化,部署粒度更细,服务扩展更灵活。

当然SOA、微服务的出现,在解决一些问题的时候,也带来了另外一部分的问题,比如增加了网络开销、服务依赖性、增加了测试运维难度、数据一致性问题等等。

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

2



单体架构

在传统IT行业的软件系统设计大多都是各种独立子系统的堆砌,这也就是所说的单体架构,其本身扩展性差,可靠性低,维护成本高。单体架构在初期系统规模比较小的情况下尚且能够较好的支撑,但是随着系统规模的扩大,它暴露出来的问题也越来越多,主要有以下几点:

  • 复杂性逐渐变高,问题修复和新功能开发难度和成本高,引入新问题的可能性变大。同时,任意模块的缺陷都可能会影响整个系统,可靠性低。
  • 随着人员流动,加之复杂性高,新的问题很难被发现和解决,久而久之,问题逐渐变多,变难、变大,技术债务逐渐上升。
  • 随着模块不断集成,部署速度逐渐变慢
  • 想进行整体的技术创新基本不可能,阻碍技术创新
  • 垂直和水平的可扩展性差

SOA架构

随后,引入了SOA服务化(面向服务的架构,它将应用程序的不同功能单元(服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来)。但是,由于 SOA 早期均使用了ESB总线模式,这种总线模式与某种技术栈是强绑定的,如,J2EE。这又使得很多企业的遗留系统很难对接,切换时间太长,对接成本太高,新系统稳定性的收敛也需要一些时间。最终 SOA 看起来很美,但却成为了企业级奢侈品,中小公司都望而生畏。


SOA服务化思想下的微服务架构

微服务是在 SOA 上做的升华,微服务最早由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP Rest API的方式(告别ESB服务总线),这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。

简单讲,微服务不再强调传统SOA架构里面比较重的ESB服务总线,同时将SOA的思想延伸到单个业务系统内部实现真正的组件化。微服务架构强调的一个重点是“业务需要彻底的组件化和服务化”。

从微服务的概念可以看出它有如下好处:

  • 每个服务可以独立开发,易于开发,提高开发人员的生产效率
  • 局部修改容易部署
  • 技术栈不受限
  • 单个服务支持独立部署和发布,可以进行快速迭代部署,更快的交付时间
  • 更有利于业务的扩展,可伸缩性强

转自 @软件测试开发技术栈 ,希望对您有所帮助。

3

单体架构:

单体机构是指在软件设计中使用经典的 3 层模型,即表示层、业务逻辑层和数据访问层。虽然在设计中划分了 3 层模型,但是对业务场景没有划分。一个典型的单体应用就是将所有的业务场景的表示层、业务逻辑层和数据访问层放在一个工程中,最终经过编译、打包,部署在一台服务器上。

优点

  1. 易于开发: 单体应用程序开发相对简单,容易理解,单个程序员可以完成业务接口到数据库的整个流程。
  2. 部署简单: 由于是完整的结构体,可以直接部署在一个服务器上即可。
  3. 技术单一: 项目不需要复杂的技术栈,往往一套熟悉的技术栈就可以完成开发。

缺点

  1. 开发成本高:代码重复率高,需求变更困难,无法满足新业务快速上线和敏捷交付。
  2. 系统稳定性差:任何一个模块的错误均可能造成整个系统的宕机;
  3. 扩展能力受限:系统的扩容只能只对这个应用进行扩容,不能做到对某个功能点进行扩容,关键性的代码改动一处多处会受影响。

SOA架构:

SOA架构即面向服务架构,是一种粗粒度、松耦合服务架构。基于SOA服务思想进行功能的抽取,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来,以服务为中心各个系统之间依靠ESB企业服务总线进行调用,这使得构件在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。

优点:

  1. 敏捷性:可以直接利用现有的资源进行组合,让后在按照自己的客户需求,进行进一步的开发。
  2. 扩展性:可以更具不同的需求,进行重新的组合和构造。
  3. 易维护:服务的提供者和使用者是松耦合关系,开放标准接口的采用,使其具有很好的维护性和可用性。

缺点:

  1. 开发难度: 架构设计、服务抽取、接口设计等问题,考验着领导者和开发人员过硬的技术能力。
  2. 数据统一:存在“脏数据”相关问题,处理一致性是设计服务接口面临的巨大挑战之一。

微服务架构:

微服务架构是把一个大型的单个应用程序和服务拆分为多个的微服务,每个微服务仅关注并很好的完成一件任务。它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持。

优点:

  1. 独立性:是每个微服务组件都是简单灵活的,能够独立部署。
  2. 可扩展性:微服务之间是松耦合的,微服务内部是高内聚的,每个微服务很容易按需扩展,产品迭代周期更短。
  3. 隔离性:每个微服务都是独立的运行,任何一个或者多个微服务的失败只影响自己或者少量其他微服务,而不会大面积地波及整个服务运行体系。

缺点:

  1. 复杂性:开发的复杂性增加,因为一个业务流程需要多个微服务通过网络交互来完成。
  2. 服务治理:微服务过多,服务治理成本高,不利于系统维护。

其实,这三者到现在来说未必是那样经纬分明、非此即彼,很多基于微服务的单体架构应用、结合分布式的SOA云服务总线来实现线上线下集成、内部跟外部集成、构建柔韧的企业IT架构、满足业务的变化、推动业务创新和变革,是软件架构不断优化、变迁、提升的源动力。

数通畅联专注于企业IT架构、SOA综合集成、数据治理分析领域,感谢您的阅读与关注

4

一图了解什么是单体架构、SOA架构、微服务架构



分别从三个维度来展示:

1、软件过程维度

单体架构通常采用瀑布模型开发;

SOA架构通常采用敏捷/XP编程模式;

微服务架构采用DevOps,使用IT交付流水线来全自动管理;

2、从架构维度

单体架构通常采用巨石结构,不易维护;

SOA架构通常以服务的方式对外连接,常见的支撑平台有ESB企业服务总线进行服务贯通;

微服务架构采用更细的拆分模式,每个独立的模块有单独的数据库、运行环境,在业务上完成一个具体的功能;

3、从部署形态维度

单体架构早期多运行在物理机中,当然后期也可以运行在虚拟化资源中;

SOA架构多运行在虚拟化/IAAS平台上;

微服务架构目前多运行在容器平台上(当然也可以运行在虚拟化资源和物理机中,这种情况享受不到容器带来的便利性);

5

单体架构就是一个应用所有代码在一起,部署一台会几台相同的代码。