.NET Core 微服务使用 RabbitMQ [关闭]

Posted

技术标签:

【中文标题】.NET Core 微服务使用 RabbitMQ [关闭]【英文标题】:.NET Core Microservice using RabbitMQ [closed] 【发布时间】:2017-09-15 07:41:52 【问题描述】:

我计划在一个项目中使用微服务架构。选择的技术栈是.NET Core,其中DockerRabbitMQ作为简单的服务总线,应该可以部署在Linux上。

假设我有一个Payment 服务和一个Order 服务,我希望这些服务中的每一个都公开REST 端点。因此,我想将这两个服务设为.NET Core Web APIs

但问题是使用RabbitMQ 的服务间通信。每当我得到一个新的order 时,我想使用RabbitMQ 发布一个事件,然后在Payment 服务中监听该事件以执行某些操作(数据库更新)。但由于这些是Web APIs,我认为不可能像我描述的那样收听事件。 (我觉得我可能不得不使用控制台应用程序之类的东西来订阅事件。)

考虑到系统的可扩展性和可扩展性,我想通过最佳实践找到最可行的方法来实现这一目标。

【问题讨论】:

ASP.NET Core 应用程序是控制台应用程序。您可以简单地创建一个对象,该对象将在应用程序启动时侦听消息以及 WebAPI 注册.. @AndriiLitvinov,感谢您的回复。你能解释一下你的建议吗? 【参考方案1】:

当您使用 .NET Core 创建应用程序时,您会在 Main 方法中引导事物,然后在 Startup 类中注册服务和中间件。因此,在您启动虚拟主机之前,您还可以创建并启动您的消息服务:

public class MessageListener

    public void Start()
    
        // Listen to rabbit QM and all the things.
    


public static void Main(string[] args)

    // Listen to messages.
    var messaging =  MessageListener();
    messaging.Start();

    // Configure web host and start it.
    var host = new WebHostBuilder()
        ...
        .Build();
    host.Run();

更新:

在 ASP.NET Core 2.0 中引入了IHostedService 接口来实现相同的目标,他们在announcement 中提到了这种情况。这是an example 的实现方法。

【讨论】:

那么你的意思是,即使在 .NET Core Web API 项目中,我也可以简单地注册我的侦听器来处理将由其他服务发布的事件? 是的,就是这样。如果子域的逻辑是在服务中实现的,那么命令的发送方式无关紧要:通过 Web api 或通过消息队列。 谢谢,您认为这样处理是个好主意吗?会有什么缺点吗? 这就是我在项目中的做法。微服务的思想是实现一个有界上下文(一个子域或它的一部分)。它内部应该有一个域模型,可以从 Web api 控制器或消息处理程序访问。 @PIKP,如果这仍然与您相关,请检查更新。

以上是关于.NET Core 微服务使用 RabbitMQ [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

.Net 核心微服务查询来自许多服务

如何在CentOS 7部署RabbitMQ服务

一个基于RabbitMQ的可复用的事务消息方案

一个基于 RabbitMQ 的可复用的分布式事务消息架构方案!

微服务实战:选择微服务部署策略

微服务实践:微服务的事件驱动数据管理