介绍

CAP 是一个EventBus,同时也是一个在微服务或者SOA系统中解决分布式事务问题的一个框架。它有助于创建可扩展,可靠并且易于更改的微服务系统。
在微软的 eShopOnContainer 微服务示例项目中,推荐使用 CAP 作为生产环境可用的 EventBus。
CAP 是一个基于 .NET Standard 的 C# 库,它是一种处理分布式事务的解决方案,同样具有 EventBus 功能,它具有轻量级、易使用、高性能等特点。

  • CAP docs看到更多详细资料。
  • CAP 视频教程,学习如何在项目中集成CAP。
  • GitHub源码:https://github.com/dotnetcore/cap
  • 示例代码:https://github.com/dotnetcore/CAP/tree/master/samples

    什么是 EventBus?

    事件总线是一种机制,它允许不同的组件彼此通信而不彼此了解。 组件可以将事件发送到Eventbus,而无需知道是谁来接听或有多少其他人来接听。 组件也可以侦听Eventbus上的事件,而无需知道谁发送了事件。 这样,组件可以相互通信而无需相互依赖。 同样,很容易替换一个组件。 只要新组件了解正在发送和接收的事件,其他组件就永远不会知道.

    架构预览

    CAP之入门 - 图1
    CAP 实现了 eShop 电子书 中描述的发件箱模式

    CAP 的特色

    相对于其他的 Service Bus 或者 Event Bus, CAP 拥有自己的特色,它不要求使用者发送消息或者处理消息的时候实现或者继承任何接口,拥有非常高的灵活性。我们一直坚信约定大于配置,所以CAP使用起来非常简单,对于新手非常友好,并且拥有轻量级。
    CAP 采用模块化设计,具有高度的可扩展性。你有许多选项可以选择,包括消息队列,存储,序列化方式等,系统的许多元素内容可以替换为自定义实现。

    快速入门示例

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

    NuGet

    你可以运行以下下命令在你的项目中安装 CAP。
    1. Install-Package DotNetCore.CAP
    2. Install-Package DotNetCore.CAP.InMemoryStorage
    3. Install-Package Savorboard.CAP.InMemoryMessageQueue
    4. Install-Package DotNetCore.CAP.Dashboard
    5. Install-Package DotNetCore.CAP.Pulsar

    注入CAP

    ```csharp using Savorboard.CAP.InMemoryMessageQueue;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddCap(x => { x.UseInMemoryStorage(); x.UseInMemoryMessageQueue(); });

  1. <a name="JCxZD"></a>
  2. ### 公共部分
  3. ```csharp
  4. using Microsoft.AspNetCore.Mvc;
  5. namespace CAP.InMemory.Demo2.Controllers;
  6. /// <summary>
  7. /// 基础控制器
  8. /// </summary>
  9. [Route("api/[area]/[controller]/[action]")]
  10. [ApiController]
  11. public abstract class BaseController : ControllerBase
  12. {
  13. }
  1. using Microsoft.AspNetCore.Mvc;
  2. namespace CAP.InMemory.Demo2.Controllers.CAP;
  3. /// <summary>
  4. /// 域控制器
  5. /// </summary>
  6. [Area("CAP")]
  7. public abstract class AreaController : BaseController
  8. {
  9. }

发布消息

新建立一个PublishController

  1. using DotNetCore.CAP;
  2. using Microsoft.AspNetCore.Mvc;
  3. namespace CAP.InMemory.Demo2.Controllers.CAP;
  4. /// <summary>
  5. /// 发送消息
  6. /// </summary>
  7. public class PublishController : AreaController
  8. {
  9. ICapPublisher _capBus;
  10. public PublishController(ICapPublisher capBus)
  11. {
  12. _capBus = capBus;
  13. }
  14. [HttpGet]
  15. //[Route("/send")]
  16. public IActionResult SendMessage()
  17. {
  18. Console.WriteLine("SendMessage message time is:" + DateTime.Now);
  19. _capBus.Publish("test.show.time", DateTime.Now);
  20. return Ok();
  21. }
  22. [HttpGet]
  23. //[Route("/send.header")]
  24. public IActionResult SendMessageHeader()
  25. {
  26. var header = new Dictionary<string, string>()
  27. {
  28. ["my.header.first"] = "first",
  29. ["my.header.second"] = "second"
  30. };
  31. _capBus.Publish("test.show.time.header", DateTime.Now, header);
  32. return Ok();
  33. }
  34. }

处理消息

新建立一个ConsumerController

  1. using DotNetCore.CAP;
  2. using Microsoft.AspNetCore.Mvc;
  3. namespace CAP.InMemory.Demo2.Controllers.CAP;
  4. /// <summary>
  5. /// 处理消息
  6. /// </summary>
  7. [ApiController]
  8. public class ConsumerController : ControllerBase
  9. {
  10. /// <summary>
  11. /// 处理消息
  12. /// </summary>
  13. /// <param name="time"></param>
  14. [NonAction]
  15. [CapSubscribe("test.show.time")]
  16. public void ReceiveMessage(DateTime time)
  17. {
  18. Console.WriteLine("ReceiveMessage message time is:" + time);
  19. }
  20. /// <summary>
  21. /// 处理包含头信息的消息
  22. /// </summary>
  23. /// <param name="time"></param>
  24. [NonAction]
  25. [CapSubscribe("test.show.time.header")]
  26. public void ReceiveMessage(DateTime time, [FromCap] CapHeader header)
  27. {
  28. Console.WriteLine("ReceiveMessageHeader message time is:" + time);
  29. Console.WriteLine("message firset header :" + header["my.header.first"]);
  30. Console.WriteLine("message second header :" + header["my.header.second"]);
  31. }
  32. }

目录结构

1663580596213.png

测试

http://localhost:5280/api/CAP/Publish/SendMessage
1663580624649.png
1663580672970.png

http://localhost:5280/api/CAP/Publish/SendMessageHeader
1663580751107.png
1663580732467.png