慎用 “微服务” 架构

2014年,Martin Fowler 与 James Lewis 共同提出了微服务的概念,然后微服务就开始火遍大江南北,很多技术团队和公司开始使用微服务架构,然而,谁用谁痛谁知道,“微服务”绝对不是银弹。使用“微服务”架构一定要慎重!

什么是“微服务”?

“微服务”并没有严格意义上的定义和规范,借用一段维基百科上的描述:

微服务 (Microservices) 是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础,利用模组化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关(Language-Independent/Language agnostic) 的 API集相互通讯。微服务架构运用于软件架构风格的其中一项概念是甘露运算 (Dew Computing),意指由许多的小露水(代表微服务的功能元件) 汇集而成的运算能力。

“微服务”架构的优点

哪位看官问,既然“微服务”架构能火遍大江南北,那它一定有它的优势吧?是的,任何事物能够存在甚至大热,都不可能是无缘无故的,必有其道理所在。“微服务”架构自然也不例外!其优点如下:

  • 独立性,每个微服务都可以部署在独立的物理机、虚拟机或者Docker上,使其原生具备分布式的架构设计;
  • 可扩展性,基于其独立性,可以容易的根据业务或技术线对微服务架构进行水平或垂直扩展;
  • 可升级性与易维护性,依然基于其独立性,每个微服务都可独立进行升级与维护
  • 任意编程语言,每一个微服务都可以按照开发团队自己熟悉的编程语言进行开发,然后按照REST协议或者RPC协议制定API来提供服务

一些团队看到“微服务”架构的优点就像是找到了救命稻草一般,立即开始实施。结果,他们遇到的是,系统间、服务间的高耦合,导致团队间协作大打折扣;测试进行集成测试时,需要遍历整条业务线的多个微服务系统,导致测试用例指数攀升,而测试效果却不太理想。有一定经验的看官可能回想,这群人一定是在“微服务”架构划分的时候做的不够好,才会耦合度这么高。可这么多公司前仆后继的掉进这个坑里,你就不得不想这其中的必然性了。让我们看看对于“微服务”架构的一些误区。

“微服务”架构的误区

  • “微服务”架构能够让系统结构看起来更清晰和简洁
    一个简单的事实,就算是单一系统,只要架构设计合理并严格执行代码的架构审核,结构清晰和简洁一样很容易做到。一些团队长期受到现有代码架构混乱的蹂躏,拿起“微服务”就来用,其实简单的代码迭代重构在很多情况下是更加可控的选择。

  • “微服务”架构很容易实现
    首先,“微服务”架构的解耦就够你受的;其次,不可避免的会在一次请求中涉及多个服务,而多个服务有可能相互依赖,此时分布在不同微服务的数据很可能是事务性的,这种分布式的事务处理,搞不好就会出大事。

  • “微服务”更快
    不可否认,论到单个微服务的优化,我们可以从减少单个微服务处理的业务类型,使其更加专一等手段来提升其执行效率,但是源自微服务的分布式架构,其网络I/O的代价必须考虑在内,这使得原来在单一系统中程序内部的信息交换被搬到了网络层,一个不小心,程序效率降低妥妥的。

  • 对程序员更简单
    由于微服务往往更专注于一个单一的功能,因此开发人员在处理功能内部问题时,的确会更加简单一些。但微服务的目的是在集成系统中承担部分服务,不可避免的要与核心系统或系统的其它部分进行协作交互,而涉及到这方面的问题,不但需要开发人员对涉及的系统有所了解,涉及的多个团队还需要进行同步协助来处理Bug,而可能遇到的一种情况是,人们对于这种Bug缺乏责任感,经常会想方设法的将bug推给其他团队,沟通成本严重影响开发效率。另外,对于测试人员,一点小的改动就有可能需要多个服务的继承测试,无论从测试用例的复杂度还是测试环境的搭建,都是一件不简单的事情。

何时使用“微服务”架构

  • 当你的系统已经具备很大的规模,集成了大量的服务,可以考虑部分使用“微服务”,千万不要在项目初期就使用微服务,此时整个系统还很小,随着系统和业务的不断成长,系统架构会经历大量的变更,如果在初期就使用微服务,很容易造成微服务间的强耦合。
  • 当你对你的系统具备非常深刻的认识,并且能够很轻易的划分出各个功能、服务的边界,此时可以尝试考虑“微服务”架构
  • “微服务”架构应该以业务划分为主,业务与业务之间的耦合度可以轻易的看出,以业务进行划分,系统的耦合度比较可控
  • 最后,只有你能真正列出系统迁移到微服务架构的利与弊,并做好了应对之策时,才可以着手实施

如果你有任何问题或建议,可以扫描下方二维码或者微信搜索[phpjiagoushier],关注我的微信公众号[PHP架构],参与互动交流。
phpjiagoushier

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 4年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 7

手动点赞

6年前 评论

好多人片面的为了SOA而SOA。然而,我们不是。

6年前 评论

千万不要在项目初期就使用微服务

比较同意这句话,项目刚开始时最重要的是快产出,所以刚开始只需要有意识为以后升级迁移预留想法即可。

毕竟80%的项目都会夭折。

6年前 评论
颜⑧

感觉还是要看团队,微服务架构虽好但不是万金油的架构。

6年前 评论
杨圆建

能不用微服务,尽量不用微服务

5年前 评论

超级赞同了,一开始就要微服务,结果服务间、系统间的高耦合,让数据库设计都很头疼,
既然微服务了,肯定就得分库分表了,要独立,就不能用orm去做很简单的关联
请求一个接口,要调多个微服务,网络请求也都耗时啊- - 并没有更快- -

5年前 评论
Jaysan_Ran_Peng

高耦合和一个流程中遇到的多个微服务组合完成并且又有事务,这个是最大的问题,楼上说的网络请求耗时,那个到是好解决,弄一个网关,一次网关请求并返回全部集群数据就完成了

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!