【转】.NET Core 事件总线,分布式事务解决方案:CAP

背景

相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用的过程中也会遇到分布式事务的问题,那么 CAP 就是在这样的背景下诞生的。

最初打算做这个东西是在去年(2016)年底,最初是为了解决分布式系统中的分布式事务的问题,然后当时有了一个大概的概念轮廓,当时我对于前面两篇文章中关于异步消息和微服务之间通讯还不是太了解,只是觉得这样能够解决这一系列的问题,然后就着手做了,最后发现和这些概念竟然不谋而合。

经过大半年的不断重构以及修改,最终 CAP 1.0 版本发布了。作为一个开源项目,最初项目是在我的个人Github下,然后于上个月已经贡献给了 .NET China Foundation 组织,目前该项目由我和 DotNetCore 项目组共同维护。

CAP 介绍

Github:https://github.com/dotnetcore/CAP

开源协议:MIT

CAP 是一个在分布式系统中(SOA,MicroService)实现事件总线及最终一致性(分布式事务)的一个开源的 C# 库,她具有轻量级,高性能,易使用等特点。

你可以轻松的在基于 .NET Core 技术的分布式系统中引入CAP,包括但限于 ASP.NET Core 和 ASP.NET Core on .NET Framework。

CAP 以 NuGet 包的形式提供,对项目无任何入侵,你仍然可以以你喜爱的方式来构建分布式系统。

CAP 具有 Event Bus 的所有功能,并且CAP提供了更加简化的方式来处理EventBus中的发布/订阅。

CAP 具有消息持久化的功能,也就是当你的服务进行重启或者宕机时,她可以保证消息的可靠性。

CAP 实现了分布式事务中的最终一致性,你不用再去处理这些琐碎的细节。

CAP 提供了基于 Microsoft DI 的 API 服务,她可以和你的 ASP.NET Core 系统进行无缝结合,并且能够和你的业务代码集成支持强一致性的事务处理。

CAP 是开源免费的。CAP基于MIT协议开源,你可以免费的在你的私人或者商业项目中使用,不会有人向你收取任何费用。

Getting Started

目前, CAP 同时支持使用 RabbitMQ 或 Kafka 进行底层之间的消息发送,你不需要具备 RabbitMQ 或者 Kafka 的使用经验,仍然可以轻松的集成到项目中。

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

CAP 同时支持使用 EntityFrameworkCore 和 Dapper 的项目,你可以根据需要选择不同的配置方式。

下面是CAP在系统中的一个不完全示意图:

图中实线部分代表用户代码,虚线部分代表CAP内部实现。

下面,我们看一下 CAP 怎么集成到项目中:

Step 1:

你可以运行下面的命令来安装CAP NuGet 包:

PM> Install-Package DotNetCore.CAP

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

// 如果你使用的是 Kafka
PM> Install-Package DotNetCore.CAP.Kafka // 如果你使用的是 RabbitMQ
PM> Install-Package DotNetCore.CAP.RabbitMQ

CAP 目前支持使用 SQL Server 的项目,你需要引入:

PM> Install-Package DotNetCore.CAP.SqlServer

Step 2:

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

public void ConfigureServices(IServiceCollection services)
{
...... services.AddDbContext<AppDbContext>(); services.AddCap(x =>
{
// 如果你的 SqlServer 使用的 EF 进行数据操作,你需要添加如下配置:
// 注意: 你不需要再次配置 x.UseSqlServer(""")
x.UseEntityFramework<AppDbContext>(); // 如果你使用的Dapper,你需要添加如下配置:
x.UseSqlServer("数据库连接字符串"); // 如果你使用的 RabbitMQ 作为MQ,你需要添加如下配置:
x.UseRabbitMQ("localhost"); //如果你使用的 Kafka 作为MQ,你需要添加如下配置:
x.UseKafka("localhost:9092");
});
} public void Configure(IApplicationBuilder app)
{
..... // 添加 CAP
app.UseCap();
}

发布事件/消息

在 Controller 中注入 ICapPublisher 然后使用 ICapPublisher 进行消息发布:

public class PublishController : Controller
{
private readonly ICapPublisher _publisher; public PublishController(ICapPublisher publisher)
{
_publisher = publisher;
} [Route("~/checkAccountWithTrans")]
public async Task<IActionResult> PublishMessageWithTransaction([FromServices]AppDbContext dbContext)
{
using (var trans = dbContext.Database.BeginTransaction())
{
//指定发送的消息标题(供订阅)和内容
await _publisher.PublishAsync("xxx.services.account.check",
new Person { Name = "Foo", Age = 11 });
// 你的业务代码。
trans.Commit();
}
return Ok();
}
}

订阅事件/消息

Controller 中:
如果是在Controller中,直接添加[CapSubscribe("")] 来订阅相关消息。

public class PublishController : Controller
{
[NoAction]
[CapSubscribe("xxx.services.account.check")]
public async Task CheckReceivedMessage(Person person)
{
Console.WriteLine(person.Name);
Console.WriteLine(person.Age);
return Task.CompletedTask;
}
}

xxxService中:
如果你的方法没有位于Controller 中,那么你订阅的类需要继承 ICapSubscribe,然后添加[CapSubscribe("")]标记:

namespace xxx.Service
{
public interface ISubscriberService
{
public void CheckReceivedMessage(Person person);
} public class SubscriberService: ISubscriberService, ICapSubscribe
{
[CapSubscribe("xxx.services.account.check")]
public void CheckReceivedMessage(Person person)
{ }
}
}

然后在 Startup.cs 中的 ConfigureServices() 中注入你的 ISubscriberService

public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<ISubscriberService,SubscriberService>();
}

结束了,怎么样,是不是很简单?

鸣谢

感谢 lan Ye 同学对本项目的英文翻译工作。

感谢 AlexLEWIS 同学对本项目的其他支持。

感谢 .NET China Foundation 团队成员对本项目的支持。

总结

如果你有任何问题,都可以去 Github 给我们提交 Issue,我们会在第一时间处理。

如果你觉得这个开源项目还不错,给个Github Star 支持一下那就太好了。

如果你觉得本篇文章对你有帮助的话,可以关注一下博主,顺手点个【推荐】哦。



本文地址:http://www.cnblogs.com/savorboard/p/cap.html
作者博客:Savorboard
欢迎转载,请在明显位置给出出处及链接

【转】.NET Core 事件总线,分布式事务解决方案:CAP的更多相关文章

  1. .NET Core 事件总线,分布式事务解决方案:CAP

    背景 相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用的过程中也会遇到分布式事务的问题,那么 CAP 就是在这样的背景 ...

  2. .NET Core 事件总线,分布式事务解决方案:CAP 基于Kafka

    背景 相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用的过程中也会遇到分布式事务的问题,那么 CAP 就是在这样的背景 ...

  3. NET Core 事件总线

    NET Core 事件总线,分布式事务解决方案:CAP 背景 相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用的过程中 ...

  4. 分布式事务解决方案以及 .Net Core 下的实现(上)

    数据一致性是构建业务系统需要考虑的重要问题 , 以往我们是依靠数据库来保证数据的一致性.但是在微服务架构以及分布式环境下实现数据一致性是一个很有挑战的的问题.最近在研究分布式事物,分布式的解决方案有很 ...

  5. C#分布式事务解决方案-TransactionScope(转)

    出处:C#分布式事务解决方案-TransactionScope 引用一下别人的导读:在实际开发工作中,执行一个事件,然后调用另一接口插入数据,如果处理逻辑出现异常,那么之前插入的数据将成为垃圾数据,我 ...

  6. 分布式事务解决方案汇总:2PC、3PC、消息中间件、TCC、状态机+重试+幂等(转)

    数据一致性问题非常多样,下面举一些常见例子.比如在更新数据的时候,先更新了数据库,后更新了缓存,一旦缓存更新失败,此时数据库和缓存数据会不一致.反过来,如果先更新缓存,再更新数据库,一旦缓存更新成功, ...

  7. 基于支付系统真实场景的分布式事务解决方案效果演示: http://www.iqiyi.com/w_19rsveqlhh.html

    基于支付系统真实场景的分布式事务解决方案效果演示:http://www.iqiyi.com/w_19rsveqlhh.html

  8. 阿里开源分布式事务解决方案 Fescar

    微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这样可以降低开发难度.增强扩展性.便于敏捷开发.当前被越来越多的开发者推崇,系统微服务化后,一个看似简单的功能,内部可能需要调用多个服务并 ...

  9. 阿里微服务架构下分布式事务解决方案-GTS

    虽然微服务现在如火如荼,但对其实践其实仍处于初级阶段.即使互联网巨头的实践也大多是试验层面,鲜有核心业务系统微服务化的案例.GTS是目前业界第一款,也是唯一的一款通用的解决微服务分布式事务问题的中间件 ...

随机推荐

  1. 002 spring boot框架,引入mybatis-generator插件,自动生成Mapper和Entity

    1.创建一个springboot项目 2.创建项目的文件结构以及jdk的版本 3.选择项目所需要的依赖 点击next,直到项目构建完成. 4.项目初步结构 5.POM文件 <?xml versi ...

  2. 图片懒加载--lazyload.js的用法

    这几天公司的项目已经完成的差不多了,只剩下各种优化问题.今天着重于图片加载的优化.当一个页面需要下拉很长而且又有过多的图片要加载时,就会发生很多http请求,就会拉慢网页加载速度,用户体验不友好.怎么 ...

  3. c++11多线程记录6:条件变量(condition variables)

    https://www.youtube.com/watch?v=13dFggo4t_I视频地址 实例1 考虑这样一个场景:存在一个全局队列deque,线程A向deque中推入数据(写),线程B从deq ...

  4. day54——jquery补充、bootstrap

    day54 jquery 页面载入 window.onload: 原生js的window.onload事件:// onload 等待页面所有内容加载完成之后自动触发的事件 window.onload ...

  5. Label&Button

    Button中的bg参数设置按钮背景颜色,fg参数设置字体颜色 pack中的fill参数告诉Packer让QUIT按钮占据剩余的水平空间,而expand参数则引导它填充整个水平可视空间,将按钮拉伸到左 ...

  6. Go基础编程实践(八)—— 系统编程

    捕捉信号 // 运行此程序,控制台将打印"Waiting for signal" // 按Ctrl + C 发送信号以关闭程序,将发生中断 // 随后控制台依次打印"Si ...

  7. 7. Spark SQL的运行原理

    7.1 Spark SQL运行架构 Spark SQL对SQL语句的处理和关系型数据库类似,即词法/语法解析.绑定.优化.执行.Spark SQL会先将SQL语句解析成一棵树,然后使用规则(Rule) ...

  8. .net Dapper 实践系列(4) ---数据查询(Layui+Ajax+Dapper+MySQL)

    写在前面 上一小节,总结了数据显示时,会出现的日期问题.以及如何处理格式化日期.这个小节,主要总结的是使用Dapper 中的QueryMultiple方法依次显示查询多表的数据. 实践步骤 1.在Bo ...

  9. JavaScript之原型、函数、实例

    JavaScript 函数语法 函数就是包裹在花括号中的代码块,前面使用了关键词 function: function functionname() {    // 执行代码 } 当调用该函数时,会执 ...

  10. 记.net core 项目在linux系统下启动失败的一个教训

    最近准备用.net core开发一个项目.使用的是Coldairarrow的框架.做了一部分之后,准备部署到服务器上测试一下.然后就遇到了这个问题. 项目路径: /home/www/webapi/ 启 ...