我从 2013 年加入 ThoughtWorks 至今共 4 年时间分别以开发人员、DevOps 工程师、DevOps 咨询师、微服务架构师以及微服务咨询师的角色参与了共计 7 个产品和项目的微服务咨询和实施,其中有成功,有失败,有反思,更多的是学习和总结。
成都创新互联公司是专业的慈利网站建设公司,慈利接单;提供成都网站建设、做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行慈利网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
以下是我这些年来在微服务咨询上的经验总结,希望能给陷入微服务实施困境的人带来一些帮助。
为什么微服务实施那么难?
难点1:“一步到位”的认知错觉
这些年微服务大红大紫,但是真正能够拿出来做为可实践的案例少之又少。大部分的微服务案例只能看到微服务架构的“演进结果”,但是看不到微服务架构的“演进过程”。这就像每个人看到一个架构的高峰,却没有看到攀登高峰的路径。
这就给很多架构师一个假象:微服务的架构是通过能力极高的架构师一步到位设计出来的。
这和很多团队自上而下的架构设计感受和相似。于是架构师们蜂拥而至,各种分析方法论层出不穷,讨论和分享络绎不绝。然而真正落地实施的却很少,使得微服务在网络上慢慢变成了一种“玄学”:微服务的实施在“理论研究”的阶段。
这违反了软件架构的最基本规律:架构是解决当前的需求和痛点演进的,而无法对没有出现的问题和痛点进行设计。因此,一步到位的整体的微服务架构设计完全没有必要。况且一个集中化的设计,很难体现微服务的轻量级优势。
我相信技术的发展一定是向不断降低成本的方向上发展的。如果新技术没有降低成本反而提升了成本,要么这个新技术一定有问题,要么是姿势不对,走错了路。
因此,准备实施微服务一定要有一个长期的思想准备。不过跨过了最初的门槛之后,剩下的工作可以被复制而且速度会越来越快。
难点2:“架构师精英主义”
很多产品对架构师的依赖很大,即“架构师精英主义”:认为产品架构只有这个组织的“技术精英”——架构师才可以完成,而团队其他成员只需要实现架构师的设计就可以。
这是大型企业和大型系统的常见问题,这来源于长期的重量级企业级架构习惯。
而微服务类似于一种“敏捷边际革命”:即由一个不超过 2~8 个人的小团队就可以完成的功能。而且这种规模的团队即使从整个产品团队移除也对整体产品的研发进度没有影响。
因此,即使失败了也不会带来太多的损失。不过,当***个微服务改造成功,那么成功经验的复制带来的乘数效应却能带来很大的收益。
从架构改造投资的风险收益比来看,这是非常划算的。
因此,微服务团队完全没必要大张旗鼓,只需要两三个人就可以动工。但是,谁也没有微服务的实践经验啊,万一失败了怎么办?
这就带来了下一个难点。
难点3:缺乏一个信任并鼓励创新的环境
面对未知的领域,失败再所难免。而面对这个不确定性频发的世界,成功和失败往往不再重要:也许今天的失败,明天再看就是成功,反之亦然。
成功意味只是表明结果符合自己的假设预期,而失败仅仅意味着结果不符合自己的假设预期。但是无论成败,我们都能从行动的过程中有所学习和反思,而这样的经验才是研发活动中最有价值的。
然而,很多组织,尤其“精英主义”的产品团队,责任和压力往往从上至下分解。由于组织庞大,金字塔的结构往往会构建一种以“不信任”为基础的制度。这种制度往往营造了一种“宁可不作为,也不能犯错”的文化。
由于上层则需要对失败负责,使得任何创新只是一个停留在组织上层的想法,难以落实推进。在这种情况下,组织的长期合作形成了稳定的工作习惯和思维定势,并形成了利益平衡,这会使得整个组织在面对创新的时候“卡壳”。
当微服务以一种政治任务从上而下派发的时候,为了避免失败,团队内部会相互推诿,通过不断的分析讨论和设计来论证这个事情的难度。
在我看来,只要想搞,就一定能找到办法,而不是先设想出一堆还没有遇到的问题和责任。在行进中解决问题是比设计和讨论更加有效率的方法。
而组织解决“卡壳”的办法就是引入“背锅侠”:例如新聘请的架构师或外部咨询师,来完成这个事情。出了问题就不用自己来承担责任了。
这样虽然是解决问题的一种折中办法,可以让事情毫无风险的执行下去。但这是一种短期效应,无法解决组织本身的创新窘境,长期依赖外部力量来解决最有价值的问题不会让自己提升,反而形成了对外部力量的依赖。对于组织的凝聚力来说不是一件好事。
只有打破当前的工作习惯和思维定势,充分认识到创新的困难、风险以及价值的组织才可以占领创新的高点,吸引人才。
难点4:微服务技术栈的“选择困难症“
由于“精英主义”的架构师需要担负很大的责任并承担着很重的压力。他们必须要为微服务架构谨慎的选择技术栈。
因此会在不同的技术栈之间不断尝试。对于习惯了在大型研发组织里“精心设计,加班生产”的架构师而言,“长设计,慢反馈”节奏似乎是理所应当的。
微服务开源社区的快速发展滋长了“架构师焦虑”:如果采用落后的技术会被同行鄙视,被不懂技术的老板鄙视,甚至被下属鄙视。
因此架构师们疲于在各种新型的技术栈之间比较和学习。此外,不熟悉技术往往会增大风险,架构师就需要更多的时间研究。带着“一步到位”的架构幻想对微服务技术栈精挑细选。而不会采用现有低成本的方案快速迭代的解决问题。
微服务的核心在于采用“小规模,快反馈”的机制降低软件系统的复杂性并通过虚拟和自动化技术分散风险,从而可以快速面对市场变化带来的各种挑战,并能够快速销售创新,获得市场的反馈。而不仅仅是利用到了时下新兴的语言,编程框架或工具。
学习和实践是相辅相成的过程,在实践的时候学习,并把学习到的知识应用到实践中。而不是准备一场考试,先停下来学习,准备好了再全力以赴。
以上四点会让大型组织面对微服务实施的时候“卡壳”,而这往往会导致微服务实施失败容易忽略的最重要一点,我认为也是核心的一点。
难点5:对微服务的技术变革估计过高
对微服务的技术变革估计过高,而对微服务带来的组织变革估计严重不足。作为架构师,永远不要低估康威定理的威力: “设计系统的组织,其产生的设计和架构等价于组织间的沟通结构。”
从制度经济学角度上讲,软件产品本身就是企业内部组织(员工)和外部组织(用户)沟通制度的计算机程序表达。这个制度的发展一定是在不断缩小内部组织之间以及内外部组织沟通成本的。
因此,系统的架构一定是和组织的架构相吻合的,如果不吻合,势必会带来问题阻碍组织的渐进。
这就引出了一个推论:如果企业组织的架构不是唯一的,那么微服务的架构方案也不是唯一的。
当架构和组织结构相一致的时候,一切都会很顺畅。反之,就会出现各种问题。
这个关系就像鞋和脚的关系,只有穿上合适的鞋,走起路来才会舒服。过大过小的鞋都不会让你加快前进的步伐。
当然,你可以选择买鞋(引入产品),虽然并不是很合脚,但还可以凑合穿。但是在换鞋的时候你不得不停下来试。你也可以花高价为自己定制一套,只不过,这个不会让你走得更快,只会越来越合脚。
如果所有人穿上了新鞋,都能跑得很快。那么这就不是鞋的问题,而是你脚的问题,这就不是换鞋能解决的了。你得先把脚的问题解决了,然后再看鞋的问题。当然,也可以通过鞋来矫正脚,只不过会花些功夫,但一定会比不停的换鞋更加有效。
很不幸,大多数的组织并没有准备好迎接微服务架构带来的组织变化。仍然把“系统架构问题”和“组织问题”割裂成两个不同领域的问题:微服务是技术问题,组织问题是管理问题。
有竞争力的组织,是一个通过融合优势达到 1+1> 2 的组织。而不是把优势割裂开,得到 1 + 1 <= 2 的组织。因此,技术问题和管理问题并不是两个问题,而是同一个问题的两个侧面。
因此,如果你的组织结构是去中心化的小团队结构,那么不用担心,你的应用架构会朝组织架构的方向演进。反之,如果你不是一个去中心化的小团队结构,那么微服务的架构会和组织架构格格不入。
如何高效推动微服务架构演进?
如果以上 5 点都让你膝盖中箭。那么根据我个人的经验,以下是综合解决微服务实施难点的七大步骤:
以终为始,先构建一个独立的敏捷微服务团队
我们对微服务的期待就是:可以独立开发,独立部署,独立发布,并且去中心化管理。那么,我们就先构造一只“可以独立开发,独立部署,并且去中心化管理”的团队。
这个团队为了达到这个目标,会采取各种方法(例如:DevOps,全功能团队)解决阻碍独立开发,独立部署,独立发布和去中心化的问题。而根据康威定理,系统的架构会慢慢向去中心化方向发展。
一定要意识到,这个过程会打破大型系统自上而下的既有流程并采用更有生产力的方式构建新的组织结构。你所要做的就是要充分信任团队,把它看做是一个微型的技术管理创新。不要用老的方式控制团队的运作,这会打击团队的士气。
管理建议:
技术建议:
构建微服务的“电梯演讲”
成立了微服务团队之后,接下来就是要选择***个实现的微服务。但是这个微服务应该多大,边界在哪是个问题。
这不需要进行严格的设计和反复的论证,只要发现当前的痛点或者想要完成一个假设就足够上路了。让整个过程变轻,而不是变重。我的建议是通过“微服务电梯演讲”的方式来定义微服务。
格式可以是:
例如:
当构造了微服务的电梯演讲,团队就可以以此为原则启动了。当碰到和现有系统冲突的问题,替换几个词比较有助于你做决策。(语言一定程度上也是具有魔力的)
把“拆分”换成“移除”。例如:“从现有系统中拆分出订单查询功能” 转变为 ”从现有系统中移除订单查询功能“。思维方式就从一个团队负责两个系统变成了两个团队负责两个系统。
把“集成”换成“调用”。例如:”用户注册和用户登录需要集成”转变为“用户登录服务需要调用用户注册服务的信息”。思维方式就把两个系统的关系更精确了,从而明确了微服务之间的关系和沟通方式。
管理建议:
技术建议:
以最小的代价发布出***个微服务
要注意两个关键点:一个是“最小的代价”,另一个是“发布”(Release)。
正如前文所述,微服务架构本身就体现了微服务一定是低成本低风险的渐进式演进。
***的浪费在于:
“最小的代价”包含了以下三个方面:
此外,很多微服务的“爱好者”由于害怕失败,将微服务技术始终放在“实验室”里。建议你要勇于面对失败,在生产环境中面对真实的问题,但要采取一些规避风险的措施。
管理建议:
技术建议:
取得快速胜利(Quick wins),演示(Showcase)驱动开发
刚开始进行微服务改造的时候一定会是一个试错的过程。如果目标定得太大,会让团队倍感压力,从而士气低落。
而制定每日的短期目标,赢得快速胜利则会不断激励团队的士气。通过设定当天结束的产出来确定今天需要做什么是一个非常有效的办法。
每日演示(Daily Showcase)就是一种推进产出的做法。每天向团队分享今天的工作内容,使小组能够共同学习。
并且以当天或者明天的 Showcase 作为目标,每个人Showcase 的内容一般不超过 20 分钟,一天的 Showcase 时间不超过一小时。可以早上 Showcase,也可以下班后 Showcase。
常见的快速胜利目标如下:
而以下的目标不适合作为快速胜利的目标:
管理建议:
技术建议:
代码未动,DevOps 先行
微服务解耦的本质是把代码内部的复杂性通过一些工具转化外部复杂性。把代码内部的复杂性分散到各个微服务中以降低整体复杂性和架构风险。
在这个过程中会大量采用 DevOps 技术和工具。也可以说,微服务是 DevOps 文化和技术走到***的必然结果。
以 J2EE 的应用为例:以前 Web Server + App Server + MiddleWare + Database 的传统架构被代码更少,更多的基础设施工具所取代。因为基础设施相对于代码来说更加稳定,更加利于扩展。
我把微服务的技术架构问题比作“搭台唱戏”:首先需要建立好微服务交付和运行的平台,然后让微服务上台“唱戏”。
这个平台一开始不需要很完善,只需要满足生产上线的必要要求即可。而在很多企业里,这个部分是由 Ops 团队在交付流程的末尾把关的。因此,把***一道关卡的确认工作放到最前面考虑可以减少后期的返工以及不必要的浪费。
以前,软件的开发和测试过程是分开的。然而,随着 DevOps 运动的兴起和各种自动化运维工具的兴起,这之间的必要性不如从前,只要有足够的自动化测试做质量保证,就可以很快的将微服务快速部署和发布到生产环境上。
最开始的时候,哪怕是发布一个 HelloWorld 程序,都表明微服务的持续交付和运行的平台已经搭建好,微服务交付流程已经打通,这一点是重中之重。
从技术交付产物来说,DevOps 主要交付两点:
为了保证微服务交付的高效,需要把这二者通过自动化的方式有机的结合起来,而不是各为其主。让开发和运维的矛盾变成“自动化的开发运维矛盾”。此外,DevOps 指的不光是一系列技术,更是一种工作方式。
从团队工作方式来说,DevOps 要做到:
管理建议:
技术建议:
除了提交代码和发布,微服务平台一切都应当自动化
在完成了微服务的基础设施和交付流程之后,就可以开始实现微服务的业务了。这时候需要依据电梯演讲划分出来的微服务进行业务逻辑的开发。
在以 DevOps 的方式工作一段时间之后,团队应该养成了一些自动化的习惯,如果没有,就应该检查一下自己的自动化程度。***的自动化理想状态就是除了代码提交和发布,在这之间的每一个流程和环节都应当由自动化的手段来完成。
当然,也有不能自动化的部分。根据我的经验,不能自动化的原因主要来自于流程管理的制度要求,而非技术困难。这往往是组织没有依据微服务进行流程变革导致的。这时候需要检讨不能自动化的部分是不是有存在的必要。
另一方面,虽然自动化可以大量缩短微服务交付时间,提升微服务交付效率。但是自动化的同时需要考虑到安全因素和风险,不能顾此失彼。对于生产来说,可用性和安全性是最重要的部分。
关键的自动化:
管理建议:
技术建议:
总结并复制成功经验,建立起微服务交付的节奏
当完成了***个微服务,不要着急开始进行下一个微服务的开发。而是需要进行一次关于可复制经验的总结,识别微服务开发中的经验教训并总结成可复制的经验和产出。
以下是一些需要总结出来的关键产出:
有了以上的关键产出,就可以对微服务开发团队进行扩张。这时候有了微服务开发的老司机,带着刚加入的同事一起开发,风险会相对低很多。
管理建议:
技术建议:
参考书目:
文章标题:微服务实施失败总结:7大步骤高效推进微服务架构演进
链接分享:http://www.gawzjz.com/qtweb/news43/189843.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联