当前位置: 首页 > article >正文

五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则

一、引言

选择合适的架构模式是一个至关重要的决策,尤其是在单体架构和微服务架构之间的选择,本文将带大家认识什么是单体架构,什么是微服务架构,以及两者如何去选择,如何去转换。
 

二、什么是单体架构

单体架构(monolithic structure):顾名思义,整个项目中所有功能模块都在一个工程中开发;项目部署时需要对所有模块一起编译、打包;项目的架构设计、开发模式都非常简单。

例如,很多同学都学习过的黑马商城就是单体架构

这里举个例子,苍穹外卖项目只有一个启动类,它就可以归为单体架构,虽然分了很多模块,但是真正的功能实现却都在一个模块里面这就是单体架构

三、什么是微服务架构

微服务架构,首先是服务化,就是将单体架构中的功能模块从单体应用中拆分出来,独立部署为多个服务。同时要满足下面的一些特点:

  • 单一职责:一个微服务负责一部分业务功能,并且其核心数据不依赖于其它模块。

  • 团队自治:每个微服务都有自己独立的开发、测试、发布、运维人员,团队人员规模不超过10人(2张披萨能喂饱)

  • 服务自治:每个微服务都独立打包部署,访问自己独立的数据库。并且要做好服务隔离,避免对其它服务产生影响

 

四、如何选择

在确定如何选择之前,我们要聊一下单体架构和微服务架构各自的优缺点

1.单体架构

1)优点

当项目规模较小时,这种模式上手快,部署、运维也都很方便,因此早期很多小型项目都采用这种模式。

2)缺点

随着项目的业务规模越来越大,团队开发人员也不断增加,单体架构就呈现出越来越多的问题:

  • 团队协作成本高:试想一下,你们团队数十个人同时协作开发同一个项目,由于所有模块都在一个项目中,不同模块的代码之间物理边界越来越模糊。最终要把功能合并到一个分支,你绝对会陷入到解决冲突的泥潭之中。

  • 系统发布效率低:任何模块变更都需要发布整个系统,而系统发布过程中需要多个模块之间制约较多,需要对比各种文件,任何一处出现问题都会导致发布失败,往往一次发布需要数十分钟甚至数小时。

  • 系统可用性差:单体架构各个功能模块是作为一个服务部署,相互之间会互相影响,一些热点功能会耗尽系统资源,导致其它服务低可用。

2.微服务架构

1)优点
  • 团队协作成本低

    由于服务拆分,每个服务代码量大大减少,参与开发的后台人员在1~3名,协作成本大大降低
  • 系统发布效率高

    每个服务都是独立部署,当有某个服务有代码变更时,只需要打包部署该服务即可
  • 系统可用性强

    每个服务独立部署,并且做好服务隔离,使用自己的服务器资源,不会影响到其它服务。
2)缺点

需要投入大量的人力和时间成本用于架构设计,开发成本高

3.架构选择

1)一般情况下,对于一个初创的项目,首先要做的是验证项目的可行性。因此这一阶段的首要任务是敏捷开发,快速产出生产可用的产品,投入市场做验证。为了达成这一目的,该阶段项目架构往往会比较简单,很多情况下会直接采用单体架构,这样开发成本比较低,可以快速产出结果,一旦发现项目不符合市场,损失较小。

如果这一阶段采用复杂的微服务架构,投入大量的人力和时间成本用于架构设计,最终发现产品不符合市场需求,等于全部做了无用功。

2)对于大多数小型项目来说,一般是先采用单体架构,随着用户规模扩大、业务复杂后再逐渐拆分为微服务架构。这样初期成本会比较低,可以快速试错。但是,这么做的问题就在于后期做服务拆分时,可能会遇到很多代码耦合带来的问题,拆分比较困难(前易后难)。

3)而对于一些大型项目,在立项之初目的就很明确,为了长远考虑,在架构设计时就直接选择微服务架构。虽然前期投入较多,但后期就少了拆分服务的烦恼(前难后易)。

五、转换原则

涉及到单体架构和微服务架构的转换,一般是单体架构转微服务架构,原则如下

1.拆分原则

微服务拆分时粒度要小,这其实是拆分的目标。具体可以从两个角度来分析:

  • 高内聚:每个微服务的职责要尽量单一,包含的业务相互关联度高、完整度高。

  • 耦合:每个微服务的功能要相对独立,尽量减少对其它微服务的依赖,或者依赖接口的稳定性要强。

高内聚首先是单一职责,但不能说一个微服务就一个接口,而是要保证微服务内部业务的完整性为前提。目标是当我们要修改某个业务时,最好就只修改当前微服务,这样变更的成本更低。

一旦微服务做到了高内聚,那么服务之间的耦合度自然就降低了。

当然,微服务之间不可避免的会有或多或少的业务交互,比如下单时需要查询商品数据。这个时候我们不能在订单服务直接查询商品数据库,否则就导致了数据耦合。而应该由商品服务对应暴露接口,并且一定要保证微服务对外接口的稳定性(即:尽量保证接口外观不变)。虽然出现了服务间调用,但此时无论你如何在商品服务做内部修改,都不会影响到订单微服务,服务间的耦合度就降低了。

2.拆分方式

明确了拆分目标,接下来就是拆分方式了。我们在做服务拆分时一般有两种方式:

  • 纵向拆分

  • 横向拆分

1)所谓纵向拆分,就是按照项目的功能模块来拆分。例如黑马商城中,就有用户管理功能、订单管理功能、购物车功能、商品管理功能、支付功能等。那么按照功能模块将他们拆分为一个个服务,就属于纵向拆分。这种拆分模式可以尽可能提高服务的内聚性。

2)而横向拆分,是看各个功能模块之间有没有公共的业务部分,如果有将其抽取出来作为通用服务。例如用户登录是需要发送消息通知,记录风控数据,下单时也要发送短信,记录风控数据。因此消息发送、风控数据记录就是通用的业务功能,因此可以将他们分别抽取为公共服务:消息中心服务、风控管理服务。这样可以提高业务的复用性,避免重复开发。同时通用业务一般接口稳定性较强,也不会使服务之间过分耦合。

六、结语

今天的学习也是到此为止了,其实学了黑马商城项目的拆分,但是今天是没机会发出来了,等到明天写好再发出来吧

明天是周六,没有课,是我大展拳脚的好机会,希望明天可以学的多一点

 本文参考文档

‍‌​​​​‌‌​​‍​‬​​⁠​‌​​​​​⁠​‌​​​‍​​⁠​‬​​​‌​​​⁠⁠⁠day03-微服务01 - 飞书云文档 (feishu.cn)


http://www.kler.cn/a/405936.html

相关文章:

  • BugJson因为json格式问题OOM怎么办
  • Linux驱动开发快速入门——字符设备驱动(直接操作寄存器设备树版)
  • 嵌入式中利用QT实现服务器与客户端方法
  • 如何在Linux上安装Canal同步工具
  • Java 爬虫深度解析销量和商品详情数据获取
  • RocketMQ: 集群部署注意事项
  • 人工智能在金融领域的应用与风险防范研究
  • java基础概念38:正则表达式3-捕获分组
  • 利用c语言详细介绍下选择排序
  • 单细胞|M3-4. 细胞聚类与轨迹推断
  • 高亮LED显示驱动数显驱动器芯片VK16K33
  • MySQL数据库存储引擎
  • 线性神经网络模型
  • 第四范式前三季度业务进展:行稳致远 稳健增长
  • c++ std::next总结
  • 实际开发中的协变与逆变案例:数据处理流水线
  • 12 —— Webpack中向前端注入环境变量
  • 【机器学习】——朴素贝叶斯模型
  • Leetcode128. 最长连续序列(HOT100)
  • Pytest-Bdd-Playwright 系列教程(12):步骤参数 parsers参数解析
  • ArcMap 处理栅格数据的分辨率功能操作
  • 利用D3.js实现数据可视化的简单示例
  • 实现了两种不同的图像处理和物体检测方法
  • 2411rust,实现特征
  • 云计算面试题之六.运维架构篇
  • Java爬虫淘宝详情接口深度解析