一些微服务拆分的浅见

大家好,我是Z哥。

不管是十几年前 SOA 的流行,还是 7、8 年前微服务的大行其道,还是如今云原生的展露锋芒,背后都离不开一件事,程序拆分或者说服务拆分。否则,一个单体应用,以上的这些技术潮流好像都与它没什么关系,只是一个看客。

虽然Z哥我没有从头开始完整地亲历过以上三个时期,但是这三个时期都有过我留下的足迹。所以我想我接下去分享的内容应该对处在云原生时代的大家有所帮助。

/01  拆分有什么好处/

拆分的目的很容易理解,分而治之。本质是将复杂的大问题分解成更简单的多个小问题,从而解决它。

而在拆分之前的单体系统中,我们往往面临着哪些问题呢?

01  数据库瓶颈

所有的业务都由一个数据库承载着,随着业务的发展,数据库日常内存吃紧,时不时还搞出个 cpu 90% + 以示它的怒火。

02  增加人员对开发效率提升的边际效益递减

项目里的代码量从 10 万行,增长到 100 万,再到 1000 万。随着代码量的增加,代码之间的耦合问题越发严重,开发效率明显降低。好吧,效率不够数量来凑。扩招了更多的人进来,但是发现耦合问题更加严重了,经常出现 A 等 B 提交代码,B等 C 提交代码,C 等 A 提交代码的情况……

03  运维成本指数级增加

随着项目参与人员的增加,每天发布程序的次数也增加了。可怕的是,代码量也在增加,导致每次编译发布的时间也增加了,这对开发效率来说是双重打击。每天发布的时间加起来可能就占了半天。

希望你所在的团队不要处在如此痛苦的场景中。

/02  什么时候拆?/

拆分虽好,但也不是万能的灵丹妙药。对于大多数组织来说,一个新系统不适合一上来就按照拆分的思路来做。因为拆分需要基于对当前业务、当前系统、当前环境的理解之上的,而面对一个未来充满未知的新业务,我们当下的信息积累是不够的,如果过早拆分,很容易导致边界划分不合理的情况,这在后续会带来不小的负面作用。甚至,可能这个产品在经过市场验证失败后就被砍了,之前的工作做得再多、再完美,全白费了。

因此相对来说,从一个已有的单体系统中逐步拆分出一个个模块反而容易得多,因为确定性更高。

单体系统和分布式系统对成本与业务复杂度之间的关系是这样的。

因此,在这个临界点附近进行拆分工作的性价比是最高的。

对于如何判断是否达到了这个临界点,我认为至少要符合以下三点中的两点。

  • 业务已在市场站稳脚跟,规划中业务发展速度未来可能会加速。

  • 开发人员持续扩张,并且未来还将继续。

  • 平均单人开发效率下降。多个开发人员之间的工作相互影响、依赖,导致解决这些冲突所花费的成本占到了总开发成本的 30%以上。比如,提交的代码冲突、你等我 coding 完才能继续 coding 这种(往往这样的情况下,每个迭代的版本也很大)。

/03  拆分前的准备工作/

并不是以上条件满足了就可以拆了。在实际拆分之前,我们要做一些准备工作。这其中最为关键的是两件事:

  • 统一拆分原则

  • 基础设施建设

因为从单体系统到分布式系统不仅仅是技术的升级,更是开发理念的转变。

这两件事的具体就不展开了,前人已经总结过很多了,我就简单罗列一下。在应用拆分这件事上比较适用的是:

  • 高内聚低耦合

  • 闭包原则

  • 接口隔离

  • 演进思维

  • 避免循环依赖

另外,分布式系统中常用的基础设施主要是以下这些:

  • 消息队列

  • 缓存

  • 日志系统

  • 服务治理

  • 监控

  • 网关

  • 配置中心

  • 数据访问组件

以上这些是必须项,其它可选项还有不少,比如:分布式文件系统、容器管理平台、CI/CD 等等。

/04  拆分思路/

具体的拆分其实就是划分边界的过程。强烈建议通过 DDD 的思想进行。

  1. 深入理解业务,从中定义出隐含的实体、值对象。

  2. 从实体对象中找出聚合根,根据实体、值对象与聚合根的依赖关系,建立聚合。

  3. 根据业务场景等环境因素,划分限界上下文。这里的限界上下文就可以与拆分出来的微服务一一对应。

其中最关键的是「抽象」工作,为了更易理解还是来举个例子说一下。比如,当我们在某某养车平台下单一个保养订单,你说其中的“安装”业务该以什么形式进行交易比较合理?Z哥我认为是将其当作一个普通商品看待,当然该平台也的确是这么做的。如此一来,购买机油机滤和安装服务对用户来说是一样的,很自然地被创建在一笔订单里,而不是两笔订单。

如何评估抽象的好不好呢?可以从以下两个角度来观察。

  1. 两个限界上下文之间的依赖应该越少越好。并且依赖的上游不需要知道下游的信息。比如订单 service 依赖商品 service ,但是商品 service 无需知道订单 service 的存在。

  2. 推演可能的未来业务,如果能响应业务变化(不一定 100%满足),则证明该抽象是符合未来预期的,可以在一段时间内支撑业务的持续发展。

不过不管怎样,最终你都在抽象程度、成本、复用性这三者之间平衡。

除此之外,我们还可以根据以下三个维度来进行拆分。

  1. 是否经常变动

  2. 复用程度的高低

  3. 是否有特殊的要求(高性能、安全性等)

好了,总结一下。

这篇呢,Z哥和你分享了我对微服务或者说分布式系统如何拆分的看法。

拆分可以解决单体系统的三个痛点。

  1. 数据库瓶颈。

  2. 增加人员对开发效率提升的边际效益递减

  3. 运维成本指数级增加。

但是拆分也不是越早越好,至少符合以下三点中的两点。

  1. 业务已在市场站稳脚跟,规划中业务发展速度未来可能会加速。

  2. 开发人员持续扩张,并且未来还将继续。

  3. 平均单人开发效率下降。多个开发人员之间的工作相互影响、依赖,导致解决这些冲突所花费的成本占到了总开发成本的 30%以上。比如,提交的代码冲突、你等我 coding 完才能继续 coding 这种(往往这样的情况下,每个迭代的版本颗粒度不得不变得很大)。

然后,拆分前还需要做好两项准备工作。

  1. 统一拆分原则

  2. 基础设施建设

具体实施拆分的思路,建议以 DDD 的思想来进行。

其实任何事都没有一招鲜吃遍天的方法,随着业务、技术的发展,我们的拆分思路也需要持续迭代。如果你之前这方面的实战经验比较缺乏,不妨从我分享的这些方面入手试试,希望能对你有所帮助。

推荐阅读:

  • 接手历史悠久的老项目,干or跑?

  • 如何让自己更自律

原创不易,如果你觉得这篇文章还不错,就「点赞」或者「在看」一下吧,鼓励我的创作 :)

也可以分享我的公众号名片给有需要的朋友们。

如果你有关于软件架构、分布式系统、产品、运营的困惑

可以试试点击「阅读原文

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

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

相关文章

大变天!刚刚,山东突然宣布!关乎800万人...

全世界只有3.14 % 的人关注了青少年数学之旅由山东省大数据局主办、青岛市大数据发展管理局承办的山东省数据应用(青岛)创新创业大赛自9月23日启动以来,凭借着新颖赛题、丰富数据和丰厚奖励,吸引了社会各界数据爱好者与从业者的广…

MassTransit中RequestResponse基本使用

MassTransit 是一个自由、开源、轻量级的消息总线基于.Net框架, 用于创建分布式应用程序。方便搭建基于消息的松耦合异步通信的应用程序和服务。MassTransit 在现有消息传输上提供了一组广泛的功能, 从而使开发人员能够友好地使用基于消息的会话模式异步连接服务。基于消息的通…

php2612,达人曝光LGLSNJ2612AR质量好吗?怎么样呢?体验报告揭秘

其实这个LGLSNJ2612AR还可以的 哟,超凡的造型设计和外观,做工细腻,不少的人想要了解这LGLSNJ2612AR怎么样?质量好不好?实实在在的说这款LGLSNJ2612AR使用体验后个人感觉蛮可以的哈,刚购没多久的&#xff0c…

vim编辑技巧

转载于:https://blog.51cto.com/ovcer/1353415

IT基础设施最佳实践ITIL

IT基础设施最佳实践ITIL1. 前言1.1.困扰问题随着IT技术在企业中的应用越广,企业业务流程的正常运作就越离不开IT部门的支持。IT在给企业业务带来效益的同时,也带来了成本和风险的 困扰,尤其是在某些特殊行业,例如电信、金融等行业…

一个本科生,只用了两年就拿下诺贝尔奖,拯救了无数糖尿病患者

全世界只有3.14 % 的人关注了青少年数学之旅早在三千五百年前,古埃及就已经有对糖尿病的描述,两千多年前,古希腊医生亚的阿勒特奥斯把这种主要症状为“排泄多且甜的尿液”的疾病命名为“Diabetes”,也就是糖尿病。几千年来&#x…

C#中使用jieba.NET、WordCloudSharp制作词云图

词云简介“词云”由美国西北大学新闻学副教授、新媒体专业主任里奇戈登(Rich Gordon)于2006年最先使用,是通过形成“关键词云层”或“关键词渲染”,对文本中出现频率较高的“关键词”的视觉上的突出。网上大部分文章介绍的是使用P…

js框架页弹出页面关闭

2019独角兽企业重金招聘Python工程师标准>>> <!-- lang: js --> function to(href) {if (top.location self.location) {//window.opener null;window.opener.location.reload();window.open(, _self);window.close();} else {window.location.href href;}…

狂言50年要拿30个诺奖的日本,如今怎么样了?

全世界只有3.14 % 的人关注了青少年数学之旅2019年10月9日&#xff0c;日本化学家吉野彰&#xff08;Akira Yoshino&#xff09;因在锂离子电池的发明和应用领域做出的卓越贡献&#xff0c;与美国科学家 John B. Goodenough、英国科学奖 M. Stanley Whittingham 一起荣获2019年…

VS2022+.NET6+C#10,.NET开发起飞

VS2022.NET6C#10一起体验是啥感觉&#xff1f;爽&#xff01;令人印象深刻的是VS2022打开超大项目的流畅&#xff0c;.NET6极致简化的MiniAPI框架&#xff0c;C#10各种炫酷新语法。看看下图的代码你能认识吗&#xff1f;来自.NET6的MiniAPI框架&#xff0c;直接在MapGet里面使用…

jdk8之lambda

2019独角兽企业重金招聘Python工程师标准>>> Oracle号称今年一定发布jdk8, 即使有bug, jdk8无疑最大的宠儿就是lambda表达式了&#xff0c;还是直接上代码&#xff0c;看看lambda表达式怎么了。 环境&#xff1a; openjdk8, eclipse4.3.1(支持jdk8编译) 实例代码&…

【转】Asp.Net中Excel操作权限的问题

近日在打开原来写的一个网页程序运行时&#xff0c;出现了Excel操作权限的问题&#xff0c;具体的说就是在代码中调用下面这段与Excel操作有关的语句时 Application curExcelApp new ApplicationClass(); 提示权限不足&#xff0c;具体的提示内容如下&#xff1a; 检索 COM 类…

Visual Studio 2022 预览版2 发布啦

我们很高兴地宣布 Visual Studio 2022 的第二个预览版发布啦&#xff01;预览版 1 是有史以来第一个 64 位 Visual Studio&#xff0c;提供了改进的可扩展性。从预览版 2 开始&#xff0c;我们专注于提供有关个人和团队生产力、现代开发和不断创新等主题的新功能。在本文中&…

批作业是小学老师的一大乐趣 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅

【小安翻唱】凉宫春日的忧郁--冒険でしょでしょ第五届外语歌曲大赛助兴节目~绫魂论坛送aya的生日礼物筹备开始~...

第五届外语歌曲大赛如火如荼的进行的听了那么多参赛选手的歌曲自己也不由的也想唱唱正好遇上绫魂论坛的各位管理员为aya筹备生日礼物 好吧~ 我也来小唱一首 小小的final版送上~&#xff08;非正式版 请无视错词和中间以及最后的杂音 灭哈哈&#xff09; 顺便再借用了一下某位选…

WCF后续之旅(11): 关于并发、回调的线程关联性(Thread Affinity)

对于一般的多线程操作&#xff0c;比如异步地进行基于文件系统的IO操作&#xff1b;异步地调用Web Service&#xff1b;或者是异步地进行数据库访问等等&#xff0c;是和具体的线程无关的。也就是说&#xff0c;对于这些操作&#xff0c;任意创建一个新的线程来执行都是等效的。…

成年人改变生活的方式,都是从它开始

全世界只有3.14 % 的人关注了青少年数学之旅2019已经不足80天&#xff0c;年初立下的flag倒了几个&#xff1f;史蒂夫马丁有一句话&#xff1a;“所有的人生谜语都可以从阅读中找到答案。”无论是读影评、读好书&#xff0c;亦或者涉猎趣闻轶事、汲取犀利观点&#xff0c;总会悄…

表白和被表白时遇到的骚操作,最后一个天秀!| 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅【1】【2】【3】【4】【5】【6】【7】【8】【9】

这么简单的序列化 System.Text.Json.Serialization 也报错了?

咨询区 kofifus&#xff1a;我准备将项目中的 JSON.NET 切换到原生的 System.Text.Json&#xff0c;但我遇到了个意外报错&#xff0c;测试代码如下&#xff1a;using System.Text.Json.Serialization; using Newtonsoft.Json;public class C {public C(string PracticeName) {…

直观机械动图,一秒看懂原理!

全世界只有3.14 % 的人关注了青少年数学之旅这些神奇唯美的机械动图&#xff0c;让我们不得不感叹制造的魅力&#xff01;仿生四翼飞行机器人▲单手磁性拉链▲风洞实验——模拟飞机飞行▲可以说是最快的折弯机了▲这是谁设计的死循环▲高压水除锈▲摩擦焊接▲打地洞▲能轻松把车…