Spring 微服务解决了单体架构的哪些痛点?

1. 部署困难 (Deployment Difficulty & Risk)

  • 单体痛点:
    • 整体部署: 对单体应用的任何微小修改(哪怕只是一行代码),都需要重新构建、测试和部署整个庞大的应用程序。
    • 部署频率低: 由于部署过程复杂且风险高,发布周期通常很长(几周甚至几个月)。
    • 高风险: 一旦部署出现问题,可能会导致整个应用瘫痪,影响所有业务功能。回滚也同样复杂和耗时。
    • 部署窗口限制: 往往需要在业务低峰期(如深夜或周末)进行部署,限制了业务的快速迭代。
  • 微服务解决方案:
    • 独立部署: 每个微服务都是一个独立的部署单元。可以随时修改、测试和部署单个服务,而无需触动其他服务。
    • 高频部署: 显著缩短发布周期,可以实现每天甚至每天多次部署,更快地将新功能交付给用户。
    • 降低风险: 单个服务的部署失败只会影响该服务的功能范围(理想情况下)。可以更容易的进行金丝雀发布、蓝绿部署等低风险发布策略。
    • 无特定部署窗口: 可以更灵活的安排部署时间。

2. 技术栈陈旧与演进困难 (Outdated Technology Stack & Evolution Difficulty)

  • 单体痛点:
    • 技术锁定: 整个应用通常被锁定在一个技术栈(如特定的编程语言、框架、数据库)上。随着时间推移,这个技术栈可能会变得过时或不再是最优选择。
    • 升级困难: 对底层框架或库进行重大升级是一项艰巨且风险极高的任务,可能需要对整个代码库进行大量修改和回归测试。
    • 采用新技术成本高: 想要在单体应用中尝试或引入新的语言、数据库或框架非常困难,往往需要大规模重构。
    • 技术债务累积: 由于难以进行改造,技术债务会不断累积,进一步拖慢开发速度和增加维护成本。
  • 微服务解决方案:
    • 技术异构性 (Polyglot): 每个微服务都可以根据其具体需求选择最合适的技术栈。可以使用 Java 处理事务,用 Python 做数据分析,用 Node.js 处理高并发 IO 等。
    • 渐进式升级与替换: 可以更容易的对单个服务进行技术升级,甚至用新技术完全重写某个服务,而不会影响其他服务。
    • 拥抱创新: 在现有的微服务中可以尝试和应用最新的技术和模式。
    • 隔离技术债务: 技术债务可以被限制在单个服务内部,更容易管理和偿还。

3. 扩展性差 (Poor Scalability)

  • 单体痛点:
    • 整体扩展: 无法针对应用的不同部分进行差异化扩展。即使只有一小部分功能(如用户认证)成为性能瓶颈,也必须扩展整个应用程序的实例。
    • 资源浪费: 扩展整个应用意味着所有组件(即使是低负载的组件)都需要更多的资源(CPU、内存),导致资源利用率低下。
    • 受限于“短板”: 整个应用的扩展能力往往受限于其中最难扩展或资源需求最高的那个组件。
  • 微服务解决方案:
    • 独立扩展: 可以根据每个服务的实际负载和资源需求,独立的扩展或缩减其服务实例数量。
    • 资源优化: 可以为不同的服务选择不同配置的硬件或实例类型(如 CPU 密集型、内存密集型、IO 密集型),实现更精细化的资源管理和成本优化。
    • 更高的整体扩展性: 打破了单体应用中“短板”的限制,系统的整体扩展能力更强。

4. 团队协作效率低 (Low Team Collaboration Efficiency)

  • 单体痛点:
    • 代码库庞大: 所有开发人员都在同一个庞大、复杂的代码库上工作。
    • 熟知业务功能: 开发人员需要理解整个系统的很多部分才能进行有效的修改,上手难度大,新人培养周期长。
    • 开发瓶颈: 大量开发人员同时修改同一个代码库,容易产生代码冲突,需要频繁合并代码,降低开发效率。协调成本高。
    • 职责不清: 随着系统变大,模块之间的界限变得模糊,职责划分不清晰,容易出现互相推诿或重复造轮子的情况。
    • 决策缓慢: 对架构或重要组件的修改需要协调多个团队或大量人员,决策过程缓慢。
  • 微服务解决方案:
    • 小型、专注的代码库: 每个微服务的代码库相对较小,业务逻辑更聚焦。
    • 降低业务功能: 开发人员只需要深入理解他们负责的一到两个服务,更容易上手和维护。
    • 团队自治与并行开发 (Conway’s Law): 可以组建小型、跨职能的自治团队,每个团队负责一个或多个服务的完整生命周期(开发、测试、部署、运维)。团队之间可以并行开发,减少了协调和冲突。
    • 明确所有权: 每个服务有明确的归属团队,职责清晰。
    • 更快的决策: 团队可以在其负责的服务范围内更快的做出技术决策。

此外,微服务还能解决一些其他的单体痛点:

  • 可靠性/容错性差 (Poor Reliability/Fault Tolerance): 单体应用中一个模块的严重错误(如内存泄漏、死循环)可能导致整个应用崩溃。微服务通过故障隔离提高了系统的整体弹性,一个服务的失败不应导致整个系统不可用(需要配合熔断、降级等机制)。
  • 维护成本高 (High Maintenance Cost): 修改庞大、耦合度高的单体代码库非常耗时且风险高。微服务使得修改和维护的范围更小、更可控。

总之,采用微服务架构的主要目的就是通过分解复杂性,来解决单体应用在敏捷性、可扩展性、技术选型、容错性、团队效率等方面遇到的瓶颈和挑战,从而更好的支撑业务的快速发展和变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试题之高频面试题

最近开始面试了,410面试了一家公司 针对自己薄弱的面试题库,深入了解下,也应付下面试。在这里先祝愿大家在现有公司好好沉淀,定位好自己的目标,在自己的领域上发光发热,在自己想要的领域上(技术…

【MySQL】Read view存储的机制,记录可见分析

read view核心组成 1.1 事务id相关 creator_trx_id: 创建该read view的事务id 每开启一个事务都会生成一个 ReadView,而 creator_trx_id 就是这个开启的事务的 id。 m_ids: 创建read view时系统的活跃事务(未提交的事务)id集合 当前有哪些事…

【刷题Day20】TCP和UDP(浅)

TCP 和 UDP 有什么区别? TCP提供了可靠、面向连接的传输,适用于需要数据完整性和顺序的场景。 UDP提供了更轻量、面向报文的传输,适用于实时性要求高的场景。 特性TCPUDP连接方式面向连接无连接可靠性提供可靠性,保证数据按顺序…

Flink 内部通信底层原理

Flink 集群内部节点之间的通信是用 Akka 实现,比如 JobManager 和 TaskManager 之间的通信。而 operator 之间的数据传输是用 Netty 实现。 RPC 框架是 Flink 任务运行的基础,Flink 整个 RPC 框架基于 Akka 实现。 一、相关概念 RPC(Remote Procedure Call) 概念 定义:…

企业级Kubernetes 1.28高可用集群离线部署全指南(含全组件配置)

企业级Kubernetes 1.28高可用集群离线部署全指南(含全组件配置) 摘要:本文手把手教学在无外网环境下部署生产级Kubernetes 1.28高可用集群,涵盖ETCD集群、HAProxy+Keepalived负载均衡、Containerd运行时、Calico网络插件及Kuboard可视化管理全流程。提供100年有效证书配置…

【中间件】redis使用

一、redis介绍 redis是一种NoSQL类型的数据库,其数据存储在内存中,因此其数据查询效率很高,很快。常被用作数据缓存,分布式锁 等。SpringBoot集成了Redis,可查看开发文档Redis开发文档。Redis有自己的可视化工具Redis …

C语言——函数递归与迭代

各位CSDN的uu们大家好呀,今天将会给大家带来关于C语言的函数递归的知识,这一块知识理解起来稍微会比较难,需要多花点时间。 话不多说,让我们开始今天的内容吧! 目录 1.函数递归 1.1 什么是递归? 1.2 递归…

藏品馆管理系统

藏品馆管理系统 项目简介 这是一个基于 PHP 开发的藏品馆管理系统,实现了藏品管理、用户管理等功能。 藏品馆管理系统 系统架构 开发语言:PHP数据库:MySQL前端框架:BootstrapJavaScript 库:jQuery 目录结构 book/…

centos停服 迁移centos7.3系统到新搭建的openEuler

背景 最近在做的事,简单来讲,就是一套系统差不多有10多台虚拟机,都是centos系统,版本主要是7.3、7.6、7.9,现在centos停止维护了,转为了centos stream,而centos stream的定位是:Red …

什么是 IDE?集成开发环境的功能与优势

原文:什么是 IDE?集成开发环境的功能与优势 | w3cschool笔记 (注意:此为科普文章,请勿标记为付费文章!且此文章并非我原创,不要标记为付费!) IDE 是什么? …

jenkins批量复制Job项目的shell脚本实现

背景 现在需要将“测试” 目录中的所有job全部复制到 一个新目录中 test2。可以结合jenkins提供的apilinux shell 进行实现。 测试目录的实际文件夹名称是 test。 脚本运行效果如下: [qdevsom5f-dev-hhyl shekk]$ ./copy_jenkins_job.sh 创建文件夹 test2 获取源…

VisualSVN过期后的解决方法

作为一款不错的源代码管理软件,svn还是有很多公司使用的。在vs中使用svn,大家一般用的都是VisualSVN插件。在30天试用期过后,它就不能被免费使用了。下面给大家讲如何免费延长过期时间(自定义天数,可以设定一个很大的值…

硬件工程师笔记——电子器件汇总大全

目录 1、电阻 工作原理 欧姆定律 电阻的物理本质 一、限制电流 二、分压作用 三、消耗电能(将电能转化为热能) 2、压敏电阻 伏安特性 1. 过压保护 2. 电压调节 3. 浪涌吸收 4. 消噪与消火花 5. 高频应用 3、电容 工作原理 (…

[图论]Kruskal

Kruskal 本质:贪心,对边进行操作。存储结构:边集数组。适用对象:可为负权图,可求最大生成树。核心思想:最短的边一定在最小生成树(MST)上,对最短的边进行贪心。算法流程:对全体边集…

vulnhub five86系列靶机合集

five86 ~ VulnHubhttps://www.vulnhub.com/series/five86,272/ five86-1渗透过程 信息收集 # 主机发现 nmap 192.168.56.0/24 -Pn ​ # 靶机全面扫描 nmap 192.168.56.131 -A -T4 目录扫描 dirsearch -u http://192.168.56.131/ /robots.txt提示/ona。 /ona二层目录扫描。 …

如何高效利用呼叫中心系统和AI语音机器人

要更好地使用呼叫中心系统和语音机器人,需要结合两者的优势,实现自动化、智能化、高效率的客户服务与业务运营。以下是优化策略和具体实践方法: 一、呼叫中心系统优化 1. 智能路由与IVR优化 智能ACD(自动呼叫分配) …

Nacos安装及数据持久化

1.Nacos安装及数据持久化 1.1下载nacos 下载地址:https://nacos.io/download/nacos-server/ 不用安装,直接解压缩即可。 1.2配置文件增加jdk环境和修改单机启动standalone 找到bin目录下的startup.cmd文件,添加以下语句(jdk路径根据自己…

【牛客练习赛137 C】题解

比赛链接 C. 变化的数组(Easy Version) 题目大意 一个长度为 n n n 的非负数组 a a a,要求执行 k k k 次操作,每次操作如下: 有 1 2 \frac{1}{2} 21​ 的概率令 a i ← a i ( a i ⊗ m ) x , ∀ i ∈ [ 1 , n ] a_i \leftarrow a_…

Redis适用场景

Redis适用场景 一、加速缓存二、会话管理三、排行榜和计数器四、消息队列五、实时分析六、分布式锁七、地理位置数据八、限流九、数据共享十、签到 一、加速缓存 Redis最常见的应用之一是作为缓存层,用于存储频繁访问的数据,从而减轻数据库的负载。 通过…

【LangChain4j快速入门】5分钟用Java接入AI大模型,Spring Boot整合实战!| 附源码

【LangChain4j快速入门】5分钟用Java接入AI大模型,Spring Boot整合实战! 前言:当Java遇上大模型 在AI浪潮席卷全球的今天,Java开发者如何快速拥抱大语言模型?LangChain4j作为专为Java打造的AI开发框架,以…