NetCore结合CAP事件总线实现分布式事务——入门(1)

本文介绍了CAP,一个用于微服务和SOA的EventBus和分布式事务解决方案。CAP提供高灵活性,无需实现特定接口即可发送和处理消息。文章详细讲解了如何搭建CAP环境,配置SQL Server和RabbitMQ,并展示了Publisher和Subscriber的实现,包括启动文件、数据库上下文和控制器。最后,文中提到了如何运行和监测项目。
摘要由CSDN通过智能技术生成

一、入门

  1. CAP 是一个EventBus,同时也是一个在微服务或者SOA系统中解决分布式事务问题的一个框架。它有助于创建可扩展,可靠并且易于更改的微服务系统。

  2. 在微软的 eShopOnContainer 微服务示例项目中,推荐使用 CAP 作为生产环境可用的 EventBus。

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

相对于其他的 Service Bus 或者 Event Bus, CAP 拥有自己的特色,它不要求使用者发送消息或者处理消息的时候实现或者继承任何接口,拥有非常高的灵活性。我们一直坚信约定大于配置,所以CAP使用起来非常简单,对于新手非常友好,并且拥有轻量级。

二、环境搭建

  1. 安装nuget
Install-Package DotNetCore.CAP
  1. 安装RabbitMq
    官网下载
    (转载)RabbitMq详解

三、配置信息

Publisher

1. Startup.cs



ConfigureServices方法


services.AddCap(x =>
            {
                // 如果你的 SqlServer 使用的 EF 进行数据操作,你需要添加如下配置:
                // 注意: 你不需要再次配置 x.UseSqlServer(""")
                x.UseEntityFramework<PubDBContext>();
                //配置RabbitMq信息
                x.UseRabbitMQ(rb =>
                {
                //RabbitMq所在服务器地址
                    rb.HostName = "localhost";
                    //设置得用户名(默认生成得是guest用户,密码也是guest,
                    //这里是我在Mq里添加得admin用户,密码设置的admin)
                    rb.UserName = "admin";
                    //设置得密码
                    rb.Password = "admin";
                    //默认端口
                    rb.Port = 5672;
                    //一个虚拟主机里面可以有若干个Exchange和Queue,同一个虚拟主机里面不能有相同名称的Exchange或Queue。
                    //将一个主机虚拟为多个,类似路由
                    rb.VirtualHost = "Angel2022";
                    //使用得交换机名称
                    rb.ExchangeName = "AngelCapExchange";
                    //设置消息得过期时间
                    rb.QueueMessageExpires = 24 * 3600 * 10;
                });
            }
//添加 PubDBContext efCoreApp
       public void Configure(IApplicationBuilder app, IWebHostEnvironment env, PubDBContext efCoreApp)
        {
        	efCoreApp.Database.EnsureCreated();
        }

2.PubDbContext

appsettings.json文件配置连接字符串

using Microsoft.EntityFrameworkCore;

namespace _01_Publisher
{
    public class PubDBContext : DbContext
    {   
        public PubDBContext()
        {

        }
        public PubDBContext(DbContextOptions<PubDBContext> options) : base(options)
        {

        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);

        }
    }
}

3.PubController

using DotNetCore.CAP;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;

namespace _01_Publisher.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PubController : ControllerBase
    {
        private ICapPublisher _capBus;
        private PubDBContext _pubDBContext;

        public PubController(ICapPublisher capBus, PubDBContext pubDBContext)
        {
            this._capBus = capBus;
            this._pubDBContext = pubDBContext;
        }
        [HttpGet]
        public IActionResult SendMsg()
        {
        	//引入的CAP,发布订阅,Publish(订阅的路由键(RoutingKey),发布的数据(Query))
        	//路由键的设置,接收订阅的一方,通过路由键来接收对于的订阅
                _capBus.Publish("angel", contentObj: new Person { Id = 1, Name = "11" });
                return Content("发送成功");
        }
    }
}

Subscriber

1.Startup.cs

    <PackageReference Include="DotNetCore.CAP.Dashboard" Version="3.1.2" />
public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            //注入数据库
            services.AddDbContext<SubDBContext>(options => options.UseSqlServer(Configuration["ConnectionStrings:AngelDBContext"]));


            //注册cap事件
            services.AddCap(x =>
            {
                x.UseEntityFramework<SubDBContext>();
                x.UseRabbitMQ(rb =>
                {
                    rb.HostName = "localhost";
                    rb.UserName = "admin";
                    rb.Password = "admin";
                    rb.Port = 5672;
                    rb.VirtualHost = "Angel2022";
                    rb.ExchangeName = "AngelCapExchange";
                    rb.QueueMessageExpires = 24 * 3600 * 10;  //队列中消息自动删除时间(默认10天)
                });
				//这里是引入可视化面板
                x.UseDashboard();//使用Cap可视化面板
            });
        }
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, SubDBContext efCoreApp)
        {
            efCoreApp.Database.EnsureCreated();//数据库不存在自动创建
        }

在这里插入图片描述

2.SubDBContext

using Microsoft.EntityFrameworkCore;

namespace _02_Subscriber
{
    public class SubDBContext : DbContext
    {
        public SubDBContext()
        {

        }
        public SubDBContext(DbContextOptions<SubDBContext> options) : base(options)
        {

        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);

        }
    }
}

3.SubController

namespace _02_Subscriber.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class SubController : ControllerBase
    {
        private ILogger _log;
        public SubController(ILogger<SubController> log)
        {
            this._log = log;
        }

        [NonAction]
        //通过标记找寻,路由键为angel的消息
        [CapSubscribe("angel")]
        public void ReceiveMsg(Person str)
        {
            if(str!=null)
            {
                Console.WriteLine($"接收{str.Id}");
                _log.LogInformation($"我是订阅者,收到的内容为:{str.Id},{str.Name}");
            }
        }
    }
}

四、运行项目

  1. 请求发布消息的API
  2. 查看Cap面板
http://localhost:(运行的端口)/cap

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有诗亦有远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值