我打算在一个项目中使用微服务架构。选择的技术堆栈是 .NET Core
,带有 Docker
和 RabbitMQ
作为简单的服务总线,这应该能够部署在 Linux 上
。
假设我有一个Payment
服务和一个Order
服务,我希望这些服务中的每一个都公开REST
端点。因此,我想到将这两个服务作为 .NET Core Web APIs
。
但问题是使用RabbitMQ
的服务间通信。每当我收到新的订单
时,我想使用RabbitMQ
发布一个事件,然后在Payment
服务中监听该事件以执行某些操作(数据库更新)。但由于这些是 Web API
,我认为不可能像我描述的那样监听事件。 (我觉得我可能不得不使用类似控制台应用程序的东西来订阅事件。)
考虑到系统的可伸缩性和可扩展性,我想使用最佳实践找到最可行的方法来实现这一目标。
当您使用 .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
接口(interface)来实现相同的目标,他们在他们的 announcement 中提到了这种情况。 .这是 an example如何实现。