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

一、入门

  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
    评论
netcore是由微软开发的一个跨平台的开发框架,可以用来构建各种类型的应用程序,包括Web应用、手机应用、桌面应用等等。下面是关于netcore入门的指南。 首先,要开始学习netcore,你需要安装.netcore的开发工具和运行环境。你可以在微软官网上下载并安装.netcore的SDK工具包,它包含了用来编译、调试和部署.netcore应用程序所需的一切。 安装完成后,你可以使用一个文本编辑器(例如Visual Studio Code)来编写.netcore应用程序。你可以使用C#作为主要的编程语言,也可以使用F#或者VB.NET。 netcore的应用程序通常采用MVC(Model View Controller)的设计模式。这意味着你需要将你的应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。模型是用来处理数据逻辑的部分,视图是用来展示数据的部分,而控制器则负责接收用户的请求并做出相应的处理。 netcore还支持使用不同的数据库来存储和管理数据。你可以使用关系型数据库,如SQL Server、MySQL或者PostgreSQL,也可以使用非关系型数据库,如MongoDB或者Redis。 在编写.netcore应用程序时,你可以使用丰富的.netcore库和第三方库来加速开发过程。这些库可以帮助你处理各种任务,如处理HTTP请求、读写文件、发送电子邮件等等。 最后,你可以使用.netcore的内置工具来构建、测试和部署你的应用程序。你可以使用命令行工具或者可视化界面(如Visual Studio)来完成这些任务。 通过这个简要指南,你可以开始学习和使用netcore来构建各种类型的应用程序。希望这些信息对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有诗亦有远方

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

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

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

打赏作者

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

抵扣说明:

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

余额充值