【问题标题】:How to achieve variability in a microservice architecture?如何在微服务架构中实现可变性?
【发布时间】:2021-10-23 01:41:15
【问题描述】:

假设我有一个由几个微服务组成的应用程序。 该应用程序用于维护足球比赛(球员、球队、比赛……)。

现在,我希望我的应用程序不仅可以支持足球比赛,还可以处理篮球比赛。大约 90% 的功能是相同的,但有一些细微差别。

实现这种可变性的最佳方法是什么?

我可以

  1. 扩展现有的微服务以支持足球和篮球比赛。但是,如果我将来要添加其他运动,该服务将变得越来越复杂,以考虑运动特定的细节。

  2. 使服务实现高度可配置,并为足球和篮球比赛部署具有不同配置的多个服务实例。

  3. 复制我现有服务的所有代码,并针对篮球特定的内容进行一些小改动。但是,如果我添加其他运动项目,我最终会维护许多共享 90% 代码库的项目。

什么是在微服务架构中实现一些可变性并能够在未来轻松添加不同运动的最简洁的方法,而只需少量特定于运动的实现细节。

【问题讨论】:

    标签: microservices code-duplication


    【解决方案1】:

    根据您编写微服务所使用的语言和/或框架,您可以将 90% 的通用代码库(例如定义通用端点的代码库等)分解到库中,然后将每个服务成为不同的 10% 和(可能)少量的胶水代码将 10% 与 90% 联系起来。

    将常见的事情(例如游戏有预定的开始时间)分解到自己的服务中也可能是有意义的。

    【讨论】:

    • 共享库是否会违反“无共享”原则,因为它在微服务之间创建了相当紧密的耦合,因为它们不再是真正孤立的?
    • 并非如此,或者至少与复制功能相比,它没有更多的耦合。执行中的耦合为零(这是最重要的解耦),除非您确实糟糕地实现了库(例如,如果功能需要 DB 访问,则避免依赖注入)。在开发耦合方面,如果不同的服务发现他们需要库中的不兼容功能,至少其中一个可以分叉库等。
    • 你会说两个恰好在 Node 中实现的服务是紧密耦合的还是不再真正隔离?
    • 好吧,我不会说这两个节点服务不是孤立的。如果是共享库,我会说,库上的更改会影响所有微服务,这会产生一些耦合或至少会降低每个服务的独立性。我想在这些情况下,我可以像你建议的那样分叉库,这最终将再次成为代码重复。
    • 除非需要,否则使用库的服务也没有义务升级,除非在其他地方有一些耦合,否则纯粹是由这些服务的需求驱动的(同样,新的 Node 版本没有内在原因出来意味着你在 Node 中实现的每一个服务都需要升级)。
    猜你喜欢
    • 2018-03-23
    • 2017-12-26
    • 2018-07-17
    • 2020-05-04
    • 2014-01-08
    • 2019-07-15
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    相关资源
    最近更新 更多