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

单体 vs 微服务 怎么选?

      • 选择架构的原则:
      • 为什么会使用微服务,微服务解决了什么问题?
        • 微服务的作用与解决什么问题
      • 项目中如何选择:
      • 如何拆分?
        • 哪些原则
        • 具体场景

选择架构的原则:

要从哪些方面考虑使用单体还是微服务?

● 成本
● 服务性能
● 发版上线
● 服务可靠性与稳定性
● 代码可维护性与拓展性

单体 vs 分布式(微服务)

1单体微服务
成本
性能略差(多了一层网络的交互)
发版上线的效率(部署与迭代升级)简单略复杂
服务可靠性与稳定性
代码可维护性与拓展性

参考
https://www.51cto.com/article/718541.html

为什么会使用微服务,微服务解决了什么问题?

早期的单体架构更有优势,因为成本低,开发快,性能好,部署容易
但是随着版本的迭代升级,功能越来越多,各种代码逻辑依赖错综复杂,
● 代码将变得难以维护,
● 开发难度激增:增加一个功能可以需要改动多处的代码
● bug 频繁:代码的改动容易引发连锁效应,造成无穷无尽的报错
代码变得复杂之后维护成本急剧上升,这时候就需要进行功能的拆分,选用微服务.

  • 编译缓慢: 代码量大,编译时间就;每一个小功能的开发,测试,上线的周期更长(一个更改编译 10 几分钟)
微服务的作用与解决什么问题

● 降低代码的维护成本
● 提高开发效率
● 提高服务的稳定性(降低 bug 对服务的影响)
说简单一点,单体开发不下去了,改一个地方,要同时对很多地方进行调整,更加容易出 bug,一出 bug 整个服务全部受到影响;

项目中如何选择:

需要根据项目的具体情况:

  • 成本预算
  • 团队规模
  • 项目的初期复杂度

来决定使用单体还是微服务

一般的情况
项目开始先使用单体,
成本低,开发快,功能上线容易,能够快速上线并收获用户的反馈(先花小的代价摸清产品未来的发展方向)

随着产品方向的确定,功能也会越来越复杂,一般 10-50 万行代码的样子就要开始考虑服务的拆分了(具体情况还要看项目的具体业务但还是从团队规模,开发周期,错误量等方面综合考虑)

拆分信号:

  1. 部署特别慢: 一个服务部署超过 10 分钟(代码量大,编译时间长)
  2. 开发比较久: 这个说起来很模糊,什么才算开发久,复杂的功能就是开发比较久,简单的工能开发相对比较快,但是有一个核心指标就是相同复杂度的需求,开发周期比原来慢一倍(一个更改要影响到很多地方,同时更改)
  3. 错误比较多(维护困难): 这个就是你开发的功能好了,被人的功能用不了了,并且维护起来特别麻烦 (一个更改要影响到很多地方, 但是其他地方没有做更改导致错误)
  4. 提交冲突严重: 团队比较大的时候,所有人更改一个库,提交代码的时候经常遇到冲突,让人心烦意乱

如何拆分?

了解了为什么拆分微服务,什么时候拆分微服务,那么现在我们需要知道如何拆分微服务

  • 比如现在你是项目经理,你是架构师,你负责对项目进行拆分的时候应该怎么做
哪些原则

微服务拆分规范:

  1. 单一职责
  • 每个服务只实现某一个类型的业务需求,而不是将不同类型的业务需求杂揉在一起,
  • 每个服务可以独立部署,不需要依赖其他的服务(避免环形依赖与双向依赖)

好处:
1.项目可读性更好,可以快速找到某个功能的位置,便于开发维护,排错等
2. 服务个隔离性,服务的耦合度低,一旦服务出错影响范围小

  1. 松耦合
    • 每个服务使用自己的一套组件,进一步降低服务间的耦合度,避免服务间的相互影响(数据库进行拆分等等,避免共享数据)

好处:
1. 很清楚的知道这个服务在干什么,一旦功能出了问题可以快速定位
2. 依赖项越少,出问题影响的范围小(依赖的东西可能出问题,尽量减少没必要的依赖数据库什么的)

  1. 演进式拆分
    • 逐步拆分而不是一次性拆的很细,比如短视频服务,拆分的时候可以先将视频服务拆分出去,没问题后再将聊天功能拆分出去
    • 避免一次性一次性拆的太细,工作量激增,开发测试变得困难
  2. 设计通用化接口而不是定制性接口,避免服务间强依赖
  • 不要为某个服务的需求定制接口,降低服务耦合度,开发维护起来越简单(如果定制接口越多,开发维护就会越复杂,要针对性改每一个接口)
具体场景
  • 根据业务分类进行拆分:
    例子: 短视频服务:视频服务,用户服务,社交服务
  • 根据接口压力进行拆分:
    例子短视频压力巨大,占全部请求的 80% 以上,就可以将接口单独拆出来成为一个服务,方便拓展与隔离
  • 根据团队情况进行拆分:
    比如团队的数量,团队人数进行拆分服务的数量.方便分配每个团队的任务.

参考
https://cloud.tencent.com/developer/article/1834786
https://chatgpt.com/c/6780f932-ccf4-8007-bcbd-2a4b3c0e6266
https://www.cnblogs.com/crazymakercircle/p/17847461.html#%E7%BE%8E%E5%9B%A2%E9%9D%A2%E8%AF%95%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%A6%82%E4%BD%95%E6%8B%86%E5%88%86%E5%8E%9F%E5%88%99%E6%98%AF%E4%BB%80%E4%B9%88
https://zhuanlan.zhihu.com/p/333393446


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

相关文章:

  • (十)ROS的常用组件——rosbag和rqt工具箱
  • 【update 更新数据语法合集】.NET开源ORM框架 SqlSugar 系列
  • 数据存储与信息技术领域 - 磁带技术:企业用磁带与音乐磁带
  • css 布局及动画应用(flex+transform+transition+animation)
  • 【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法,以及自动化实时数据采集
  • 基于微信小程序的汽车销售系统的设计与实现springboot+论文源码调试讲解
  • springboot高校教室资源管理平台
  • 2501,wtl显示html
  • 基于springboot+vue的洪涝灾害应急信息管理系统设计与实现
  • 【蓝桥杯】Python算法——快速幂
  • Python文档生成利器 - Sphinx入门指南
  • 【JVM】深入了解Java虚拟机-------内存划分、类加载机制、垃圾回收机制
  • 【Uniapp-Vue3】页面生命周期onLoad和onReady
  • 语音合成的预训练模型
  • Linux Centos中安装多个JDK并且管理
  • 基于深度学习的视觉检测小项目(十三) 资源文件的生成和调用
  • 学习进程前的简单认知-体系结构与OS
  • Qt/C++进程间通信:QSharedMemory 使用详解(附演示Demo)
  • 刷题记录 回溯算法-10:93. 复原 IP 地址
  • 如何高效使用Adobe软件的组件功能
  • OpenCV实现彩色图像的直方图均衡化
  • riscv架构下linux4.15实现early打印
  • 《零基础Go语言算法实战》【题目 4-2】使用 Go 语言实现一个模拟栈数据结构操作的类 FrequencyStack
  • 智能制造智慧工业4.0大数据平台建设综合解决方案(PPT原件)
  • element-ui动态设置tabel的columns时,切换columns数据表格抖动
  • 30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <1> 5分钟快速创建一个springboot web项目