Think Coding首页投稿(暂停使用,暂停投稿)@IT·互联网

提升微服务实施效率的7个步骤

2017-10-21  本文已影响527人  ThoughtWorks

《微服务进展缓慢的5个难点》中描述了实施微服务常见的主要阻碍。本文针对前文提到的5个难点提出了7个步骤。每个步骤分别包含了管理和技术两方面的建议。

如果以上5点都让你膝盖中箭。那么根据我个人的经验,综合解决微服务实施难点的第一步就是:

步骤1:以终为始,先构建一个独立的敏捷微服务团队

我们对微服务的期待就是:可以独立开发、独立部署、独立发布,并且进行去中心化的管理。那么,我们就先构造一支这样的团队。

这个团队为了达到上述目标,会采取各种方法(例如:DevOps、全功能团队)解决阻碍”独立开发、独立部署、独立发布和去中心化的问题。而根据康威定理,系统的架构会慢慢向“去中心化”方向发展。

一定要意识到,这个过程会打破大型系统自上而下的既有流程并采用更有生产力的方式构建新的组织结构。你唯一需要做的就是要充分信任团队,把它看做是一个微型的技术管理创新。不要用老的方式控制团队的运作,这会打击团队的士气。

管理建议:

技术建议:

步骤2:构建微服务的“电梯演讲”

成立了微服务团队之后,接下来就是要选择第一个实现的微服务。但是“这个微服务应该多大,边界在哪”是个问题。这不需要进行严格的设计和反复的论证,只要发现当前的痛点或者想要完成一个假设就足够上路了。让整个过程变轻,而不是变重。

我的建议是通过“微服务电梯演讲”的方式来定义微服务。格式可以是:

例如:

当构造了微服务的电梯演讲,团队就可以以此为原则来启动了。当碰到和现有系统冲突的问题,替换几个词比较能帮助你做决策。(语言在一定程度上也是具有魔力的)

把“拆分”换成“移除”。例如:“从现有系统中拆分出订单查询功能”转变为"从现有系统中移除订单查询功能"。思维方式就从一个团队负责两个系统变成了两个团队负责两个系统。

把“集成”换成“调用”。例如:“用户注册和用户登录需要集成”转变为“用户登录服务需要调用用户注册服务的信息”。思维方式的转换就把两个系统的关系更精确了,从而明确了微服务之间的关系和沟通方式。

管理建议:

技术建议:

步骤3:以最小的代价发布出第一个微服务

要注意两个关键点:一个是“最小的代价”,另一个是“发布”(Release)。

正如前文所述,微服务架构本身就决定了微服务一定是低成本低风险的渐进式演进。而最大的浪费在于:

  1. 级别/职责分工明确的组织沟通结构。
  2. “长时间,慢反馈”的行动习惯。
  3. 先进且学习成本较高的技术栈。

因此,“最小的代价”包含了以下三个方面:

  1. 最精简的独立敏捷全功能团队。
  2. 最快的时间。
  3. 代价最小的技术栈。

此外,很多微服务的“爱好者”由于害怕失败,因此将微服务技术始终放在“实验室”里。要勇于面对失败,在生产环境中面对真实的问题,但要采取一些规避风险的措施。

管理建议:

技术建议:

步骤4:取得快速胜利(Quick wins),演示(Showcase)驱动开发

刚开始进行微服务改造的时候一定会是一个试错的过程。如果目标定得太大,会让团队倍感压力,从而士气低落。而制定每日的短期目标,赢得快速胜利则会不断激励团队的士气。通过“设定当天结束的产出来确定今天需要做什么”是一个非常有效的办法。

每日演示(Daily Showcase)就是一种推进产出的做法。每天向团队分享今天的工作内容,使小组能够共同学习。并且以当天或者明天的showcase作为目标。每个人showcase的内容一般不超过20分钟,一天的showcase时间不超过一小时。可以早上showcase,也可以下班后showcase。

常见的快速胜利目标如下:

而以下的目标不适合作为快速胜利的目标:

管理建议:

技术建议:

步骤5:代码未动,DevOps先行

微服务解耦的本质是把代码内部的复杂性通过一些工具转化外部复杂性。把代码内部的复杂性分散到各个微服务中以降低整体复杂性和架构风险。在这个过程中会大量采用DevOps技术和工具。也可以说,微服务是DevOps文化和技术在走到极致的必然结果。

以J2EE的应用为例,以前Web Server + App Server + MiddleWare + Database的传统架构被更多的基础设施工具所取代,所需要的编程工作量更小。因为基础设施相对于应用代码来说更加稳定,更加利于扩展。

我把微服务的技术架构问题比作“搭台唱戏”:首先需要建立好微服务交付和运行的平台,然后让微服务上台“唱戏”。

这个平台一开始不需要很完善,只需要满足生产上线的必要要求即可。而在很多企业里,这个部分是由Ops团队在交付流程的末尾把关的。因此,把最后一道关卡的确认工作放到最前面考虑可以减少后期的返工以及不必要的浪费。

以前,软件的开发和测试过程是分开的。然而,随着DevOps运动和各种自动化运维工具的兴起,这之间的必要性有所降低,只要有足够的自动化测试做质量保证,就可以很快的将微服务快速部署和发布到生产环境上。

最开始的时候,哪怕是发布一个Hello World程序,都表明微服务的持续交付和运行的平台已经搭建好,微服务交付流程已经打通,这一点是重中之重。

从技术交付产物来说,DevOps主要交付两点:

为了保证微服务交付的高效,需要把这二者通过自动化的方式有机的结合起来,而不是各为其主。让开发和运维的矛盾变成“自动化的开发运维矛盾”

此外,DevOps指的不光是一系列技术,更是一种工作方式。从团队工作方式来说,DevOps要做到:

管理建议:

技术建议:

步骤6:除了提交代码和发布,微服务平台一切都应当自动化

在完成了微服务的基础设施和交付流程之后,就可以开始实现微服务的业务了。这时候需要依据电梯演讲划分出来的微服务进行业务逻辑的开发。在以DevOps的方式工作一段时间之后,团队应该养成了一些自动化的习惯,如果没有,就应该检查一下自己的自动化程度。最佳的自动化理想的状态就是除了代码提交和发布,在这之间的每一个流程和环节都应当由自动化的手段来完成。

当然,也有不能自动化的部分。根据我的经验,不能自动化的原因主要来自于流程管理的制度要求,而非技术困难。这往往是组织没有依据微服务进行流程变革导致的。这时候需要检讨不能自动化的部分是不是有存在的必要。

另一方面,虽然自动化可以大量缩短微服务交付时间,提升微服务交付效率。但是自动化的同时需要考虑到安全因素和风险,不能顾此失彼。对于生产来说,可用性和安全性是最重要的部分。 关键的自动化:

管理建议:

技术建议:

步骤7:总结并复制成功经验,建立起微服务交付的节奏

当完成了第一个微服务,不要着急开始进行下一个微服务的开发。而是需要进行一次关于可复制经验的总结,识别微服务开发中的经验教训并总结成可复制的经验和产出。

以下是一些需要总结出来的关键产出:

有了以上的关键产出,就可以对微服务开发团队进行扩张。这时候有了微服务开发的老司机,带着刚加入的同事一起开发,风险会相对低很多。

管理建议:

技术建议:

参考书目

本文首发于GitChat,经作者(顾宇)同意授权转发。转载请联系作者或GitChat。

上一篇下一篇

猜你喜欢

热点阅读