Sprng Cloud学习笔记之单体架构和微服务架构

微服务架构
目前微服务是非常火的架构或者说概念,也是在构建大型互联网项目时采用的架构方式。

单体架构

一个归档包(可以是JAR、WAR、EAR或其它归档格式)包含所有功能的应用程序,通常称为单体应用。单体架构中,所有的业务模块都编写在一个项目中,最终打成war包运行。

软件设计中,经常提及和使用经典的3层模型:表示层,业务逻辑层和数据访问层。

  • 表示层:用于直接和用户交互,也称为交互层,通常是网页,UI等
  • 业务逻辑层:即业务逻辑处理层,例如用户输入的信息要经过业务逻辑层的处理后,才能展现给客户。
  • 数据访问层:用于操作数据库,用户在表示层会产生大量的数据,通过数据访问层对数据库进行读写操作。

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

在这里插入图片描述

单体架构的优点:

  • 部署简单:由于是完整的结构体,直接部署在一个服务器上即可。
  • 技术单一:项目不需要复杂的技术栈,往往一套熟悉的技术栈就可以完成开发。
  • 成本低:从业务接口到数据库,可以全部由一个程序员来完成。

单体架构的缺点:

  • 系统启动慢,部署频率低。随着代码的增加,构建和部署的时间也会增加。而在单体应用中,每次功能的变更或缺陷的修复都会导致我们需要重新部署整个应用。全量部署的方式耗时长、影响范围大、风险高,这使得单体应用项目上线部署的频率较低,从而又导致两次发布之间会有大量功能变更和缺陷修复,出错概率较高。
  • 系统错误隔离性差、可用性差,整个项目包含的模块非常多,模块的边界模糊,依赖关系不清晰,代码质量参差不齐……整个项目非常复杂。每次修改代码都心惊胆战,甚至添加一个简单的功能,或者修改一个BUG都会造成隐含的缺陷。
  • 系统扩展能力差,单体应用只能作为一个整体进行扩展,无法结合业务模块的特点进行伸缩。
  • 线上问题修复周期长,任何一个线上问题都修复都需要对整个系统进行全面升级。
  • 阻碍技术创新。单体应用往往使用统一的技术平台或方案解决所有问题,团队的每个成员都必须使用相同的开发语言和架构,想要引入新的框架或技术平台非常困难。(技术单一既是优点也是缺点)

微服务架构

Martin Fowler是这么描述微服务的:
微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每一个服务运行在自己的进程中,服务间通信采用的轻量级通信机制(通常用HTTP资源API)。这些服务公用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。

百度百科中对微服务架构的描述:
微服务架构是一项在云中部署应用和服务的新技术。大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务,而红帽说API应该是重点。
微服务可以在“自己的程序”中运行,并通过“轻量级设备与HTTP型API进行沟通”。关键在于该服务可以在自己的程序中运行。通过这一点我们就可以将服务公开与微服务架构(在现有系统中分布一个API)区分开来。在服务公开中,许多服务都可以被内部独立进程所限制。如果其中任何一个服务需要增加某种功能,那么就必须缩小进程范围。在微服务架构中,只需要在特定的某种服务中增加所需功能,而不影响整体进程。
微服务不需要像普通服务那样成为一种独立的功能或者独立的资源。定义中称,微服务是需要与业务能力相匹配,这种说法完全正确。不幸的是,仍然意味着,如果能力模型粒度的设计是错误的,那么,我们就必须付出很多代价。如果你阅读了Fowler的整篇文章,你会发现,其中的指导建议是非常实用的。在决定将所有组件组合到一起时,开发人员需要非常确信这些组件都会有所改变,并且规模也会发生变化。服务粒度越粗,就越难以符合规定原则。服务粒度越细,就越能够灵活地降低变化和负载所带来的影响。然而,利弊之间的权衡过程是非常复杂的,我们要在配置和资金模型的基础上考虑到基础设施的成本问题。
在这里插入图片描述
微服务架构的优点

  • 易于开发和维护:一个微服务只会关注一个特定的业务功能,所以它业务清晰,代码量少。开发和维护单个微服务相当简单。而整个应用是若干个微服务构建而成的,所以整个应用也被维持在一个可控状态。
  • 单个微服务启动较快:单个微服务代码量较少,所以启动会比较快。
  • 局部修改容易部署:单个应用只要有修改,就得重新部署整个应用,微服务解决了这样的问题。一般来说,对某个为服务进行修改,只需要重新部署这个服务即可。
  • 技术栈不受限:在微服务架构中,可以结合项目业务及团队的特点,合理选择技术栈。例如某些服务可以使用关系型数据库Mysql,有些服务可以使用非关系型数据库如redis;甚至可以根据需求,使用不同的开发语言。
  • 按需收缩:可根据需求,实现细粒度的扩展。例如,系统中的某个微服务遇到了瓶颈,可以结合这个微服务的业务特点,增加内存、升级CPU或者增加节点。

微服务架构的缺点

  • 运维要求较高:更多的服务意味着更多的运维投入。在单体架构中,只需要保证一个应用的正常运行。而在微服务中,需要保证几十甚至几百个服务正常运行与协作,这给运维带来了很大的挑战。
  • 分布式固有的复杂性:使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟等都会带来巨大的挑战。
  • 接口调整成本高:微服务之间通过接口进行通信。如果修改某一个微服务API,可能所有使用该接口的微服务都需要调整。

猜你喜欢

转载自blog.csdn.net/wangruoao/article/details/83022144