来自:分布式实验室 公众号,作者:解博

想在网上挨骂,最简单的方法就是写点关于微服务架构的东西。每个人对微服务都有自己的一套见解;无论我们是赞扬还是批评,总会有人跳出来强调“你错了”。行吧,这毕竟是个遍地懂王的时代,挨喷实属难免。我最近也写了几篇关于微服务的热闹文章,读者们的评论可谓鱼龙混杂、荒诞与睿智交融。但必须承认,我们确实能从中提炼出构建微服务架构时的几种常见错误。首先需要明确一点:构建分布式系统确实相当复杂。当然,单体式系统的构建也不简单。但二者的区别在于,分布式系统的复杂度有很大的空间,而很多人的实施方案在毫无必要的情况下拉升了复杂水平。任何有经验的开发者或者架构师都认为,大多数人实际并不需要全盘接纳微服务。所以接下来要讨论的重点,就只针对那些确实有必要采用微服务架构的场景。

另外,我们的团队在尝试微服务方面确实起步较早,而且几乎把能犯的错误都犯了个遍。下面我就来聊聊我们自己当年吃过的那些亏。

1. 定制化构建太多

微服务架构中各服务间的通信往往正是麻烦的来源。有人认为之所以让人头痛,是因为事务也被系统架构给硬生生“分布”掉了。以典型的电子商务应用为例,微服务架构下的新订单创建流程可能需要在多项不同服务之间进行操作,例如订单与客户服务。而在单体式应用中,创建新订单就只需要调用一个函数。大家当然可以用saga来处理多服务事务,但saga本身的实现难度也同样不低。

但我们确实没找到更好的办法,于是我们选择基于编排的saga解决这个难题。这种方法的优势,是让我们以定制化方式在各服务中使用消息代理实现saga的通信与执行。接下来,使用Redis流与Go语言构建之后,最终产出的成果相当整洁、整个实现过程也充满趣味。但事后来看,我们当初就不该用微服务架构,这类应用完全就是单体式架构的理想场景。

2. 复杂性失控

这个问题的实质在于经验:从技术上讲,有些路线压根就没必要尝试,因为明显跟项目时间表和当前团队的技术水平相冲突。如果意识不到这一点,或者说误以为微服务是万能的,那麻烦紧跟着就来了。

请允许我强调一点:单单在YouTube讲座里听得热闹,并不代表那些解决方案就能在我们自己的项目中顺利起效。所以最好能预先给能够承受的复杂度设置明确的上限,这样能给大家省下大量宝贵时间。换个角度说,这类问题也可能源自“我们留的时间太多了”——如果项目的截止日期更紧,没准就不会瞎折腾什么微服务架构了。

这里同样需要认真权衡——如果把复杂度设置得太低,那我们最终拼凑出来的就是一架由筷子组成的飞机;但如果复杂度被定义得过高,那我们的飞机永远也没机会离开跑道。无论哪种情况,都不是我们希望见到的。所以大家最好能先把项目要求整理明确,然后发布在Medium上进行求助,聪明的工程师们肯定会给你一些靠谱的建议。

3. 定义过于松散

最后,别指望一套方案就能解决我们的大部分问题。归根结底,分布式架构的出现就是为了解决一个特定问题。所以在决定使用之前,先弄清楚分布式适合解决什么问题、您自己面对的是什么问题,二者之间到底匹不匹配。但那时候,我自己的团队这几点都没做到。毕竟,谁会在起步阶段就花几天时间明确定义问题?能这么干的团队太少见了,大多数人都习惯于先干再说。现在,我们意识到正确定义问题能让自己少走弯路、反而节约了时间。正所谓磨刀不误砍柴工,先把要解决的问题搞清楚真的非常重要。

很遗憾,那时候我们自己没能做到。我们的探索不仅白白浪费了时间和金钱,而且没能得到任何有意义的产出。我们构建了不少后来压根用不上的东西,现在想想倒不如拿这段时间给大家放个假,至少还能提振一下士气。总之,先明确问题、再跟预期中的解决方案进行比对,这很重要。

如果一意孤行,结果就会像我这样——浪费大量时间开发了一堆垃圾,再把其中的血泪教训总结成文章发在这里供大家一乐。好在我们没把自己折腾死,所以各位才有机会读到这篇文章。要警惕啊,同志们!

原文链接:https://medium.com/codex/the-biggest-mistakes-we-made-building-microservices-10b555d80dae

构建微服务时的三大常见错误相关推荐

  1. 开课吧Java:构建微服务时的三大常见错误

    构建分布式系统相当复杂,每个人对构建微服务也都有不同的见解.我们在建立微服务架构时,经常会遇到一些问题,这也是我们常见的错误. 1.定制化构建太多 微服务架构中各服务间的通信往往正是麻烦的来源.我们选 ...

  2. 使用Spring Boot构建微服务(文末福利)

    本文主要内容 学习微服务的关键特征 了解微服务是如何适应云架构的 将业务领域分解成一组微服务 使用Spring Boot实现简单的微服务 掌握基于微服务架构构建应用程序的视角 学习什么时候不应该使用微 ...

  3. 从事件和DDD入手来构建微服务

    领域驱动设计(Domain-Driven Design,DDD)是一项很伟大的技术,它拉近了设计与程序实际所服务的领域,但是通常我们会关注结构,从而太早地做出决策,这并非DDD的本意.相反,在领域中, ...

  4. Spring微服务实战第2章 使用Spring Boot构建微服务

    第2章 使用Spring Boot构建微服务 基于微服务的架构具有以下特点. 有约束的--微服务具有范围有限的单一职责集.微服务遵循UNIX的理念,即应用程序是服务的集合,每个服务只做一件事,并只做好 ...

  5. GitHub 前 CTO:全面微服务是最大的架构错误!网友:这不是刚改完吗...

    来源:InfoQ. 整理:褚杏娟 近日,GitHub 前 CTO Jason Warner 在推特上表示,"我确信过去十年中,最大的架构错误之一就是全面使用微服务."从单体应用到微 ...

  6. Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)

    断路器 断路器模式源于Martin Fowler的Circuit Breaker一文."断路器"本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时," ...

  7. Spring Cloud构建微服务架构(五)服务网关

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: alt 我们使用Spring Cloud Netflix中的Eureka实 ...

  8. 基于事件驱动架构构建微服务第1部分:应用程序特定的业务规则

    原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part1-applicatio ...

  9. 如何基于 DDD 构建微服务?

    本文将讨论微服务与 DDD 涉及到的概念.策划和设计方法,并且尝试将一个单体应用拆分成多个基于 DDD 的微服务. 微服务的定义 微服务中的"微"虽然表示服务的规模,但它并不是使应 ...

最新文章

  1. 项目管理中的沟通管理(转)
  2. Java中使用队列Queue
  3. iPhone12年简史:手机之王的荣耀与溃败
  4. 485通信自动收发数据实现
  5. http地址后面加上问号?防止IE缓存
  6. spring boot 事务_Redis 事务在 SpringBoot 中的应用
  7. 动态修改类注解(赋值)
  8. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法
  9. vasp和ms_武汉理工大学赵焱课题组开发脚本 MS建模一键获取VASP输入文件POSCAR
  10. 汇编jnl_汇编指令
  11. 一款可以通过经度纬度精确查询天气的工具
  12. java-php-python-ssm学生学籍信息管理系统计算机毕业设计
  13. HanLP中文分词、人名识别、地名识别
  14. button 点击的涟漪效果
  15. 了解更多全国各地浴室5×8装修图片
  16. [iOS]仿微博视频边下边播之滑动 TableView 自动播放
  17. 关于ITIL、ITIL认证、ITIL的价值
  18. Flutter图片添加水印功能,Flutter保存Widget为图片
  19. Java实战项目:新手入门小游戏——连连看超详细教程
  20. 第91届奥斯卡奖公布提名名单《罗马》《宠儿》10项提名领跑

热门文章

  1. python实现excel数据透视表_用python建立excel的数据透视表
  2. 小白兔写话_小学二年级写话-我的小白兔
  3. postman 获取session_【接口测试】Postman入门10 Postman中的Session
  4. vue项目刷新当前页面的三种方法
  5. 获取数组第N个元素的方法
  6. Lora和Zigbee无线通讯技术的对比
  7. 树上动态插点 ---- F. Imbalance Value of a Tree(树上动态插点 + 并查集)
  8. element的多级选中_element-ui(Vue.js) 我在做二级select联动时选中值是循环的value怎么解?...
  9. 牛客挑战赛36 D. 排名估算( “概率论全家桶”,好题,拉格朗日插值求自然数 k 次幂之和)
  10. 2020 ACM / ICPC 济南 A Matrix Equation (高斯消元、乘法原理)