微服务设计读书笔记 (第二章 演化式架构师)

架构师的演化视角

​ 与建造建筑物相比,在软件中我们会面临大量的需求变更,使用的工具和技术也具有多样性。我们创造的东西并不是在某个时间点之后就不再变化了,甚至在发布到生产环境之后,软件还能继续演化。对于我们创造的大多数产品来说,交付到客户手里之后,还是要响应客户的变更需求,而不是简单地交给客户一个一成不变的软件包。因此架构师必须改变那种从一开始就要设计出完美产品的想法,相反我们应该设计出一个合理的框架,在这个框架下可以慢慢演化出正确的系统,并且一旦我们学到了更多知识,应该可以很容易地应用到系统中。

​ 当用户对软件提出变更需求时,我们需要对其进行响应并做出相应的改变。未来的变化很难预见,所以与其对所有变化的可能性进行预测,不如做一个允许变化的计划。为此,应该避免对所有事情做出过于详尽的设计。

​ 有一件经常被人们忽略的事情是:系统的使用者不仅仅是终端用户,还有工作在其上的开发人员和运维人员,他们也对系统的需求变更负责。借鉴Frank Buschmann的一个说法:架构师的职责之一就是保证该系统适合开发人员在其上工作。

​ 所以我们的架构师应该像城市规划师那样专注在大方向上,只在很有限的情况下参与到非常具体的细节实现中来。他们需要保证系统不但能够满足当前的需求,还能够应对将来的变化。而且他们还应该保证在这个系统上工作的开发人员要和使用这个系统的用户一样开心。

分区

​ 作为架构师,不应该过多关注每个区域内发生的事情,而应该多关注区域之间的事情。这意味着我们应该考虑不同的服务之间如何交互,或者说保证我们能够对整个系统的健康状态进行监控。至于多大程度地介入区域内部事务,在不同的情况下则有所不同。很多组织采用微服务是为了使团队的自治性最大化。

一个原则性的方法

​ 规则对于智者来说是指导,对于愚蠢者来说是遵从。

​ 做系统设计方面的决定通常都是在做取舍,而在微服务架构中,你要做很多取舍!当选择一个数据存储技术时,你会选择不太熟悉但能够带来更好可伸缩性的技术吗?在系统中存在两种技术栈是否可接受?那三种呢?做某些决策所需要的信息很容易获取,这些还算是容易的。但是有些决策所需要的信息难以完全获取,那又该怎么办呢?

  • 战略目标

​ 做一名架构师已经很困难了,但幸运的是,通常我们不需要定义战略目标!战略目标关心的是公司的走向以及如何才能让自己的客户满意。这些战略目标的层次一般都很高,但通常不会涉及技术这个层面,一般只在公司或者部门层面制定。这些目标可以是“开拓东南亚的新市场”或者“让用户尽量使用自助服务”。因为这些都是你的组织前进的方向,所以需要确保技术层面的选择能够与之一致。如果你是制定公司技术愿景的人,那么你可能需要花费更多的时间和组织内非技术的部分(通常他们被叫作业务部门)进行交互。那么业务部门的愿景是什么?它又会如何发生改变呢?

  • 原则

​ 为了和更大的目标保持一致,我们会制定一些具体的规则,并称之为原则,它不是一成不变的。一般来讲,原则最好不要超过10个,或者能够写在一张海报上,不然大家会很难记住。而且原则越多,它们发生重叠和冲突的可能性就越大。

  • 实践

​ 我们通过相应的实践来保证原则能够得到实施,这些实践能够指导我们如何完成任务。通常这些实践是技术相关的,而且是比较底层的,所以任何一个开发人员都能够理解。这些实践包括代码规范、日志数据集中捕获或者HTTP/REST作为标准集成风格等。由于实践比较偏技术层面,所以其改变的频率会高于原则。

  • 将原则和实践相结合

​ 有些东西对一些人来说是原则,对另一些人来说则可能是实践。比如,你可能会把使用HTTP/REST作为原则,而不是实践。这也没什么问题,关键是要有一些重要的原则来指导系统的演化,同时也要有一些细节来指导如何实现这些原则。对于一个足够小的群组,比如单个团队来说,将原则和实践进行结合是没问题的。但是在一个大型组织中,技术和工作实践可能不一样,在不同的地方需要的实践可能也不同。不过这也没关系,只要它们都能够映射到相同的原则即可。比如一个.NET团队可能有一套实践,一个Java团队有另一套实践,但背后的原则是相同的。

要求的标准

​ 在优化单个服务自治性的同时,也要兼顾全局。一种能帮助我们实现平衡的方法就是,清楚地定义出一个好服务应有的属性。

  • 监控

​ 能够清晰地描绘出跨服务系统的健康状态非常关键。这必须在系统级别而非单个服务级别进行考虑。每个服务内的技术应该对外不透明,并且不要为了服务的具体实现而改变监控系统。日志功能和监控情况类似:也需要集中式管理。

  • 接口

​ 选用少数几种明确的接口技术有助于新消费者的集成。使用一种标准方式很好,两种也不太坏,但是20种不同的集成技术就太糟糕了。这里说的不仅仅是关于接口的技术和协议。

代码治理

使用简单的方式把事情做对。我见过的比较奏效的两种方式是,提供范例和服务代码模板。

  • 范例

​ 理想情况下,你提供的优秀范例应该来自真实项目,而不是专门实现的一个完美的例子。因为如果你的范例来自真正运行的代码,那么就可以保证其中所体现的那些原则都是合理的。

  • 裁剪服务代码模板

​ 如果能够让所有的开发人员很容易地遵守大部分的指导原则,那就太棒了。一种可能的方式是,当开发人员想要实现一个新服务时,所有实现核心属性的那些代码都应该是现成的。

​ 针对自己的开发实践裁剪出一个服务代码模板,不但可以提高开发速度,还可以保证服务的质量。

​ 创建服务代码模板不是某个中心化工具的职责,也不是指导(即使是通过代码)我们应怎样工作的架构团队的职责。应该通过合作的方式定义出这些实践,所以你的团队也需要负责更新这个模板(内部开源的方式能够很好地完成这项工作)。

​ 理想情况下,应该可以选择是否使用服务代码模板,但是如果你强制团队使用它,一定要确保它能够简化开发人员的工作,而不是使其复杂化。

​ 重用代码可能引入的危险。在重用代码的驱动下,我们可能会引入服务之间的耦合。有一个我接触过的组织非常担心这个问题,所以他们会手动把服务代码模板复制到各个服务中。这样做的问题是,如果核心服务代码模板升级了,那么需要花很长时间把这些升级应用到整个系统中。但相对于耦合的危险而言,这个问题倒没那么严重。还有一些我接触过的团队,把服务代码模板简单地做成了一个共享的库依赖,这时他们就要非常小心地防止对DRY(Don't RepeatYourself,避免重复代码)的追求导致系统过度耦合!

技术债务

​ 有时候可能无法完全遵守技术愿景,比如为了发布一些紧急的特性,你可能会忽略一些约束。其实这仅仅是另一个需要做的取舍而已。我们的技术愿景有其本身的道理,所以偏离了这个愿景短期可能会带来利益,但是长期来看是要付出代价的。

​ 不光走捷径会引入技术债务。有时候系统的目标会发生改变,并且与现有的实现不符,这种情况也会产生技术债务。

例外管理

​ 原则和实践可以指导我们如何构建系统。那么,如果系统偏离了这些指导又会发生什么呢?有时候我们会决定针对某个规则破一次例,然后把它记录下来。如果这样的例外出现了很多次,就可以通过修改原则和实践的方式把我们的理解固化下来。

集中治理和领导

​ 在IT的上下文中有很多事情需要治理,而架构师会承担技术治理这部分的职责。如果说,架构师的一个职责是确保有一个技术愿景,那么治理就是要确保我们构建的系统符合这个愿景,而且在需要的时候还应对愿景进行演化。

​ 架构师会对很多事情负责。他们需要确保有一组可以指导开发的原则,并且这些原则要与组织的战略相符。他们还需要确保,以这些原则为指导衍生出来的实践不会给开发人员带来痛苦。他们需要了解新技术,需要知道在什么时候做怎样的取舍。

​ 作为一名架构师,你必须要在团队驶向类似鸭子池塘这样的地方时抓紧他们。还有一点要注意的是,即使你很清楚什么是对的,然后尝试去控制团队,也可能会破坏和团队的关系,并且会使团队感觉他们没有话语权。有时候按照一个你不同意的决定走下去反而是正确的,知道什么时候可以这么做,什么时候不要这么做是很困难的,但有时也很关键。

建设团队

​ 微服务架构本身能够提供一种很好的形式。在单块系统中,人们为某些事情负责的机会非常有限,而在微服务架构中存在多个自治的代码库,每个代码库都有着自己独立的生命周期,这就给更多人提供了对单个服务负责的机会,而当这些人在单个服务上面得到足够锻炼之后,就可以给他们更多的责任,从而帮助他们逐步达成自己的职业目标,同时通过分担职责也可以防止某一个人的负担过重。

小结

总结一下本章,下面是我认为的一个演进式架构师应该承担的职责。

· 愿景

确保在系统级有一个经过充分沟通的技术愿景,这个愿景应该可以帮助你满足客户和组织的需求。

· 同理心

理解你所做的决定对客户和同事带来的影响。

· 合作

和尽量多的同事进行沟通,从而更好地对愿景进行定义、修订及执行。

· 适应性

确保在你的客户和组织需要的时候调整技术愿景。

· 自治性

在标准化和团队自治之间寻找一个正确的平衡点。

· 治理

确保系统按照技术愿景的要求实现。

​ 演进式架构师应该理解,成功要靠不断地取舍来实现。总会存在一些原因需要你改变工作的方式,但是具体做哪些改变就只能依赖于自己的经验了。而僵化地固守自己的想法无疑是最糟糕的做法。虽然本章的大部分建议对任何一个系统架构师来说都适用,但是在微服务系统中,架构师需要做更多的决定,因此,能更好地平衡这些取舍是非常关键的。

原文地址:https://www.cnblogs.com/KQNLL/p/13752800.html