微服务架构-微服务架构的挑战与微服务化的具体时机

news2024/11/16 1:39:25

目录

一、微服务架构的挑战

1.1 概述

1.2 服务拆分

1.3 开发挑战

1.4 测试挑战

1.4.1 开箱即用、一键部署的集成环境

1.4.2 测试场景和测试确定性

1.4.3 微服务相关的非功能测试

1.4.4 自动化测试

1.5 运维挑战

1.5.1 监控

1.5.2 部署

1.5.3 问题追查

1.5.4 依赖管理

1.5.5 容量管理

1.5.6 总结

二、微服务化的具体时机

2.1 概述

2.2 频繁出现因为需求排队上线而延期的现象

2.3 频繁出现代码提交冲突的现象

2.4 频繁出现一个简单功能特性需要同时修改众多文件的场景


一、微服务架构的挑战

1.1 概述

微服务的开发模式和单体服务差异比较大,对设计、开发、测试、运维等研发流程的各个阶段都提出了新的挑战。

1.2 服务拆分

服务拆分是微服务架构过程中最重要的一步,关系到微服务架构的成败,糟糕的服务拆分会影响后续的服务化过程,严重时可能会导致大量的返工,甚至是推倒重来;好的服务化拆分,意味着服务化已经成功了一半。微服务拆分时会遇到很多问题和权衡,是一个开着飞机换引擎的过程,比如拆分粒度和拆分原则如何确定;服务拆分是否需要考虑后向兼容;拆分顺序是怎么样的;服务拆分和业务当前迭代之间的关系怎么权衡等。

1.3 开发挑战

微服务背景下,微服务的定位是实现特定的业务功能,因此会有大量新增微服务的需求。业务写一个在线的服务,除了实现必需的功能外,还有众多非功能需求要考虑,常见的非功能需求有可扩展性(业务流量变大、业务特性复杂度增加时,业务可以方便扩展)、稳定性(可靠性、可用性)、兼容性(上下版本兼容)、健壮性(面对异常流量时,业务需要能够正确处理)、安全性、性能等,如此众多的非功能需求要考虑,给业务的快速迭代带来很多障碍。同时微服务众多,如果大家没有遵循一致的开发模式和通信模式,跨微服务的沟通成本很大,会给开发、测试、运维等环节带来很大的开销,因此微服务架构的第一个挑战是建立一套完善的服务标准化方案,将微服务的通信和服务治理进行标准化。微服务标准化具体包含命名、路由、RPC、IDL、服务治理等,它对于服务开发效率和稳定性提升有重要意义,并且可以有效提升服务的可维护性。

另外一个挑战是微服务分布式通信带来的复杂性,由于分布式通信的特点,需要考虑容错、数据一致性、超时、重试等话题,同时服务注册和发现、集群路由和负载均衡、服务调用链路质量的跟踪等,都是需要考虑的问题。分布式事务的处理,单体服务下的事务处理,到了分布式环境下就变得更为复杂,如果根据具体的业务场景进行折中和权衡,是个很大的问题。

1.4 测试挑战

微服务架构下,整个系统有一系列承载明确功能的微服务,通过一定的微服务通信组成,微服务架构的特点对软件测试也提出了一些挑战。

1.4.1 开箱即用、一键部署的集成环境

微服务架构下,服务和依赖很多,拓扑复杂,服务随时可能会有各种变更,如何快速构建简单易用的测试环境,是一个很大的挑战。

1.4.2 测试场景和测试确定性

微服务架构下,依赖和网络的细微变化,就可能导致测试结果发生变化,给测试场景和测试用例的构造带来很多困难,如何增加测试的确定性,保障测试效率和效果,是摆在大家面前的一个重要问题。

1.4.3 微服务相关的非功能测试

微服务架构对服务治理有很高的要求,微服务治理相关的非功能需求很多,如降级限流、超时熔断、容灾容错设计等,因此需要构建一套针对微服务非功能需求进行测试的基础设施,保证微服务治理相关的非功能需求的有效性,增加微服务的可用性和安全性。

1.4.4 自动化测试

微服务背景下,服务个数变多,服务变更频繁,对自动化测试的要求也会更高,很多线下测试没有问题的服务,线上可能会出问题,如果能够构建一套生产环境可用的自动化测试基础设施,对微服务的测试效率和效果会有很大的帮助。

1.5 运维挑战

1.5.1 监控

单体服务的监控比较简单,微服务背景下,一个服务变为多个服务,需要对多个服务分别进行监控,对多个服务之间的通信也需要监控,监控管理变得非常复杂。

1.5.2 部署

微服务拓扑复杂,有太多服务需要维护和管理,并且服务变更很频繁,对服务的部署和运维提出很高的要求。

1.5.3 问题追查

单体服务的请求在一个服务内完成,微服务的请求由多个微服务协作完成,每个微服务也部署多个节点,整个调用链路很长,业务出现问题时,如何在比较短的时间内快速找出具体问题所在,是个很大的挑战。

1.5.4 依赖管理

微服务依赖众多,如果每个依赖发生故障都会影响系统的整体稳定性,系统就会变得非常脆弱,因此需要对服务的各种依赖进行有效管理,比如哪些是强依赖,哪些是弱依赖,依赖故障对整个系统的影响,这些问题都需要提前预估并制定相应的预案。

1.5.5 容量管理

如何在细粒度的状态下,更有效地管理数量庞大的微服务,如何预估系统的容量,业务爆炸式增长或者通过运营手段导致业务流量突增时,如何快速扩容?如何在保障业务稳定发展的同时,控制成本支出。微服务的容量管理和容量规划是个系统工程,需要在效率和成本之间有很好平衡,需要有完善的基础设施支持。精细化的容量管理需要做到可视化、可量化、可优化,对运维提出了很高的要求。

1.5.6 总结

微服务架构最大的挑战在运维上,微服务的复杂性给微服务运维带来了很多难题。如果不能很好地解决微服务的运维问题,微服务架构的优势就无法体现,微服务改造也很容易陷入泥潭,因此,解决微服务的运维挑战,构建一体化的自动化运维基础设施,是微服务架构的关键一环。

二、微服务化的具体时机

2.1 概述

微服务拆分确实会带来很多实实在在的收益,但同时在开发、测试、运维等多个方面也带来了很多挑战。特别是在业务发展初期,团队人员不多,对微服务周边技术和基础设施的积累不够,贸然采取微服务架构,不仅无法带来预期的收益,还可能严重阻碍业务的快速迭代,严重时甚至可能变成一个灾难。特别是互联网领域,业务迭代效率是第一位的,单个服务开发、测试和部署都相对简单,遇到的技术难度相对较少,如果引入微服务架构,面对的技术问题成倍增加,在技术上就需要进行大的投入,这对于追求业务快速迭代的中小团队来说得不偿失的。正常的做法是微服务改造之前,平常多进行一些微服务架构相关的技术储备,当单体服务的痛点达到一定程度,已经影响业务的正常迭代效率,才需要考虑微服务改造。

架构和技术都是为了业务服务的,因为评估微服务拆分时机,也需要从业务角度出发,而不是从技术角度进行评估。如果当前架构出现如下影响业务快速发展的场景时,可以考虑进行微服务改造。

2.2 频繁出现因为需求排队上线而延期的现象

单个服务下,为了保证线上服务的稳定性,同时更好地监控上线特性的业务效果,不少研发团队都会制定相应的制度,需要上线的人提前提出申请,串行排队上线,如果经常出现因为排队等待而影响到业务的快速迭代,就需要考虑进行微服务拆分了,微服务拆分后,大家可以独享服务的上线窗口,加快并行开发的效率。

2.3 频繁出现代码提交冲突的现象

单体服务下,多人同时在修改同一服务的代码,随着业务越来越复杂,团队的人越来越多,大家平常都在自己的分支上进行开发,分支代码合入主线时,很容易出现merge冲突的现象,或者解决merge冲突时出现代码合入错误。这时就需要考虑是否可以通过微服务拆分提高并行开发的效率,同时减少出错的概率。

2.4 频繁出现一个简单功能特性需要同时修改众多文件的场景

之前团队一个真实的例子,上线一个简单的计价需求,修改文件超过50个,结果实际上线的时候发现还有2处修改遗漏。根本原因是服务代码量太庞大,并且代码结构组织不好,各种时期的历史代码,以及一些临时添加的代码遍布各处,随着业务的长期迭代,业务逻辑耦合很深,相似的判断逻辑分散到项目的各个角落,很少有人能够掌控全部逻辑。由于不了解代码的全貌,每次修改都小心翼翼,一不小心就很容易出错。这种情况下可以考虑进行微服务改造了,不然不仅会影响业务的迭代效率,同时也给整个系统的稳定性带来诸多隐患。

微服务的一大收益是解决业务高并发时带来的问题。高并发场景下,随着业务的快速发展,流量变化很快,对业务的容量评估和快速扩容提出了很高的要求,采用微服务架构拆分业务,不同的业务场景可以独自进行容量评估和扩容,比较灵活,同时可以大大节约成本。因此不少同学认为业务高并发也是微服务的一个重要拆分时机,对此我有不同的看法。对于快速成长的业务,业务迭代效率永远是第一位的,其次才是业务稳定性,成本一般在业务发展到一定阶段,业务成熟并且模式比较固定的时候才会提到一定的高度,成本问题一般情况下不足以成为微服务拆分的一个充分条件。

好了,本次内容就分享到这,欢迎大家关注《微服务架构》专栏,后续会继续输出相关内容文章。如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

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

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

相关文章

编辑任何场景! 3DitScene:通过语言引导的解耦 Gaussian Splatting开源来袭!

文章:https://arxiv.org/pdf/2405.18424 项目:https://zqh0253.github.io/3DitScene/ huggingface:https://huggingface.co/spaces/qihang/3Dit-Scene 场景图像编辑在娱乐、摄影和广告设计中至关重要。现有方法仅专注于2D个体对象或3D全局场景编辑&…

C++系列——————类和对象(上)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、面向对象的三大特征二、类的引入2.1类的定义 三.类的访问限定符3.1访问限定符的介绍3.2.访问限定符的使用 四、类的作用域五、类的实例化六、类对象模型6.1…

oracle中的INTERVAL函数学习总结

Oracle 从9i数据库开始引入了一种新特性,可以用来存储时间间隔,出现了INTERVAL 函数。这个函数的表达式比较多,初学比较费劲不好掌握,经过以几个小时的查阅资料和实验,总结如下: interval year t…

基于离散小波变换(DWT)的心电信号伪影去除及心电信号PQRST波检测(MATLAB R2018)

心电信号是心脏神经,肌肉组织电化学活动的表现形式。这些电化学活动使心脏内部产生一系列非常协调的电刺激脉冲,分别使心房,心室的肌肉细胞兴奋,从而有节律的舒张和收缩。这些生物电活动在体表的不同部位形成不同的电位差变化&…

模型构建器之迭代器

上一篇我们介绍了模型构建器的基础,将一个工作流串联起来,然后做成模型工具。今天我们介绍模型构建器的第二个重要功能——迭代,也就是程序中的循环。 先来看一个例子。要给数据库中所有要素类添加一个相同的字段,该怎么做&#…

docker镜像体积优化攻略参考—— 筑梦之路

简单介绍 镜像的本质是镜像层和运行配置文件组成的压缩包,构建镜像是通过运行 Dockerfile 中的 RUN 、COPY 和 ADD 等指令生成镜像层和配置文件的过程。 和镜像体积大小有关的关键点: RUN、COPY 和 ADD 指令会在已有镜像层的基础上创建一个新的镜像层&…

黑马es集群

1、为什么要做es集群 单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点 单点故障问题:将分片数据在不同节点备份(replica) 2、搭建es集群 1、用…

【技术实操】银河高级服务器操作系统实例分享,数据库日志文件属主不对问题分析

1. 问题现象描述 2023 年 06 月 30 日在迁移数据库过程中,遇到数据库 crash 的缺陷,原因如下:在数据库启动时候生成的一组临时文件中,有 owner 为 root 的文件, 文件权限默认为 640, 当数据库需要使用的时…

重生奇迹mu魔剑职业技能一览

1、火剑袭:魔剑士三转前4个技能中,核心技能火剑袭为buff技能,可在短时间内大幅提升自身伤害输出能力,由于提升的数值依赖于技能等级,因此一个高技能等级魔剑士的爆发能力相当恐怖。 2、天雷闪:是剩余技能中…

Sapphire开发日志(四)

任务描述 本周任务,将模型进行封装,实现模型推理的基本API,从而可以根据输入数据输出蒙版数据。 模型输入数据处理 首先进行模型输入数据的预处理。首先支持点击和框选两种模式,所以这里需要对这两种模式进行适配。 modelData…

微信小程序蓝牙连接部分Android14调用wx.setBLEMTU协商低功耗最大传输单元失败解决方案(部分安卓14设置超过23就会报错)

1.解决方案的核心内容:第一次设置失败不要管,在complate函数里面继续往下连接,然后设置一个定时器每1秒钟在重新设置一次,肯定会成功的!!!!!!!&am…

使用compile_commands.json配置includePath环境,解决vscode中引入头文件处有波浪线的问题

通过编译时生成的 compile_commands.json 文件自动完成对 vscode 中头文件路径的配置,实现 vscode 中的代码的自动跳转。完成头文件路径配置后,可以避免代码头部导入头文件部分出现波浪线,警告说无法正确找到头文件。 步骤 需要在 vscode 中…

Java Sort 方法的使用(包含Arrays.sort(),Collections.sort()以及Comparable,Comparator的使用 )

目录 Comparable && Comparator的使用: Comparable: Comparator: Arrays.sort()的使用: 升序排序: 降序排序: 自定义排序方法: 在日常的刷题或开发中,很多时候我们需要对数据进行排序,以达到我…

【PHP项目实战训练】——laravel框架的实战项目中可以做模板的增删查改功能(1)

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

【银河麒麟V10服务器OS-系统根分区扩容】指导教程手册

【银河麒麟V10服务器OS-系统根分区扩容】指导教程手册 环境信息:VMware虚拟软件16.0 首先查看KylinOS服务器版本:nkvers 备注: (Tercel) 版本是 V10 SP1 版本, (Sword) 版本是 V10 SP2 版本, (Lance) 版本是 V10 …

开源与闭源 AI 模型:发展路径的比较与前瞻

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

super().__init__() 来自于哪个PEP

super() 的简化用法(即不带参数的 super())是在 Python 3 中引入的。这个改进是由 PEP 3135 规范化的。 PEP 3135: New Super PEP 3135 标题为 “New Super”。它介绍了一种新的方式来调用超类的方法,即不再需要显式地传递当前类和实例&…

前端Vue小兔鲜儿电商项目实战Day04

一、二级分类 - 整体认识和路由配置 1. 配置二级路由 ①准备组件模板 - src/views/SubCategory/index.vue <script setup></script><template><div class"container"><!-- 面包屑 --><div class"bread-container">…

软件需求规格说明书(Word原件@配套软件全资料)

软件需求规格说明书编写规范编写规范 1.项目背景 2.项目目标 3.系统架构 4.总体流程 5.名称解释 6.功能模块 软件项目相关全套精华资料包获取方式①&#xff1a;点我获取 获取方式②&#xff1a;本文末个人名片直接获取。 软件资料清单列表部分文档清单&#xff1a;工作安排任…

python操作mongodb底层封装并验证pymongo是否应该关闭连接

一、pymongo简介 https://pymongo.readthedocs.io/en/stable/github地址&#xff1a;https://github.com/mongodb/mongo-python-driver mymongo安装命令&#xff1a;pip install pymongo4.7.2 mymongo接口文档&#xff1a;PyMongo 4.7.2 Documentation PyMongo发行版包含Py…