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. 小白开学Asp.Net Core 开篇

    开学Asp.Net Core 开篇 一.准备工作 1.操作环境:Win10 2.开发工具:VS2019 3.运行环境:.Net Core 2.2 4.数据库:SqlServer2012 二.项目搭建 ...

  2. 《VR入门系列教程》之4---运行平台

    运行平台     大多数的VR应用都可以在目前多数的PC和手机上运行,基本上一个不太旧的PC或者配置好点的笔记本电脑都可以正常运行Oculus Rift,如果手机的CPU和显卡不错的话也可以有很好的V ...

  3. python检测变量名

    python检测变量名 变量在编程中的用途非常广,在python中,变量的名称只能以字母或者下划线“_”开头,变量名只能由字母.数字.下划线组成. 编写python,使得其实现以下功能: 1.输入一个 ...

  4. linux初学者-磁盘配额篇

    linux初学者-磁盘配额篇 在使用磁盘时,只要有权限,不管什么用户都可以在其中写入数据,但是如果是多人在一个磁盘中写入数据,就会出现争议,如果一个用户将磁盘空间用完,那么其他人无法再使用.如下图所示 ...

  5. 如何阅读zstack源码

    个人的gitbook将会持续更新 https://www.gitbook.com/book/jingtyu/how-to-learn-zstack-code

  6. Netty+WebSocket 获取火币交易所数据项目

    Netty+WebSocket 获取火币交易所时时数据项目 先附上项目项目GitHub地址 spring-boot-netty-websocket-huobi 项目简介 本项目使用 SpringBoo ...

  7. 一个项目中:只能存在一个 WebMvcConfigurationSupport (静态文件失效之坑)

    一个项目中:只能存在一个 WebMvcConfigurationSupport 在一个项目中WebMvcConfigurationSupport只能存在一个,多个的时候,只有一个会生效. 静态文件访问 ...

  8. jboss 未授权访问漏洞复现

    jboss 未授权访问漏洞复现 一.漏洞描述 未授权访问管理控制台,通过该漏洞,可以后台管理服务,可以通过脚本命令执行系统命令,如反弹shell,wget写webshell文件. 二.漏洞环境搭建及复 ...

  9. linux自学

    Linux文件与目录管理   所有不太会的命令,可以用man +命令,查看相关解释文档   绝对路径:从根路径写起的路径,/usr/local 相对路径:例如:路径a:~/demo/test  路径b ...

  10. python log 设置

    # -*- coding: utf-8 -*- import loggingfrom logging.handlers import TimedRotatingFileHandler  # 按时间处理 ...