快速开始¶
了解如何使用 CAP 构建微服务事件总线架构,它比直接集成消息队列提供了哪些优势,它提供了哪些开箱即用的功能。
安装¶
PM> Install-Package DotNetCore.CAP
在 Asp.Net Core 中集成¶
以便于快速启动,我们使用基于内存的事件存储和消息队列。
PM> Install-Package DotNetCore.CAP.InMemoryStorage
PM> Install-Package Savorboard.CAP.InMemoryMessageQueue
在 Startup.cs
中,添加以下配置:
public void ConfigureServices(IServiceCollection services)
{
services.AddCap(x =>
{
x.UseInMemoryStorage();
x.UseInMemoryMessageQueue();
});
}
发送消息¶
public class PublishController : Controller
{
[Route("~/send")]
public IActionResult SendMessage([FromServices]ICapPublisher capBus)
{
capBus.Publish("test.show.time", DateTime.Now);
return Ok();
}
}
发送延迟消息¶
public class PublishController : Controller
{
[Route("~/send/delay")]
public IActionResult SendDelayMessage([FromServices]ICapPublisher capBus)
{
capBus.PublishDelay(TimeSpan.FromSeconds(100),"test.show.time", DateTime.Now);
return Ok();
}
}
发送包含头信息的消息¶
var header = new Dictionary<string, string>()
{
["my.header.first"] = "first",
["my.header.second"] = "second"
};
capBus.Publish("test.show.time", DateTime.Now, header);
处理消息¶
public class ConsumerController : Controller
{
[NonAction]
[CapSubscribe("test.show.time")]
public void ReceiveMessage(DateTime time)
{
Console.WriteLine("message time is:" + time);
}
}
处理包含头信息的消息¶
[CapSubscribe("test.show.time")]
public void ReceiveMessage(DateTime time, [FromCap]CapHeader header)
{
Console.WriteLine("message time is:" + time);
Console.WriteLine("message firset header :" + header["my.header.first"]);
Console.WriteLine("message second header :" + header["my.header.second"]);
}
摘要¶
相对于直接集成消息队列,异步消息传递最强大的优势之一是可靠性,系统的一个部分中的故障不会传播,也不会导致整个系统崩溃。 在 CAP 内部会将消息进行存储,以保证消息的可靠性,并配合重试等策略以达到各个服务之间的数据最终一致性。