首页 > 解决方案 > 具有 CQRS 处理依赖关系的 .NET 微服务

问题描述

您好,我希望您向已经在比 TODO 示例更大的规模上使用微服务的人寻求建议。

让我解释一下关于建筑的基本想法。我想用 CQRS 在微服务架构中创建系统。我想微服务 A 将处理一堆命令和事件,但其他微服务也可以监听该事件。因此,总的来说,我必须以某种方式将这两个微服务之间的事件合同分开。要获得更好的概述,请参见简单的图表:

图表

我将把所有总线的东西、处理程序和逻辑都留在这里,我希望这很明显。我只想专注于合同

我在开始时的想法是将带有该域的所有事件的微服务 A 代码放在一个解决方案中,但事件将被放置在单独的库中,该库将作为 nuget 公开。然后这个 nuget 将被微服务 B 使用,微服务 B 将根据合同实现自己的处理程序。

微服务A解决方案:

MicroserviceCode 具有对拥有 DomainContract 和其他 DomainContract nuget 的项目依赖项

但是后来我意识到,当微服务不断增长并且会出现更多依赖项时,它可能会启动 nuget hell 并由于错误的 nuget 包等而导致依赖关系问题。

我还考虑将合约共享为 Json 格式的 Rest API 并消除 nuget 版本控制。

我想讨论一下如何避免微服务之间的地狱依赖的任何技巧。

或者,也许你使用了我描述的方法,它并没有我想象的那么糟糕?:)

标签: c#.netnugetmicroservices

解决方案


我建议您通过项目参考共享数据合同和事件合同,并将您的所有项目整合到一个解决方案中,这样编译器会立即告诉您在更改合同时需要修复的地方。当然,这样做的缺点是您每次都需要部署所有服务,因为如果您在签入时很难知道哪个服务使用特定的合同。

我喜欢拥有 nuget 包和存储库/服务的想法,但是如果您决定更改合同,则必须提前知道哪些服务使用该合同,检查代码并更新 nuget 包并签入代码,您需要对使用更改后的合同的所有微服务重复此操作。

我已经在生产中看到了这两种解决方案,但我认为第一个解决方案更具防弹性,因为您无需考虑在任何环境中运行的任何服务是否具有旧的数据合同。

注意 您应该在合同中的服务之间共享 的唯一内容。


推荐阅读