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

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

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

安装DotNetCore.CAP nuGet包

配置 appsettings.json 数据 。

  1. {
  2. "Logging": {
  3. "LogLevel": {
  4. "Default": "Warning"
  5. }
  6. },
  7. "ConnectionStrings": {
  8. "Mysql_Conn": "Server=localhost;port=3306;Database=db1;UserId=root;Password=123456",
  9. },
  10. "RabbitMQ": {
  11. "HostName": "192.168.122.199",
  12. "UserName": "admin",
  13. "Password": "123456",
  14. "VirtualHost": "vhost_lihy",
  15. "Port": 5672,
  16. "ExchangeName": "cap.text.lihy.exchange"
  17.  
  18. },
  19. "AllowedHosts": "*"
  20. }

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

  1. PM> Install-Package DotNetCore.CAP.Kafka
  2. PM> Install-Package DotNetCore.CAP.RabbitMQ
  3. PM> Install-Package DotNetCore.CAP.AzureServiceBus

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

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

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

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  4.  
  5. services.AddDbContext<CapDbContext>(options =>
  6. options.UseMySql(Configuration.GetConnectionString("Mysql_Conn")));
  7.  
  8. services.AddCap(x =>
  9. {
  10. //如果你使用的 EF 进行数据操作,你需要添加如下配置:
  11. x.UseEntityFramework<CapDbContext>(); //可选项,你不需要再次配置 x.UseSqlServer 了
  12.  
  13. //如果你使用的ADO.NET,根据数据库选择进行配置:
  14. //x.UseSqlServer("数据库连接字符串");
  15. //x.UseMySql("server=localhost;port=3306;userid=root;password=123456;database=db1;SslMode=none");
  16. //x.UsePostgreSql("数据库连接字符串");
  17.  
  18. //如果你使用的 MongoDB,你可以添加如下配置:
  19. //x.UseMongoDB("ConnectionStrings"); //注意,仅支持MongoDB 4.0+集群
  20.  
  21. //CAP支持 RabbitMQ、Kafka、AzureServiceBus 等作为MQ,根据使用选择配置:
  22. x.UseRabbitMQ(o =>
  23. {
  24. o.HostName = Configuration.GetSection("RabbitMQ")["HostName"];
  25. o.UserName = Configuration.GetSection("RabbitMQ")["UserName"];
  26. o.Password = Configuration.GetSection("RabbitMQ")["Password"];
  27. o.VirtualHost = Configuration.GetSection("RabbitMQ")["VirtualHost"];
  28. o.Port = Convert.ToInt32(Configuration.GetSection("RabbitMQ")["Port"]);
  29. //指定Topic exchange名称,不指定的话会用默认的
  30. o.ExchangeName = Configuration.GetSection("RabbitMQ")["ExchangeName"];
  31.  
  32. });
  33.  
  34. //设置处理成功的数据在数据库中保存的时间(秒),为保证系统新能,数据会定期清理。
  35. x.SucceedMessageExpiredAfter = 24 * 3600;
  36.  
  37. //设置失败重试次数
  38. x.FailedRetryCount = 5;
  39.  
  40. //x.UseKafka("ConnectionStrings");
  41. //x.UseAzureServiceBus("ConnectionStrings");
  42.  
  43. x.UseDashboard();
  44. });
  45.  
  46. }

发布事件/消息

新建 PublishController 控制器

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using DotNetCore.CAP;
  6. using Microsoft.AspNetCore.Mvc;
  7. using MySql.Data.MySqlClient;
  8.  
  9. // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
  10.  
  11. namespace NETCORE.CAP.Controllers
  12. {
  13. [Route("api/[controller]")]
  14. public class PublishController : Controller
  15. {
  16.  
  17. private readonly ICapPublisher _capBus;
  18.  
  19. public PublishController(ICapPublisher capPublisher)
  20. {
  21. _capBus = capPublisher;
  22. }
  23.  
  24. /// <summary>
  25. /// 不使用事务
  26. /// </summary>
  27. /// <returns></returns>
  28. [Route("~/without/transaction")]
  29. public IActionResult WithoutTransaction()
  30. {
  31. _capBus.Publish("xxx.services.show.time", DateTime.Now);
  32.  
  33. return Ok();
  34. }
  35.  
  36. ////Ado.Net 中使用事务,自动提交
  37. //[Route("~/adonet/transaction")]
  38. //public IActionResult AdonetWithTransaction()
  39. //{
  40. // using (var connection = new MySqlConnection(ConnectionString))
  41. // {
  42. // using (var transaction = connection.BeginTransaction(_capBus, autoCommit: true))
  43. // {
  44. // //业务代码
  45.  
  46. // _capBus.Publish("xxx.services.show.time", DateTime.Now);
  47. // }
  48. // }
  49. // return Ok();
  50. //}
  51.  
  52. ////EntityFramework 中使用事务,自动提交
  53. //[Route("~/ef/transaction")]
  54. //public IActionResult EntityFrameworkWithTransaction([FromServices]AppDbContext dbContext)
  55. //{
  56. // using (var trans = dbContext.Database.BeginTransaction(_capBus, autoCommit: true))
  57. // {
  58. // //业务代码
  59.  
  60. // _capBus.Publish("xxx.services.show.time", DateTime.Now);
  61. // }
  62. // return Ok();
  63. //}
  64.  
  65. }
  66. }

订阅事件/消息

新建 ReceivedController 控制器

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using DotNetCore.CAP;
  6. using Microsoft.AspNetCore.Mvc;
  7.  
  8. // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
  9.  
  10. namespace NETCORE.CAP.Controllers
  11. {
  12. [Route("api/[controller]")]
  13. public class ReceivedController : Controller
  14. {
  15. [NonAction]
  16. [CapSubscribe("xxx.services.show.time")]
  17. public void CheckReceivedMessage(DateTime time)
  18. {
  19. Console.WriteLine(time);
  20. //return Task.CompletedTask;
  21. }
  22. }
  23. }

运行后,

数据库即生成两张表

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

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

Cap 仪表盘

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

Dashboard介绍

  1. capOptions.UseDashboard(dashoptions =>
  2. {
  3. dashoptions.AppPath = "applicationpath";
  4. dashoptions.PathMatch = "/cap";
  5. dashoptions.Authorization = new[] { new CapDashboardFilter() };
  6.  
  7. });

这里只说这几个参数

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

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

授权处理具体实现

只需要实现接口IDashboardAuthorizationFilter即可

  1. public class CapDashboardFilter : IDashboardAuthorizationFilter
  2. {
  3.  
  4. public bool Authorize(DashboardContext context)
  5. {
  6. return true;
  7. }
  8. }

通过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. Linux下的MediaWiki的部署启动遇到的问题与解决方案

    1. MySQL安装不成功 解决方案:https://bbs.csdn.net/topics/394377536 2. no space left on device ubuntu 解决方案:http ...

  2. LeetCode 018 4Sum

    题目描述:4Sum Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c ...

  3. rest-framework 分页器

    一 简单分页(查看第n页,每页显示n条) from rest_framework.pagination import PageNumberPagination # 一 基本使用:url=url=htt ...

  4. Django匆匆一眼却解答了多年疑惑

    Django 是 Python 的 一款 Web 开发框架,另外还有 Tornado,Flask,Twisted.为什么我要选择学 Django?原因很简单,上家公司来了个网易的测开,就是用 Djan ...

  5. Spring Cloud 学习 (九) Spring Security, OAuth2

    Spring Security Spring Security 是 Spring Resource 社区的一个安全组件.在安全方面,有两个主要的领域,一是"认证",即你是谁:二是& ...

  6. dubbo源码学习(一)dubbo容器启动流程简略分析

    最近在学习dubbo,dubbo的使用感觉非常的简单,方便,基于Spring的容器加载配置文件就能直接搭建起dubbo,之前学习中没有养成记笔记的习惯,时间一久就容易忘记,后期的复习又需要话费较长的时 ...

  7. Django+Nginx+uWSGI生产环境部署

    生产环境中的数据流 参考文档: wsgi详解:https://blog.csdn.net/li_101357/article/details/52748323 wsgi协议介绍(萌新版):https: ...

  8. python装饰器基础及应用

    一.简介 装饰器是是修改其它函数功能的函数:其意义是让其他函数在不修改任何代码的前提下增加额外功能 二.数据类型 首先我们来看一段简单的代码: from types import MethodType ...

  9. eclispe中打点不会提示的解决方法,以及自动补全

    Eclipse中打点无提示的解决办法 建了个JAVA工程,然后发现输入代码后,在输入.后面不会弹出来我所要的函数.  alt+/      提示No Default Proposals 自己找了半天, ...

  10. 老猿Python部分代码样例

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 PyQt编程实战:通过eventFilter监视QScrollArea的widget()的Paint ...