CAP快速开始


CAP快速开始

了解如何使用 CAP 构建微服务事件总线架构,它比直接集成消息队列提供了哪些优势,它提供了哪些开箱即用的功能。

环境

VS2022 + .net5.0 + CAP

新建项目

新建一个WebAPI项目命名为“Yak.Cap.InMemory.Api”,分别添加处理消息Consumer和发布消息Publish两个控制器。

添加CAP依赖

PM> Install-Package DotNetCore.CAP

添加基于内存的事件存储和消息队列依赖

以便于快速启动,我们使用基于内存的事件存储和消息队列。

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();
    });
}

发送消息

修改Publish控制器,发送时间:

public class PublishController : Controller
{
    [Route("~/send")]
    public IActionResult SendMessage([FromServices]ICapPublisher capBus)
    {
        capBus.Publish("test.show.time", DateTime.Now);

        return Ok();
    }
}

处理消息

修改Consumer控制器,接受时间:

public class ConsumerController : Controller
{
    [NonAction]
    [CapSubscribe("test.show.time")]
    public void ReceiveMessage(DateTime time)
    {
        Console.WriteLine("message time is:" + time);
    }
}

运行

运行项目后,在浏览器中输入:http://localhost:5000/send,调用接口发送消息。接受到信息如下:

带有头信息的消息

发送包含头信息的消息

在Publish控制器中添加发送方法。

[Route("~/CapHeaderSend")]
        public IActionResult CapHeaderSendMessage([FromServices] ICapPublisher capBus)
        {
            var header = new Dictionary()
            {
                ["my.header.first"] = "first",
                ["my.header.second"] = "second"
            };

            capBus.Publish("test.CapHeadershow.time", DateTime.Now, header);

            return Ok();
        }

处理包含头信息的消息

在Consumer控制器中添加接受消息代码:

[NonAction]
        [CapSubscribe("test.CapHeadershow.time")]
        public void ReceiveCapHeaderMessage(DateTime time)
        {
            Console.WriteLine("message time is:" + time);
        }

运行

运行项目后,在浏览器中输入:http://localhost:5000/CapHeaderSend,调用接口发送消息。接受到信息如下:

摘要

相对于直接集成消息队列,异步消息传递最强大的优势之一是可靠性,系统的一个部分中的故障不会传播,也不会导致整个系统崩溃。 在 CAP 内部会将消息进行存储,以保证消息的可靠性,并配合重试等策略以达到各个服务之间的数据最终一致性。
版权所有,转载请注明出处:

源码:

https://github.com/yandaniugithub/CAP

CAP