2

这是一个具有现实意义的抽象问题。

我有两个微服务;让我们称它们为CreditCardsServiceSubscriptionsService

我还有一个应该使用的 SPA,SubscriptionsService以便客户可以订阅。为此,SubscriptionsService有一个端点,您可以在其中POST使用订阅模型来创建订阅,并且在该模型中是creditCardId指向应支付订阅费用的信用卡。有某些业务规则规定您是否可以使用所述信用卡进行订阅(到期时间超过 12 个月,它是 VISA 等)。这些特定的业务规则与SubscriptionsService

问题是从事 SPA 的团队想要一个/CreditCards端点,该端点SubscriptonsService返回可以在订阅模型中使用的用户的所有有效信用卡。他们不想在 SPA 中实现与SubscriptionsService自身相同的业务验证规则。

对我来说,这似乎违背了微服务设计的核心原则。特别是关注点分离。我也问自己,这要开什么先例?我们是否必须向/CreditCardsOrdersService 或任何其他可能creditCardId用作其模型属性的服务添加端点?

所以主要的问题是:设计这个的最好方法是什么?业务验证逻辑是否应该在前端和后端之间重复?是否应该将此新端点添加到SubscriptionsService? 我们是否应该尝试简化业务逻辑?

4

4 回答 4

3

这是一个完全公平的请求,您应该提供该端点。如果您定义了 CC 对您的服务有效的规则,那么您也应该提供处理它的所有帮助。

逻辑不应该重复。这往往会使系统无法维护。

这与 SOLID 关系不大,尽管 SRP 也会说,如果您对某事负责,那么任何相关逻辑也属于您。这个问题不能与您的服务分开,因为它是在那里定义的。

作为一种解决方案,我可能会考虑是否可以链接到 CC 服务,因为您已经有了一个。我是否可以将带有构造查询的客户端重定向到 CC 服务以获取所有相关的 CC,而实际上在订阅服务中不知道它们。

于 2019-02-06T16:15:01.460 回答
2

设计这个的最佳方法是什么?业务验证逻辑是否应该在前端和后端之间重复?是否应该将此新端点添加到 SubscriptionsService?我们是否应该尝试简化业务逻辑?

从我的角度来看,我会将“Subscription BC”(S-BC)与“CreditCards BC”(CC-BC)整合在一起。CC-BC 是上游,S-BC 是下游。您可以使用 CC-BC 中的 REST API 或使用消息队列来完成。

但我验证的是使用 CC 完成的操作,而不是 CC 本身,即验证“此 CC 是否对订阅有效”。该验证在 S-BC 中进行。

如果 SPA 想要检索“他/她可以用于订阅的用户的 CC”,它是 S-BC 的功能。

客户端 (SPA) 应调用 S-BC API 以使用该功能,并且 S-BC 执行从 CC-BC 获取 CC 并进行验证的功能。

于 2019-02-06T16:32:46.423 回答
1

在微服务和 DDD 中,订阅服务应该有一个信用卡端点,如果这是与订阅的有界上下文相关的数据。

信用卡端点提供的数据模型可能与您在信用卡服务本身中发现的数据模型略有不同,因为在订阅的上下文中,信用卡的外观或行为可能不同。订阅服务可能有一个信用卡表或后备存储,以支持存储它自己的信用卡模式并参考一些事实来源以保持该数据处于良好状态(例如关于公共汽车上的卡事件的消息,或其他一些机制)。

这实现了 3 件事,首先,订阅服务不会在卡片出现一段时间后被完全淘汰,它可以参考自己的表并无论如何都可以工作。其次,您的域代码将更加集中,因为它只需要处理对解决当前问题真正重要的信用卡属性。最后,如果您的卡片商店甚至可以具有在商店中计算和具体化的额外领域特定属性。

强制性福勒链接:有界上下文模式

于 2019-02-07T14:39:39.727 回答
0

即使事实的来源是域模型并且最终您必须在域模型级别进行验证,仍然可以在域模型级别(服务器端)和 UI(客户端)处理验证。客户端验证为用户提供了极大的便利。它节省了他们等待往返可能返回验证错误的服务器的时间。在商业术语中,即使是每天几分之一秒乘以数百次,也会增加大量时间、费用和挫败感。直接和即时的验证使用户能够更有效地工作并产生更高质量的输入和输出。正如视图模型和域模型不同一样,视图模型验证和域模型验证可能相似,但用途不同。如果您担心 DRY(Don't Repeat Yourself 原则),请考虑在这种情况下代码重用也可能意味着耦合,在企业应用程序中,不将服务器端耦合到客户端比遵循干燥原则。(NET-Microservices-Architecture-for-Containerized-NET-Applications 书)

于 2019-02-07T08:03:56.083 回答