昨晚睡觉前,顺手撸了几个群聊的聊天记录。发现一个很有意思的名词“分布式单体”,顺藤摸瓜看了一下之前的聊天记录,由于内容骂骂咧咧,我就不贴出来了。大致内容就是某公司在做微服务改造,但改的不伦不类,形式上像微服务,而本质上依然是单体,甚至连单体都不如。

这样的改造现象,其实在国内还是蛮多见的。今天我们就来聊聊这个有趣的话题:分布式单体。各位看官,看看你们公司是不是也犯了这样的错误?

分布式单体为什么不好

先思考一个问题:从单体改造到微服务的时候,你们是不是按这样的步骤来的?

  1. 确定业务领域,拆分存储,定义各微服务的边界

  2. 改造代码逻辑,将原来的内部service调用改成dubbo或feign这样的远程调用

通过这样的改造,我们得到了很多好处,比如:

  1. 代码库分开了,减少了麻烦的解决代码冲突的困扰

  2. CI/CD分开了,每个拆分后的服务都可以独立开发、部署、运行

  3. 数据库分开了,独立运行,不同业务模块不会互相影响

这样一顿操作,我们把一个臃肿的单体应用变成了多个精炼的分布式应用,似乎完美的实现了改造?但这样就实现了微服务的核心目标了吗?继续思考下面的问题:

  1. 代码库是分开了,但每个服务都在独立迭代吗?是不是每个需求都要协调一大堆同步接口?

  2. CI/CD是分开了,但每次发布都是自由的吗?是不是每次功能的发布都拖上了一大推的服务要一起发布?

  3. 数据库是分开了,但似乎有个服务挂了,依然导致很多功能就都不正常了?

看似我们得到了很多好处,但我们的开发效率真的得到了提升吗?虽然我们以前一个单体应用启动要3分钟,现在拆分后,一个项目启动30秒,但每次开发调试要同时开好几个项目同时启动?这样的开发体验真的爽到了吗?

看似完成了微服务改造,实则依然是个单体应用,只是从原本的集中式实现,变成是分布式实现。原来我们只是做了一次无用功,真正的收益微乎其微。

而实际上,这样的改造,除了收益不高之外,还带出了更多的坏处。如果你们公司是这样做的,有没有发现,这样做之后,好像系统故障的频率更高了?稳定性似乎比单体应用还差?(如果没有,那一定要感谢你们的运维团队真的很给力,同时建议把这篇转给运维团队,采访下这样的改造是不是他们变得更累了?!)

为什么这样的改造会导致系统更加不稳定呢?其实道理很简单,原本我们在单体应用中,未拆分的远程调用都是内部调用,这个内部调用所能引发的故障率是微乎其微的,而将这部分内容拆成了远程调用后,每一个调用都增加了网络IO的因素,每一次调用的故障率都增加了。那么系统的整体故障率是随着系统拥有多少同步远程调用的数量增加而增加的。当运维团队与开发水平没有支持好这部分增加的复杂度时,那么改造的系统,必然稳定性会比原来的单体应用更差。

所以,这样改造的结果,不但没有得到很多的收益,反而会带来很多稳定性上的损失。

改造走样的元凶

那么为什么会造成上面所说的问题呢?我觉得主要有两方面:

  1. 领域拆分的不合理,引出了过多的同步远程调用

这个是最根本的问题,也是在改造过程中最常见的。这部分说实话是整个改造过程中最难的,因为需要对业务有非常深入的认识,对系统设计的领域模型、用户行为有足够的理解。在做拆分的时候,尽可能的减少同步远程调用,取而代之的是走消息的异步交互,同时根据业务需要也可以做适当的数据冗余。这样就能保证,每个被拆分后的微服务之间可以获得更低耦合度。

因为更低的耦合度,我们才能在不做任何优化的情况下,获得更少的分布式所带来的稳定性损失。对于后面要将的第2点的工作量也就越少。同时,对于真正的独立开发、部署、运行也成为可能。

  1. 简单粗暴的实现,缺少分布式的保护机制

在很多团队里,因为业务需求多与人员配置少的矛盾之下,开发人员很容易出现对远程调用不做足够的保护机制,比如:接口提供方的限流策略(保护自己不被别人搞死),接口调用方的降级策略(保护业务更高的可用性),接口调用方的熔断策略(保护自己不被别人拖死)。只有认真对待每一个分布式环境下的依赖点,那么才能解决因为分布式改造所牵连出的诸多问题。

但要做好这一点的核心,还是对第一点的把握,只有在领域模型上做更合理的拆分规划,才能支持开发人员做好这个点,不然随意的拆分,一大堆接口调用压给本就压力很大的开发人员,那这部分的开发质量肯定很难保障了,自然而然的系统稳定性就开始随着接口复杂度的增加而不断下降了。最后,开发人员就会开始来我们群里吐槽了...甚至大家也开始怀疑微服务根本带不来效率的提升!

最后,思考一下,你们的微服务改造有出现这里我说的情况吗?还是有其他不一样的问题呢?欢迎留言区说说你们的问题,聊聊你的观点!

往期推荐

薪酬及996 Top 10来了!996高薪955底薪,选哪个?

Dubbo:Spring Cloud 服务调用的新选择

一个优秀的程序猿,肯定要注意有些名字不能取!

19 个接私活平台汇总升级版,你有技术就有钱

水货CTO,将熊熊一窝

如果你喜欢本文,欢迎关注我,订阅更多精彩内容

关注我回复「加群」,加入Spring技术交流群

点击领取:青春经典游戏大合集

喜欢的这里报道

↘↘↘

你以为在做的是微服务?不!你只是做了个比单体还糟糕的分布式单体!相关推荐

  1. “一学就会,一做就废”——微服务的架构模式:一个服务一个数据库模式(中)

    今天这篇文章我想谈谈: 一个服务一个数据库这种最基本的模式落地,大体的做法是怎么样的. 一.搞微服务,可能是个政治问题 我第一次接触微服务的时候,真的是迫不得已. 公司有一套大型系统,这套大型系统当时 ...

  2. 微服务架构,如何做分布式,通用缓存机制?

    在分布式系统中,特别是最近很火的微服务架构下,有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案,这篇文章将结合一些实际的研发经验,尝试理清其中存在的关键问题以及探寻通用的解决之道. 什么 ...

  3. imageJ 如何下载plugin_如何给微服务架构的项目做验收测试?

    作者 | 钱嘉 ​在验收测试阶段,基于微服务架构的应用相对于单体架构的应用而言,具有以下挑战: 复数的服务增加了测试环境搭建的难度 各种异常情况的模拟变得困难,基于Mock 的测试方式无法对整个调用链 ...

  4. 微服务面试必问的Dubbo,这么详细还怕自己找不到工作?

    Dubbo 起源于阿里巴巴,对于我们做电商开发的人来说,基本是首选的技术,那么为何一个区区 soa 服务治理框架,会受到这么多人的青睐呢? 今天就跟着小羽一起看看这个微服务框架之一的 Dubbo 的详 ...

  5. Spring Cloud搭建微服务架构----使用Zipkin做服务链路追踪

    2019独角兽企业重金招聘Python工程师标准>>> 实例主要有三个工程组成: Server-zipkin:通过ZipkinServer功能,实现收集调用数据,展示: Servic ...

  6. 读书笔记-SpringCloudAlibaba微服务原理与实战-谭锋-【未完待续】

    SpringCloudAlibaba微服务原理与实战 谭锋 电子工业出版社 ISBN-9787121388248 仅供参考, 自建索引, 以备后查 一.应用架构演进.微服务发展史 1.单体架构 一般来 ...

  7. 如何设计一个复杂的业务系统?从对领域设计、云原生、微服务、中台的理解开始...

    欢迎关注方志朋的博客,回复"666"获面试宝典 01 如何解决复杂业务设计 Aliware 软件架构设计本身就是一个复杂的事情,但其实业界已有一个共识,那就是"通过组件化 ...

  8. GitHub 的微服务架构设计与实践

    以下文章来源方志朋的博客,回复"666"获面试宝典 本文介绍 GtHub 如何从单体架构迁移到微服务架构,并对其中一些最佳实践做了详细说明. 1 旅程开启 GitHub 创建于 2 ...

  9. 企业微服务中台落地实践和思想之我见

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 作者 | 朱德明 微服务和中台是这几年非常时髦随处可见的词,最先在一批互联网企业中开始谈论和建设, ...

最新文章

  1. “BitPico称BCH98%的节点或位于同一服务器机架中”?
  2. (转)轻量级 UML 建模工具JUDE 介绍(二)
  3. mesos+marathon平台搭建
  4. 项目发布错误的解决方法
  5. PHPMailer 发送邮件
  6. Managing Gigabytes--文本压缩
  7. Docker常见问题总结
  8. .NET Core2.0 使用EF做数据操作
  9. Win-MASM64汇编语言-visual studio下环境搭建
  10. bzoj 3750: [POI2015]Pieczęć(模拟)
  11. 机房监控系统解说—开关传感器篇
  12. windows 服务的安装与卸载之bat脚本命令
  13. 【15】万魂杀服务器开发之原始NIO、Mina、Netty使用
  14. [2018.10.18 T3] 玩串
  15. r语言Isfit_应用统计学与R语言实现学习笔记(七)——拟合优度检验
  16. Android系统开机画面修改
  17. 量化选股——基于动量因子的行业风格轮动策略(第2部分—策略回测)
  18. ProSci 艾美捷CCR3抗体
  19. python最难的地方_全国 41611 个景点,程序员用 Python 告诉你哪些地方最值得一游!...
  20. 关于iOS录音后播放声音小的问题

热门文章

  1. 亮剑:PHP,我的未来不是梦(3)
  2. linux cpu拓扑查看工具 hwloc 简介
  3. linux c 结构体初始化的四种方法
  4. golang 短连接和长连接 超时处理
  5. Win8 Hyper-V虚拟机 安装运行Ubuntu教程
  6. 终端读写命令 -- read write wall
  7. Linux2.6--虚拟文件系统
  8. iis7配置php mysql_IIS7配置支持PHP方法
  9. 南通专转本计算机考试几级,江苏专转本考试了解多少?
  10. java实现一个跳转结构程序,Java程序设计基础(第6版)最新章节_鲜征征著_得间小说...