微服务是近年兴起的一个概念,是指将应用程序设计成一套可以单独部署的服务。Martin Fowler是ThoughtWorks的首席科学家。他与ThoughtWorks首席顾问James Lewis合作发表的《微服务》,可谓是了解微服务架构风格的入门必读。近日,Fowler又提出了MonolithFirst策略。

\\

在许多使用微服务架构的案例中,Fowler注意到了如下两种常见的模式:

\\

  • 几乎所有成功的微服务案例都始于分解过大的“单体(monolith)”应用; \\
  • 几乎所有从头构建的微服务系统最后都陷入了麻烦。\

Fowler认为,虽然微服务是一种有用的架构,但由于会产生“微服务佣金(MicrservicePremium)”,所以它只适用于复杂的系统。服务管理成本会减缓项目进度,因此,简单的应用更适合采用单体架构。在此基础上,他提出了MonolithFirst策略,其基本思想是:即使应用后续可能受益于微服务架构,但开始时仍然将新应用构建为单体应用。这主要是出于以下两个方面的考虑:

\\

  • Yagni原则——确定软件思路是否有用,最好的方法是创建一个简化版本,然后看它的使用效果。在这个阶段,最重要的是速度,而该原则可缩短反馈周期,避免微服务佣金。 \\
  • 明确的有界上下文集合——只有服务存在良好且稳定的边界,微服务才能有效地发挥作用。但是,任何微服务间的功能重构都比在单体架构中难度大,即使是经验丰富的架构师在自己熟悉的领域里,也很难在一开始就恰当地定义出边界,而首先构建一个单体应用有利于明确功能边界。\

Fowler列举了如下几种MonolithFirst策略执行方法:

\\

  1. 仔细设计一个单体应用,留意软件模块划分,包括API边界和数据存储方式。做好这些工作后,向微服务切换就相对简单了。 \\
  2. 开始时采用单体架构,然后逐步从系统边缘剥离出微服务。 \\
  3. 首先构建一个单体架构作为“牺牲架构(SacrificialArchitecture)”,然后整个的替换掉。 \\
  4. 以几个粒度较大的服务开始,待功能边界稳定后再分解成细粒度的服务。\

对于第一种方法,Fowler指出,并不是任何一个系统都可以分解成微服务。有许多系统,由于模块之间相互依赖度太高而难以分开。而且,目前为止,他还没有看到多少采用这种方法的成功案例。第二种方法会在微服务架构的内部保留一部分单体架构,新开发功能采用微服务架构模式。对于第三种方法,Fowler提醒说,“不要害怕构建一个将来会被丢弃的单体应用,尤其是当它能使软件快速推向市场时。”第四种方式可以让团队获得服务开发及管理经验,而粗粒度的服务还能减少服务间的重构,这有利于后续向微服务迁移。

\\

Fowler承认,他现在还不知道如何确定一个项目是否要使用MonolithFirst策略。但同时,他认为,除非团队有适当的微服务系统构建经验,否则,不要从微服务开始构建一个新系统。Sam Newman是Fowler的同事,他分享了一个团队考虑在新项目中使用微服务的案例,感兴趣的读者可以进一步阅读。

\\

Fowler的文章在Hacker News上引发了激烈的讨论,许多网友都提出了不同的看法,krisdol就是其中之一。他认为,Fowler的观点与他所处的环境有很大的关系。ThoughtWorks是一家帮助其他公司解决问题的顾问公司,也就是说,他们会在某个公司的单体应用出现问题时提供帮助,将其重构为微服务架构。因此,Fowler才能得出MonolithFirst的结论。而实际上,现在已经有许多微服务优先的案例,只是身在顾问公司的Fowler接触到的可能比较少。所以他的观点是,微服务优先,尤其对小团队而言,比每个人都共享同一个代码库更有助于项目的快速进展。

\\

而有两年微服务开发经验的网友room271则表达了相反的观点,他认为,在小公司/团队中,采用微服务可能不太明智,因为它对技能的要求比较高,会导致得不偿失。但同时,他觉得,MonolithFirst是顾问公司的立场,因为当单体应用出现问题时,他们可能已经完成项目离开了。

\\

当然,也有许多网友表示支持,认为微服务设计很难上手也很难重构,而且对技能要求太高。网友btilly就指出,即使不采用MonolithFirst策略,构建一个原型单体系统也是很有价值的。

\\


感谢徐川对本文的审校。

\

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号:InfoQChina)关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入InfoQ读者交流群)。

MonolithFirst:单体应用优先策略相关推荐

  1. Tair的桶分布策略介绍及新的机器级位置安全优先策略实现

    Tair在其intro wiki 上介绍了其现有的桶分布策略: 程序提供了两种生成分配表的策略, 一种叫做负载均衡优先, 一种叫做位置安全优先. 负载均衡优先 当采用负载优先策略的时候, config ...

  2. 2021-2026年中国数字化转型市场预测:通过应用场景践行数字化优先策略

    近日,国际数据公司(IDC)发布了<中国数字化转型市场预测,2021-2026:通过应用场景践行数字化优先策略>研究报告. 本研究给出了中国数字化转型支出规模和未来五年预测,包括硬件.软件 ...

  3. 中国式危机公关9加1策略(第九章 供应链优先策略)

    第九章 供应链优先策略 第一节 供应链优先策略的应用背景 供应链,本来是作为物流领域的一个专有术语,现在被广泛用在了企业管理上.而此处所用供应链,意在强调危机管理实际上是个环环相扣的过程,如何织造这个 ...

  4. mysql可靠性优先策略

    在双 M 结构下,从状态 1 到状态 2 切换的详细过程是这样的: 1判断备库 B 现在的 seconds_behind_master,如果小于某个值(比如 5 秒)继续下一步,否则持续重试这一步: ...

  5. UA SIE545 优化理论基础9 优先与分治策略1 文件的最优存储顺序

    UA SIE545 优化理论基础9 优先与分治策略1 文件的最优存储顺序 单磁带存储 相同查询频率 相同文件长度 查询频率与文件长度均不同 单磁带存储 相同查询频率 这一章介绍优先策略与分治策略,我们 ...

  6. 微服务系列(七):将单体应用改造为微服务

    编者的话|本文来自 Nginx 官方博客,是「Chris Richardson 微服务」系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第三篇描述了微服务架构模块 ...

  7. 【转】应用架构一团糟?如何将单体应用改造为微服务

    概述 将单体应用改造为微服务实际上是应用现代化的过程,这是开发者们在过去十年来一直在做的事情,所以已经有一些可以复用的经验. 全部重写是绝对不能用的策略,除非你要集中精力从头构建一个基于微服务的应用. ...

  8. 微服务拆分策略和原则

    目录 微服务拆分目的 单体应用拆分成微服务的时机 拆分时指导原则 拆分的粒度把控 微服务拆分策略 微服务合并 拆分过程中要注意事项 注意:本文参考  微服务拆分策略和原则 - 简书 微服务拆分目的 不 ...

  9. 【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY )

    文章目录 一.闭包的代理策略引入 二.闭包的四种代理策略 一.闭包的代理策略引入 分别在 Groovy 脚本 和 Test 类中定义 fun 方法 , 打印不同的内容 ; 在闭包 Closure 中分 ...

最新文章

  1. 四大指标超现有模型!少样本的无监督图像翻译效果逆天| 技术头条
  2. 有趣的开源 AI 换脸工具:faceswap
  3. centos 编译 mysql_Centos Mysql 编译安装调试
  4. CR渲染器全景图如何渲染颜色通道_如何制作SSS材质
  5. python线程状态_Python线程
  6. 九度1377缓变序列
  7. 光栅图形学算法基础其三 (消隐算法)
  8. Chapter 2 Open Book——5
  9. Interesting Finds: 2008.04.24
  10. 在文件中查找和替换,覆盖文件不起作用,它清空了文件
  11. W3Cschool_JS学习
  12. 用POP3获取邮箱邮件内容(完整C#源码)
  13. read/write函数
  14. 计算机硬件系统不包括什么,硬件有哪些(计算机硬件不包括)
  15. UE5再次更新!扫描或手动建模面部模型可直接转为绑定好的Metahuman
  16. java 监听客户端的退出_Java socket 服务端如何监控客户端异常关闭?
  17. 小程序点击删除后刷新当前页面
  18. 用指定的用户名和密码无法登录到该FTP服务器
  19. 【LeetCode 172. 阶乘后的零】
  20. 利用c++编写一个养成类小游戏

热门文章

  1. 查看Linux系统架构的命令,查看linux系统是哪种架构:AMD、ARM、x86、x86_64、pcc 或 查看Ubuntu的版本号
  2. YOLOv3 Darknet安装编译与训练自己的数据集
  3. php cache缓存 购物车,Yii2使用Redis缓存购物车等数据
  4. matlab溢出的标志inf,关于C#:溢出与信息
  5. Chronometer的使用
  6. 题目1178:复数集合
  7. 洛谷 - P1381 - 单词背诵 - 哈希 - 尺取
  8. hbuilder ios 打包失败,无法导入p12证书的解决方案
  9. 将redis作为windows系统的系统服务
  10. 如何从用户体验的角度去做一个网站的页面设计