CAP介绍:

CAP是一个用来解决微服务或者分布式系统中分布式事务问题的一个开源项目解决方案。可以解决跨服务器的数据一致性问题。一个简单的列子,如:订单系统创建订单后需要通知邮件通知用户下单成功,解决方案有下面几种:

1:创建订单时同步调用邮件发送,邮件发送失败则整个订单创建失败,这样保证了一致性,但性能和可用性有非常大的问题。或者不管邮件发送状态,失败了就算了,这样用户就可能收不到通知邮件了。

2:创建订单时通过消息队列推送一个订单创建成功的事件,另外创建一个服务来监听消费此事件,并执行邮件发送的功能。这种方案存在往消息队列推送数据失败的可能,存在和方案1一样的问题。

3:创建订单时同时往一个叫“订单创建成功”的事件表中插入相关数据,两者在同一事务中。 另外创建一个服务定时查询此表,发现有待处理的数据时,执行邮件发送,成功后把此数据删除或更新为已处理。此方案保证了最终一致性和可用性,但得定时扫描,性能和及时性有问题。

4:创建订单时同时往一个叫“订单创建成功”的事件表中插入相关数据,两者在同一事务中。并且通过消息队列推送此消息,如果推送失败,则定时扫描“订单创建成功”表将失败的数据重新推送。另外创建一个服务来监听消费此事件,这种方案集成了方案1和方案2的优点,即保证了最终一致性,也保证了可用性。

从上面来看最优的方案显示是方案4,我们这次的主角CAP也正是采用了此种方案来实现的,我们这里介绍的方案4还是比较简单的,CAP的实现要更加的严谨、更加强大,我们不需要建过程表,也不需要处理消息队列的问题,底层很多的细节都不需要我们考虑,只管用就好了。CAP数据库存储支持:Sql Server,MySql,PostgreSql,MongoDB。消息队列支持:RabbitMQ,Kafka,Azure Service Bus等。

各多CAP的介绍可以参考官网,详细的CAP理论可以参考其它文章。 官网 http://cap.dotnetcore.xyz/ ,开源地址:https://github.com/dotnetcore/CAP  ,作者blog https://www.cnblogs.com/savorboard/

快速开始

CAP2.6是2019-8-29发布的,目前官网上的文档快速开始已经无法使用,因为里面用了 Savorboard.CAP.InMemoryMessageQueue 组件,该组件还是2.51,不支持最新的CAP2.6版本,应该得过段时间才会修复文档,或者等 Savorboard.CAP.InMemoryMessageQueue组件更新。现在我们就在这开始我们的“快速开始”吧。我们将基于rabbitmq和sqlserver数据库来实现。

1:创建项目

打开VS创建一个名叫CapDemo的webapi项目,版本选择ASP.NET Core 2.2。CAP2.6不支持2.2以下的.net core

2:添加CAP引用

在Nuget中添加 DotNetCore.CAP   DotNetCore.CAP.RabbitMQ  DotNetCore.CAP.SqlServer 的引用。

3:配置CAP

在Startup.cs的ConfigureServices方法中添加以下代码

            services.AddCap(c =>
{
c.UseSqlServer(@"Data Source=.\sql2014;Initial Catalog=Test;User ID=sa;Password=sa"); //使用SqlServer数据库,连接地址请依实际修改
c.UseRabbitMQ( mq =>
{
mq.HostName = "192.168.150.134"; //RabitMq服务器地址,依实际情况修改此地址
mq.Port = ;
mq.UserName = "admin"; //RabbitMq账号
mq.Password = "admin"; //RabbitMq密码
});
});

4:发布事件

将 CapDemo.Controllers.ValuesController中的所有方法全部删除。添加引用 using DotNetCore.CAP; ,并添加以下方法

        [HttpGet]
public async Task<string> Get([FromServices]ICapPublisher capPublish)
{
await capPublish.PublishAsync<string>("Order.Created", "hello,订单创建成功啦"); //发布Order.Created事件
return "订单创建成功啦";
}

5:订阅事件

在CapDemo.Controllers.ValuesController中添加以下方法:

        [NonAction]
[CapSubscribe("Order.Created")] //监听Order.Created事件
public async Task OrderCreatedEventHand(string msg)
{
Console.WriteLine(msg);
}

6:最后一步:启动测试

在OrderCreatedEventHand方法内打个断点,F5启动项目访问https://localhost:44304/api/values界面。因为此例中第一次访问时可能发布事件比订阅事件要快,导致还没订阅就把事件发布出去了,这样的事件会丢失,所以我们再F5刷新一下界面,可以看到程序就进入到了订阅事件里面。

后记:

添加监控仪表盘监控CAP运行状况:

1:只需要在Startup.cs的AddCap方法中添加配置: c.UseDashboard(); 就万事大吉了,一个功能强大的事件管理界面就出来了,具体如下图:

2: 重新编译并启动项目,进入https://localhost:44304/cap  ,从打开的界面里可以看到CAP的各种事件和状态。

数据库变化

我们再看看数据库里面的变化吧,从下图可以看出CAP自动创建了两个表,并且记录了发布的消息,和接收到的消息。这些数据会定时删除。这些都是不需要我们管的。

本示例源码下载:https://pan.baidu.com/s/1fHXSW20JHSoaYPH748VRKg

.netcore CAP2.6 快速入门的更多相关文章

  1. .NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)

    一.前言 本篇开发环境?1.操作系统: Windows 10 X642.SDK: .NET Core 2.0 Preview 二.安装 .NET Core SDK 1.下载 .NET Core下载地址 ...

  2. .NET Core快速入门教程 4、使用VS Code开发.NET Core控制台应用程序

    一.前言 为什么选择VS Code?VS Code 是一款跨平台的代码编辑器,想想他的哥哥VS,并是微软出品的宇宙第一IDE,那作为VS的弟弟,VS Code 也不会差,毕竟微软出品.反正ken是这么 ...

  3. .NET Core快速入门教程 3、我的第一个.NET Core App (CentOS篇)

    一.前言 本篇开发环境?1.操作系统:CentOS7(因为ken比较偏爱CentOS7)2.SDK版本:.NET Core 2.0 Preview 你可能需要的前置知识1.了解如何通过Hyper-V安 ...

  4. Web Api 入门实战 (快速入门+工具使用+不依赖IIS)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...

  5. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  6. 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)

    今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...

  7. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  8. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  9. Mybatis框架 的快速入门

    MyBatis 简介 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果 ...

随机推荐

  1. k8s1.9.0安装--完整集群部署

    三.完整集群部署 - kubernetes-with-ca 1. 理解认证授权 1.1 为什么要认证 想理解认证,我们得从认证解决什么问题.防止什么问题的发生入手.防止什么问题呢?是防止有人入侵你的集 ...

  2. 记一次远程CMD开发过程

    开发初衷: 有些同学电脑老是要出问题,但又不是什么大问题,通常几句cmd就能搞定.之前解决方案有2:一是远程演示,我口述别人操作:一是我写个cmd脚本,但毕竟不在本机不好调试.(吐槽一下常用的远程控制 ...

  3. hdu多校第八场Parentheses Matrix

    #include<bits/stdc++.h> using namespace std; ][]; int main() { int t; scanf("%d",&am ...

  4. 《HelloGitHub》第 40 期

    <HelloGitHub>第 40 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程. ...

  5. Linux平台 Oracle 19c RAC安装Part1:准备工作

    一.实施前期准备工作 1.1 服务器安装操作系统 1.2 Oracle安装介质 1.3 共享存储规划 1.4 网络规范分配 二.安装前期准备工作 2.1 各节点系统时间校对 2.2 各节点关闭防火墙和 ...

  6. Linux进程间通信——信号

    一.认识信号 信号(Signals)是Unix.类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式.它是一种异步的通知机制,用来提醒进程一个事件已经发生.当一个信号发送给一个进程 ...

  7. Codeforces Round #192 (Div. 2) (329A)C.Purification

    题意: 在一个正常的点可以净化该行该列的所有细胞,判断是否可以净化所有的细胞,并且输出所选的点. 思路: 如果可以的话,一定会选n个点. 先判断每一行是否有正常细胞,然后判断每一列是否有,如果都没有肯 ...

  8. 干货来了!python学习之重难点整理合辑1

    关于装饰器.lambda.鸭子类型.魔法函数的理解仍存有困惑之处,趁周末有时间温故,赶紧去自学了解下相关知识. 1.装饰器是什么: 很多初学者在接触装饰器的时候只做到了肤浅的了解它的概念.组成形态.实 ...

  9. restapi(3)- MongoDBEngine : MongoDB Scala编程工具库

    最近刚好有同事在学习MongoDB,我们讨论过MongoDB应该置于服务器端然后通过web-service为客户端提供数据的上传下载服务.我们可以用上节讨论的respapi框架来实现针对MongoDB ...

  10. 关于程序null值的见解

    今天遇到了一个问题,查询一条数据,返回用list接,发现少了2个值(ssh框架).执行SQL少的这两个字段的值为null.上图说明一下: 可以看到第一次查询没有角标38.39的值. 是同一条SQL,第 ...