c# - 具有 CQRS 处理依赖关系的 .NET 微服务
问题描述
您好,我希望您向已经在比 TODO 示例更大的规模上使用微服务的人寻求建议。
让我解释一下关于建筑的基本想法。我想用 CQRS 在微服务架构中创建系统。我想微服务 A 将处理一堆命令和事件,但其他微服务也可以监听该事件。因此,总的来说,我必须以某种方式将这两个微服务之间的事件合同分开。要获得更好的概述,请参见简单的图表:
我将把所有总线的东西、处理程序和逻辑都留在这里,我希望这很明显。我只想专注于合同
我在开始时的想法是将带有该域的所有事件的微服务 A 代码放在一个解决方案中,但事件将被放置在单独的库中,该库将作为 nuget 公开。然后这个 nuget 将被微服务 B 使用,微服务 B 将根据合同实现自己的处理程序。
微服务A解决方案:
- 微服务代码(具有业务逻辑等的命令和处理程序)
- DomainContract(可以在许多服务之间共享但连接到当前解决方案域的事件)
MicroserviceCode 具有对拥有 DomainContract 和其他 DomainContract nuget 的项目依赖项
但是后来我意识到,当微服务不断增长并且会出现更多依赖项时,它可能会启动 nuget hell 并由于错误的 nuget 包等而导致依赖关系问题。
我还考虑将合约共享为 Json 格式的 Rest API 并消除 nuget 版本控制。
我想讨论一下如何避免微服务之间的地狱依赖的任何技巧。
或者,也许你使用了我描述的方法,它并没有我想象的那么糟糕?:)
解决方案
我建议您通过项目参考共享数据合同和事件合同,并将您的所有项目整合到一个解决方案中,这样编译器会立即告诉您在更改合同时需要修复的地方。当然,这样做的缺点是您每次都需要部署所有服务,因为如果您在签入时很难知道哪个服务使用特定的合同。
我喜欢拥有 nuget 包和存储库/服务的想法,但是如果您决定更改合同,则必须提前知道哪些服务使用该合同,检查代码并更新 nuget 包并签入代码,您需要对使用更改后的合同的所有微服务重复此操作。
我已经在生产中看到了这两种解决方案,但我认为第一个解决方案更具防弹性,因为您无需考虑在任何环境中运行的任何服务是否具有旧的数据合同。
注意 您应该在合同中的服务之间共享 的唯一内容。
推荐阅读
- java - Spring:无法推断 ResponseEntity<> 的类型参数
- java - 尝试在 adobe aem 中使用 HTL 和 java 从资产元数据中获取 dc:title 和 dc:descrption
- python - 减少为大数字显示的小数,但不是为小数字
- sql - account.google.com 返回的 openid jwt“图片”声明中的个人资料图片 url 的最大长度是多少
- c# - 如何在 C# 中列出每页列的项目
- python - 使用 sklearn logreg 对新数据进行预测
- javascript - canvas.width 和 canvas.clientWidth 有什么区别
- python - RuntimeWarning:在 double_scalars 中遇到无效值。怎么解决
- javascript - ExperimentalWarning: ESM 模块加载器是实验性的。C:\wamp\www\testjsgraphql\src\index.js
- python - 如何在 keras 上为 3D CNN 网络编码数据?