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

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

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

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

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

【问题讨论】:

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

标签: c# asp.net-web-api .net-core microservices rawrabbit


【解决方案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,如果这仍然与您相关,请检查更新。
猜你喜欢
  • 2016-12-20
  • 2020-12-21
  • 1970-01-01
  • 2021-01-12
  • 2017-05-08
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 2015-04-22
相关资源
最近更新 更多