CAP 同时支持使用 RabbitMQ,Kafka,Azure Service Bus 等进行底层之间的消息发送。

CAP 目前支持使用 Sql Server,MySql,PostgreSql,MongoDB 数据库的项目。

一般是cap+Kafka,这里使用cap+redis

安装DotNetCore.CAP nuGet包

配置 appsettings.json 数据 。

{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"ConnectionStrings": {
"Mysql_Conn": "Server=localhost;port=3306;Database=db1;UserId=root;Password=123456",
},
"RabbitMQ": {
"HostName": "192.168.122.199",
"UserName": "admin",
"Password": "123456",
"VirtualHost": "vhost_lihy",
"Port": 5672,
"ExchangeName": "cap.text.lihy.exchange" },
"AllowedHosts": "*"
}

根据底层消息队列,你可以选择引入不同的包:

PM> Install-Package DotNetCore.CAP.Kafka
PM> Install-Package DotNetCore.CAP.RabbitMQ
PM> Install-Package DotNetCore.CAP.AzureServiceBus

CAP 目前支持使用 SQL Server, PostgreSql, MySql, MongoDB 的项目,你可以选择引入不同的包:

PM> Install-Package DotNetCore.CAP.SqlServer
PM> Install-Package DotNetCore.CAP.MySql
PM> Install-Package DotNetCore.CAP.PostgreSql
PM> Install-Package DotNetCore.CAP.MongoDB //需要 MongoDB 4.0+ 集群

在 Startup.cs 文件中,添加如下配置:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddDbContext<CapDbContext>(options =>
options.UseMySql(Configuration.GetConnectionString("Mysql_Conn"))); services.AddCap(x =>
{
//如果你使用的 EF 进行数据操作,你需要添加如下配置:
x.UseEntityFramework<CapDbContext>(); //可选项,你不需要再次配置 x.UseSqlServer 了 //如果你使用的ADO.NET,根据数据库选择进行配置:
//x.UseSqlServer("数据库连接字符串");
//x.UseMySql("server=localhost;port=3306;userid=root;password=123456;database=db1;SslMode=none");
//x.UsePostgreSql("数据库连接字符串"); //如果你使用的 MongoDB,你可以添加如下配置:
//x.UseMongoDB("ConnectionStrings"); //注意,仅支持MongoDB 4.0+集群 //CAP支持 RabbitMQ、Kafka、AzureServiceBus 等作为MQ,根据使用选择配置:
x.UseRabbitMQ(o =>
{
o.HostName = Configuration.GetSection("RabbitMQ")["HostName"];
o.UserName = Configuration.GetSection("RabbitMQ")["UserName"];
o.Password = Configuration.GetSection("RabbitMQ")["Password"];
o.VirtualHost = Configuration.GetSection("RabbitMQ")["VirtualHost"];
o.Port = Convert.ToInt32(Configuration.GetSection("RabbitMQ")["Port"]);
//指定Topic exchange名称,不指定的话会用默认的
o.ExchangeName = Configuration.GetSection("RabbitMQ")["ExchangeName"]; }); //设置处理成功的数据在数据库中保存的时间(秒),为保证系统新能,数据会定期清理。
x.SucceedMessageExpiredAfter = 24 * 3600; //设置失败重试次数
x.FailedRetryCount = 5; //x.UseKafka("ConnectionStrings");
//x.UseAzureServiceBus("ConnectionStrings"); x.UseDashboard();
}); }

发布事件/消息

新建 PublishController 控制器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DotNetCore.CAP;
using Microsoft.AspNetCore.Mvc;
using MySql.Data.MySqlClient; // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 namespace NETCORE.CAP.Controllers
{
[Route("api/[controller]")]
public class PublishController : Controller
{ private readonly ICapPublisher _capBus; public PublishController(ICapPublisher capPublisher)
{
_capBus = capPublisher;
} /// <summary>
/// 不使用事务
/// </summary>
/// <returns></returns>
[Route("~/without/transaction")]
public IActionResult WithoutTransaction()
{
_capBus.Publish("xxx.services.show.time", DateTime.Now); return Ok();
} ////Ado.Net 中使用事务,自动提交
//[Route("~/adonet/transaction")]
//public IActionResult AdonetWithTransaction()
//{
// using (var connection = new MySqlConnection(ConnectionString))
// {
// using (var transaction = connection.BeginTransaction(_capBus, autoCommit: true))
// {
// //业务代码 // _capBus.Publish("xxx.services.show.time", DateTime.Now);
// }
// }
// return Ok();
//} ////EntityFramework 中使用事务,自动提交
//[Route("~/ef/transaction")]
//public IActionResult EntityFrameworkWithTransaction([FromServices]AppDbContext dbContext)
//{
// using (var trans = dbContext.Database.BeginTransaction(_capBus, autoCommit: true))
// {
// //业务代码 // _capBus.Publish("xxx.services.show.time", DateTime.Now);
// }
// return Ok();
//} }
}

订阅事件/消息

新建 ReceivedController 控制器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DotNetCore.CAP;
using Microsoft.AspNetCore.Mvc; // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 namespace NETCORE.CAP.Controllers
{
[Route("api/[controller]")]
public class ReceivedController : Controller
{
[NonAction]
[CapSubscribe("xxx.services.show.time")]
public void CheckReceivedMessage(DateTime time)
{
Console.WriteLine(time);
//return Task.CompletedTask;
}
}
}

运行后,

数据库即生成两张表

调用接口 https://localhost:5001/without/transaction

在数据表中可查看相关状态。

Cap 仪表盘

默认地址 https://localhost:5001/cap

Dashboard介绍

capOptions.UseDashboard(dashoptions =>
{
dashoptions.AppPath = "applicationpath";
dashoptions.PathMatch = "/cap";
dashoptions.Authorization = new[] { new CapDashboardFilter() }; });

这里只说这几个参数

AppPath:应用程序路径  访问dashboard的时候会有一个返回应用的操作,这个即是应用的地址

PathMatch:不设置的情况下都是cap,可以指定自己的dashboard路由地址
Authorization:授权处理

授权处理具体实现

只需要实现接口IDashboardAuthorizationFilter即可

public class CapDashboardFilter : IDashboardAuthorizationFilter
{ public bool Authorize(DashboardContext context)
{
return true;
}
}

通过DashboardContext上下文处理请求,允许返回true,不允许返回false

附代码:https://gitee.com/wuxincaicai/NETCORE.git

net core cap结合redis+数据库实现最终一致性的更多相关文章

  1. 脑裂 CAP PAXOS 单元化 网络分区 最终一致性 BASE

    阿里技术专家甘盘:浅谈双十一背后的支付宝LDC架构和其CAP分析 https://mp.weixin.qq.com/s/Cnzz5riMc9RH19zdjToyDg 汤波(甘盘) 技术琐话 2020- ...

  2. C#.Net Core 操作Docker中的redis数据库

    做软件开发的人,会在本机安装很多开发时要用到的软件,比如数据库,有MS SQL Server,MySQL,等,如果每种数据库都按照在本机确实有点乱,这个时候我们就想用虚拟机来隔离,这样就不会扰乱本机一 ...

  3. 【Redis数据库】再有人问你CAP理论是什么,就把这篇文章发给他

    CAP是Consistency(一致性),Availability(可用性),Partition tolerance(分区容错性)的缩写.在学习redis过程中看到这个名词,查找各位大佬的文章发现这篇 ...

  4. 分布式事务最终一致性-CAP框架轻松搞定

    前言 对于分布式事务,常用的解决方案根据一致性的程度可以进行如下划分: 强一致性(2PC.3PC):数据库层面的实现,通过锁定资源,牺牲可用性,保证数据的强一致性,效率相对比较低. 弱一致性(TCC) ...

  5. NoSql的三大基石:CAP理论&BASE&最终一致性

    关系型数据库的局限 NoSql出现在关系型数据库之后,主要是为了解决关系型数据库的短板,我们先来看看随着软件行业的发展,关系型数据库面临了哪些挑战: 1.高并发 一个最典型的就是电商网站,例如双11, ...

  6. 使用AOF持久化文件实现还原Redis数据库并得到RDB持久化文件

    目录 1 编写本文的初衷 2 具体实施 2.1 Redis持久化概念简介 2.2 获取指定Redis的AOF持久化文件 2.3 把Redis的持久化AOF文件转换为RDB文件 1 编写本文的初衷 因为 ...

  7. 分布式系统的CAP(Redis)

    CAP理论就是说在分布式存储系统中,最多只能实现上面的两点.而由于当前的网络硬件肯定会出现延迟丢包等问题,所以 分区容忍性是我们必须需要实现的. 所以我们只能在一致性和可用性之间进行权衡,没有NoSQ ...

  8. redis深入学习(一)-----CAP、redis数据类型

    NoSQL数据库的四大分类 KV键值: memcache+redis 文档型数据库(bson格式比较多): MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在 ...

  9. Spring + Jedis集成Redis(集群redis数据库)

    前段时间说过单例redis数据库的方法,但是生成环境一般不会使用,基本上都是集群redis数据库,所以这里说说集群redis的代码. 1.pom.xml引入jar <!--Redis--> ...

随机推荐

  1. Eclipse中get/set方法自动生成

    代码中点击右键(快捷键Ctrl+Alt+S) ->Source ->Generate Getters and Setters... ->全选(或选择需要生成的字段/方法) 动图: 静 ...

  2. 我与PHP和git不得不说的故事(梦开始的地方,从入门到放弃记录第一章)

    ·关于下载 阿瑶瑶跟wampsever官网搏斗了一下午,其实我觉得教材可能在PUA我.谷歌说它给的网址安全证书过期,然后下载以断网收场.(阿瑶的第一战,以失败告终) [经过我玲姐指点,下载路径变为迅雷 ...

  3. 20200520_windows2012安装python和django环境

    http://httpd.apache.org/download.cgi#apache24 配置文件修改后, 记得去阿里云开放端口 ServerName 172.18.196.189:9080 →不能 ...

  4. 第三十九章、PyQt显示部件:OpenGL Widget部件功能简介及使用其显示图片

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 OpenGL Widget部件是一个Op ...

  5. PyQt(Python+Qt)学习随笔:QTreeWidgetItem项的子项索引、删除子项的方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 树型部件QTreeWidget中的QTreeWidgetItem项: 获取子项索引 可通过index ...

  6. Python正则表达式re.findall一个有趣的现象

    下面通过几个案例来分析一下, 注意:本节的parsematch函数请参考<妙用re.sub分析正则表达式解析匹配过程> 案例一: >>> re.findall(r&quo ...

  7. 第十三章、Designer中的按钮Buttons组件详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 Qt Designer中的Buttons部件包括Push Button(常规按钮.一般称按 ...

  8. Zookeeper的基本原理(zk架构、zk存储结构、watch机制、独立安装zk、集群间同步复制)

    1.Hbase集群的高可用性与伸缩性 HBase可以实现对Regionserver的监控,当个别Regionserver不可访问时,将其负责的分区分给其他Regionsever,其转移过程较快,因为只 ...

  9. Project Lombok——带给你简洁、清晰的代码

    相信但凡有一点Java编程经历的人,都见过或者写过下面这种代码.这是一个简单的POJO,只有4个fields,加上构造器.equals.hash.toString以及各种getter setter,前 ...

  10. js动态加载js文件(js异步加载之性能优化篇)

    1.[基本优化] 将所有需要的<script>标签都放在</body>之前,确保脚本执行之前完成页面渲染而不会造成页面堵塞问题,这个大家都懂. 2.[合并JS代码,尽可能少的使 ...