10月21日,杭州云栖大会-技术&可持续发展论坛,注册有礼 了解详情
写点什么

微服务的额外代价

2015 年 6 月 04 日

过去一年里,我们已经听到很多关于微服务的讨论。无论你觉得它们是一种新的架构方式,还是认为它们仅仅是对SOA 理念进行了重新包装,毋庸置疑的是微服务的理念正在席卷整个程序员社区。 Martin Fowler 的一篇文章经常被作为微服务的原始素材所引用,文章详细阐述了像 Netflix 这样的组织使用微服务的经验和成果。最近,Martin 在这个话题上又有新的言论,特别谈到了开发人员什么时候应当考虑使用微服务。

微服务 [噱头化] 带来的的后果之一是,我们看到开发团队太渴望拥抱微服务,却没有意识到他们要为此付出的代价。这增加了一个项目的成本和风险——经常会使项目陷入到严重的麻烦当中。

Martin 承认,微服务的术语最近可能有炒作之势,但它作为一种有用的架构风格已经存在很长时间了。有趣的是,Martin 并没有将这种风格视作 SOA 的一个变种,尽管他作为先驱见证了微服务最早的一些发展。不管微服务的名字叫什么, Martin 还是对程序员想要知道的答案做出了解释:究竟微服务架构对你的系统来讲是不是一个好的选择?

系统自身的复杂性是你决定是否使用微服务的一个决策点。微服务的方法适用于处理复杂系统,但微服务自身也会引入一组新的复杂性问题。当你使用微服务时,你必须有自动部署、监控、异常处理、最终一致性保证,以及其它分布式系统引入的各种复杂因素。

Martin 在他的文章中包含了一个图表,试图展示微服务应用与典型单体应用相比,它是如何改变系统复杂性的。他的建议是:

除非你面对的是一个过于复杂以至于难于管理的单体应用,否则绝对不要考虑使用微服务。大多数的软件系统应该构建为独立的单块程序。确保注重单体应用自身的模块化,而不要试图把它们分离成单独的服务。

有多种驱动程序员使用微服务的复杂难题,包括多应用并存、支持多个业务功能独立发展和扩展。然而,在 Martin 的观点中,采用微服务的决定性因素应当是单块应用已经过于庞杂以至于难以修改和部署。然而,正如我们去年的报道,Simon Brown 做了一个有趣的观察。

如果您正在构建一个单体系统,而它正在变成了一个大杂烩,也许你应该考虑是否足够对软件架构足够关注。你真的理解了软件中核心的结构性抽象吗?它们的接口和责任明确吗?如果不是,你为什么认为迁移到微服务架构可以有所帮助?当然,微服务将迫使你的系统物理分离从而无法走捷径,但是通过单块应用组件之间的分离也能达成同样的效果。

Martin 对于微服务和单体应用的看法更加客观。

很多归结于单体应用的问题其实并不是那种架构风格所自有的。我听说过人们说,你之所以需要使用微服务,是因为在单块应用中无法做到持续交付 - 然而已经有很多公司成功的完成了曲奇分割式部署( cookie-cutter deployment ) 的方式:Facebook 和 Etsy 是两个很著名的例子。

他还认为,将系统规模的增长视作你被迫使用微服务,从而使部件(组件)更容易替换的理由并不成立。认为单体应用不会有定义良好的模块边界的理由也并不充分。然而,Martin 通过实践认为,由于这些边界通常太容易被逾越,所以单体应用很容易被冠以大杂烩( Big Ball of Mud )的称号。总之,Martin 还是希望人们在决定向微服务架构跨越之前,深思熟虑一番,认真考虑架构和系统实现中的所有因素:

当代码规模等复杂性问题不断涌入项目时,我看到很多团队会发现微服务是个不错的选择。你要始终牢记微服务会带来了高昂的额外开销,显著减缓你的开发效率,除非你面对的复杂性难题确实需要微服务来解决。所以如果你能够保证系统足够简单,从而避免使用微服务:那怎么简单就怎么做吧。

查看英文原文 Microservices Premium


感谢张龙对本文的审校。

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

2015 年 6 月 04 日 10:213567

评论

发布
暂无评论
发现更多内容

网络安全产品之堡垒机应用于金融行业案例讲解

行云管家

云计算 网络安全 等保 堡垒机

惊了!网易架构大牛熬夜手敲千页网络协议笔记,竟在Github上标星百万!

Java 架构 面试 程序人生 编程语言

理论+实例,带你掌握Linux的页目录和页表

华为云开发者社区

Linux 内存管理 寄存器 页目录 页表

马萨卡!阿里大佬珍之若宝的最强高并发pdf,竟然被上传GitHub开源

Java 架构 面试 编程语言

Android 资源溢出崩溃轻松解

字节跳动终端技术

字节跳动 移动开发 Mars 火山引擎 MARS-APMPlus

Java集合核心内容之葵花宝面,搞定90%以上的技术面!建议收藏

程序员小呆

Java 程序员 架构师

面试不要慌!阿里新产Java面试通关笔记(Java基础+算法题+计网+设计模式+数据库+开发框架+中间件技术)全都有

程序员小毕

Java spring 架构 面试 设计模式

程序员常用的工具软件推荐

程序员小呆

Java c++ 程序员 架构师 Go 语言

GitHub上首本IntelliJ IDEA操作手册,标星果然百万名不虚传

Java 架构 面试 程序人生 编程语言

超全算法笔试题精解合集,阿里内部《程序员面试宝典》简直太牛了

程序员知识圈

Java 程序员 面试 算法 编程语言

网易云信 NERTC 高清画质体验之 H.265的工程实践 | 体验共享技术专题

网易云信

Java 测试 音视频 视频

为什么网络 I/O 会被阻塞?

云流

编程 架构 操作系统 计算机

2021金九银十阿里Java岗7轮技术面经历,险幸上岸

胧月

Java 程序员 架构 面试 计算机

4面余额宝Java技术岗面经总结,2021互联网大厂常问的面试题总结!

程序员知识圈

Java 程序员 架构 面试 编程语言

EMQ X VS RabbitMQ:两大消息服务器 MQTT 性能对比全解(下)

EMQ映云科技

RabbitMQ 物联网 IoT mqtt emq

会声会影和剪映在音频处理功能上的比较

懒得勤快

2022年最新Java小白学习路线总结,从零基础跟着学习不掉队(PDF+视频分享篇)

Java 编程 计算机 java面试 程序员吧

JS的深浅复制,原来如此!

华为云开发者社区

js 序列化 深复制 浅复制

Qcon 免费报名 | 融云「实时通信技术专场」议题抢鲜看

融云 RongCloud

开发者 通信云 场景化

轻松搞懂mysql的执行计划,再也不怕sql优化了

互联网架构师小马

2021年高频Java面试题集锦(含答案),让你的金九银十面试之路畅通无阻!

程序员知识圈

Java 程序员 架构 面试 编程语言

堡垒机提供的运维报表有什么用?怎么简单解释?

行云管家

运维 堡垒机 IT运维

Zookeeper 集群部署的那些事儿

牧小农

zookeeper

手把手带你做LiteOS的树莓派移植

华为云开发者社区

树莓派 系统 LiteOS arm 树莓派移植

英特尔举办第十四届物联网峰会,携手中国生态伙伴迈向融合边缘新时代

科技新消息

保持高效学习的 7 个方法

Phoenix

学习方法

相约 DTCC 2021 | Tapdata 受邀分享:如何打造面向 TP 业务的数据平台架构

tapdata

图解算法|Leetcode官方算法刷题小册火了,已帮助43位小伙伴挺进字节跳动

程序员小毕

源码 程序员 面试 算法 设计模式

这还不够全?阿里P8架构师耗时八年时间才整理出来这“Java核心知识PDF(Java高岗)

山田心

Java 程序员 架构 面试 后端

我凭借这份pdf拿下了蚂蚁金服、字节跳动、小米等大厂的offer

Java 编程 程序员 架构

阿里P8手抄本惨遭泄露,并出现病毒式传播,致28人斩获大厂offer

收到请回复

Java 面试 阿里 大厂Offer

数据cool谈(第1期)数据库寻路,开源有态度

数据cool谈(第1期)数据库寻路,开源有态度

微服务的额外代价-InfoQ