【发布时间】:2021-09-08 02:11:35
【问题描述】:
我发现这个resource 解释了按子域分解,其中一个缺点是“可以创建太多微服务,这使得服务发现和集成变得困难。”
我对这在外行术语中的真正含义有点困惑,所以很高兴听到对相同缺点的不同解释。
提前谢谢你!
【问题讨论】:
标签: microservices domain-driven-design decomposition
我发现这个resource 解释了按子域分解,其中一个缺点是“可以创建太多微服务,这使得服务发现和集成变得困难。”
我对这在外行术语中的真正含义有点困惑,所以很高兴听到对相同缺点的不同解释。
提前谢谢你!
【问题讨论】:
标签: microservices domain-driven-design decomposition
第一个问题是假设每个子域都应该由单独的微服务处理。一些子域可以捆绑在一个模块化的单体中——尤其是那些需要快速响应或/和有大量通信的子域。
现在我们明白为什么了:
基本上通过将网络层添加到您的应用程序不允许您使用事务,而每个微服务可变请求应该仍然是原子的(事务性的)。 与单体相比,拥有太多微服务会产生更多复杂的问题。
顺便说一句。如果你不能在一个单体应用中拆分你的域,你会因为添加网络问题而在微服务中失败。
【讨论】:
这个缺点的核心概念依赖于术语subdomain,它有时可能很难真正理解,主要是因为它位于业务和工程之间的边界。它的一个类似术语是bounded context,this article 给出了很好的解释。
例如,在一个电子商务应用程序中,我们可以有以下子域,这些子域可以很容易地映射到各个微服务:
但是,在一个更复杂的应用程序中,大多数组件都是紧密耦合的(单体),在哪里绘制一些子域之间的边界并不总是那么清楚。您需要业务知识和良好的文档(或者理想情况下,可以访问应用程序的原始作者),才能正确地做到这一点。
因此,您最终可能会创建太多的子域,这可能会转化为太多的微服务(一个子域可以有多个微服务),这有其自身的缺点(我们这里谈论的是数十个微服务甚至更多)。
其中之一是将请求路由到适当的微服务,或者在您接到需要转换为多个下游调用的调用时正确编排调用,例如(在电子商务应用上):
authentication微服务以检查请求中收到的令牌search微服务以获取实际数据profile 微服务发起最终请求,以获取现有的购物车商品,并显示在页面的右上角。当然可以缓存一些东西以避免额外的调用,但这只是一个可能的顺序,所以你可以做出一个想法。
【讨论】: