微服务架构详细讲解——为什么要使用微服务架构,它的优点设计原则等(Spring cloud学习笔记 1)

文章目录

    • 前言:
    • 一、传统的单体架构
        • 1.1 什么是单体架构?
        • 1.2 单体架构的缺点
    • 二、什么是微服务?
    • 三、微服务架构的特性
    • 四、微服务架构的优点
    • 五、微服务架构带来的问题
    • 六、微服务架构的设计原则

前言:

Spring Cloud系列教程的所有博客均在下方的目录链接中,方便大家查找和阅读。建议按照顺序学习,对于项目搭建有疑问的可以着重看目录里的第二篇博客。
Spring cloud学习专栏目录

一、传统的单体架构

1.1 什么是单体架构?

如下图所示的这种单体架构,也是我们接触的最多的架构。一个归档包(如war包)包含了应用的所有功能模块,然后发布到如tomcat的服务器中进行使用
微服务架构详细讲解——为什么要使用微服务架构,它的优点设计原则等(Spring cloud学习笔记 1)_第1张图片

1.2 单体架构的缺点

  1. 复杂性高
    如果遇到大型项目,整个项目包含的模块非常多,模块的边界可能比较模糊,依赖关系不清晰,代码质量也参差不齐,整个项目将会非常复杂。每次修改代码,添加一个简单的功能,或者修改一个BUG都会造成隐含的缺陷。
  2. 技术债务
    随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务,并且越积越多。“不坏不修(Not broken,don’t fix)”,这在软件开发中非常常见,在单体应用中这种思想更甚。已使用的系统设计或代码难以修改,因为应用程序的其他模块可能会以意料之外的方式使用它。
  3. 部署频率低
    随着系统功能的不断增加,代码量增多,构建和部署的时间也会增加。而在单体架构应用中,每次功能的变更或缺陷的修复都会导致我们需要重新部署整个应用。所以无论改动的大小,哪怕只是改了一行代码,部署的成本也不会减少。全量部署的方式耗时长、影响的范围大、风险高,这使得单体应用项目上线部署的频率较低,不能频繁的进行发布。而部署频率低又导致两次发布之间会有大量的功能变更和缺陷修复,出错概率比较高。
  4. 扩展能力受限
    单体架构应用只能作为一个整体进行扩展,无法结合业务模块的特点进行调整。例如,应用中有的模块是计算密集型的,它需要性能较好CPU;有的模块则是IO密集型的,需要更大的内存。由于这些模块部署在一起,我们不得不在硬件的选择上做出妥协,如果既要较好的CPU又要较大的内存,那么服务器的搭建成本将会很大。
  5. 阻碍技术创新
    单体架构应用往往使用统一的技术平台或方案解决所有问题,团队的每个成员都必须使用相同的开发语言和框架,想要引入新的框架或技术平台会非常困难。例如,一个使用Struts 2构建的、100万行代码的单体应用,如果想要换用Spring MVC,切换成本无疑是非常高的。又例如你想在某一个模块中使用另一种语言进行编写,会更加简单快捷,但这在单体架构中也是不可行的。

二、什么是微服务?

简介: 微服务架构这种开发方法,是以开发一组小型服务的方式来开发一个独立的应用系统。其中每个小型服务都运行在自己的进程中,并经常采用HTTP资源API这样轻量的机制来相互通信。这些服务围绕业务功能进行构建,并能通过全自动的部署机制来进行独立部署。这些微服务可以使用不同的语言来编写,并且可以使用不同的数据存储技术。对这些微服务我们仅做最低限度的集中管理。

三、微服务架构的特性

如下图所示我们可以看出微服务的以下特性,也可以对比单体架构的图发现他们之间的差别。

  1. 每个微服务都独立运行在自己的进程里;
  2. 一系列独立运行的微服务共同构建起整个系统;
  3. 每个服务为独立的业务开发,一个微服务只关注某个特定的功能,只负某一个模块的开发,对应自己模块的数据库;
  4. 微服务之间通过一些轻量的通信机制进行通信,例如通过REST API进行调用
  5. 不同的微服务可以使用不同的语言与数据存储技术;
  6. 具备全自动的部署机制。
    微服务架构详细讲解——为什么要使用微服务架构,它的优点设计原则等(Spring cloud学习笔记 1)_第2张图片

四、微服务架构的优点

  1. 易于开发和维护
    一个微服务只关注一个特定的业务功能,所以它的业务清晰、代码量较少。开发和维护单个微服务相对是比较简单的。而整个应用是由若干个微服务构建而成的,所以整个应用也会维持在可控状态。
  2. 单个微服务启动较快
    单个微服务代码量较少,所以启动会比较快。
  3. 局部修改容易部署
    单体应用只要有修改,就得重新部署整个应用,微服务解决了这样的问题。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可。
  4. 技术栈不受限
    在微服务中,我们可以结合项目业务及团队的特点,合理地选择技术栈。例如某些服务可使用关系型数据库MySQL;某些微服务有图形计算的需求,我们可以使用Neo4J;甚至可以根据需要,部分微服务使用Java开发,部分微服务使用NodeJS进行开发。
  5. 按需伸缩
    我们可以根据需求,实现细粒度的扩展。例如:系统中的某个微服务遇到了瓶颈,我们可以结合这个微服务的业务特点,增加内存、升级CPU或者是增加节点,节约了硬件成本。

五、微服务架构带来的问题

  1. 运维要求较高
    更多的服务意味着更多的运维投入。在单体架构中,只需要保证一个应用的正常运行;而在微服务中,需要保证几十甚至几百个服务的正常运行与协作,这给项目的运维带来了很大的挑战。
  2. 分布式固有的复杂性
    使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟、分布式事务等都带来了很大的挑战。
  3. 接口调整成本高
    微服务之间通过接口进行通信。如果修改某一个微服务的API,可能所有使用了该接口的微服务都需要做调整。
  4. 重复劳动
    很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复。

六、微服务架构的设计原则

  1. 单一职责原则
    每个微服务只负责一个独立的模块,尽量减少与其他模块的耦合
  2. 服务自治原则
    服务自治,是指每个微服务应该具备独立的业务能力、依赖与运行环境。每个服务从开发、测试、构建、部署,都应当可以独立运行,而不应该依赖其他服务。
  3. 轻量级通信原则
    微服务之间应该通过轻量级通信机制进行交互。轻量级通信机制应该具备两点:首先是它的体量较轻;其次是它应该是跨语言、跨平台的。例如REST协议(GET、POST、PUT、DELETE)
  4. 接口明确原则
    对应问题中的第三点接口调整成本高,所以要做到每个服务的对外接口应该明确定义,并尽量保持不变

你可能感兴趣的:(Spring,cloud)