今年 microXchg 微服务大会上, Uwe Friedrichsen 做了开幕报告。报告中探讨了“弹性功能服务设计”的核心理念,要点包括:微服务开发人员应该了解容错设计模式与缓存,但不能用于改善完全不好(过度耦合)的系统设计;理解领域驱动设计(DDD,Domain-Driven Design)和模块化的重要性;组件重在可替换性而非可重用性。
Friedrichsen 是 Codecentric 公司的 CTO,他在演讲一开始就指出了软件开发的目的在于交付业务价值。为实现该目标,软件必须在生产环境中运行并(高度)可用。微服务这样的现代架构风格意味着凡事皆分布(很多情况下是在不少于一个LAN 上的分布),因此故障在系统中是常见的并且是不可预测的。
容错设计模式应该被开发人员所熟知,诸如电路熔断器(Circuit Breaker)、舱壁(Bulkhead)、超时与重试(Timeout and Retry)等。容错设计模式借助Michael Nygard 所著的《[Release It!( https://pragprog.com/book/mnee/release-it )》一书而广为人知。缓存虽然十分有用,但是在部署中应慎重使用,并非简单地应用就可以达到克服不好系统设计的效果,例如涉及多个独立服务的长激活路径。
Friedrichsen 展示了一系列用于微服务的“设计基础”(如下图所示),其中包括了一些侧重于高内聚、低耦合和分离关注的设计原则。这些原则在系统边界处尤为关键,虽然他们的理论早在上世纪 70 年代就由 David Parnas (PDF 链接)详细阐明了,但是他们依然常被错误地理解。
领域驱动设计(DDD,Domain-Driven Design)是一个十分有用的工具,但是不少开发人员过度聚焦于被 Friedrichsen 称做“实体 DDD”的领域静态上下文模型。通常系统的动态行为对业务行为、领域时间和数据流更具描述力。
不要从静态领域模型着手,魔法存在于系统的动态行为之中。
微服务开发人员不应纠结于可重用性,而是应该瞄准于可替换性。Friedrichsen 引用了 Fred Brooks 的说法,讨论多年来一直被开发人员所追求的软件重用承诺问题。Brook 建议对于需要创建可重用组件(超越那些适用单一用例目标的组件)的工作,通常需要付出三倍以上的工作投入。这意味只有当组件被无修改地被使用了四次以上,才会看到些许在可重用性上投入的反馈。
微服务系统中使用的交流模式也很大程度上影响了功能性服务设计,Friedrichsen 建议应将关注置于会限制未来更改和扩充能力的前期架构选取之上。
报告的结论和核心关键要点在于,当实现微服务这样的分布式系统时,系统的特性会使得多年来一直为我们所熟知的设计问题影响得以呈现出来并会倍增,因此开发人员和架构师需要重新领会功能服务设计。
Uwe Friedrichsen 演讲“弹性功能服务设计”的视频可以在microXchg 大会的YouTube 频道上看到。
查看英文原文: Relearning Functional Service Design for Microservices: Uwe Friedrichsen at microXchg
感谢冬雨对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论