.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 目前支持使用 MS Sql Server 数据库的项目,其他数据库正在支持中...
CAP 同时支持使用 EntityFrameworkCore 和 Dapper 的项目,你可以根据需要选择不同的配置方式。
下面是CAP在系统中的一个不完全示意图:
图中实线部分代表用户代码,虚线部分代表CAP内部实现。
下面,我们看一下 CAP 怎么集成到项目中:
Step 1:
你可以运行下面的命令来安装CAP NuGet 包:
PM> Install-Package DotNetCore.CAP
根据底层消息队列,你可以选择引入不同的包:
// 如果你使用的是 KafkaPM> Install-Package DotNetCore.CAP.Kafka// 如果你使用的是 RabbitMQPM> 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){..... // 添加 CAPapp.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
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
.NET Core 事件总线,分布式事务解决方案:CAP相关推荐
- base cap 分布式_干货分享:基于本地消息表的分布式事务解决方案总结
前段时间学习了分布式事务的几种方案,下面主要总结下基于本地消息表实现可靠消息最终一致性的分布式事务方案. 1,什么是分布式事务? 在传统架构中往往是一个单体架构,一个系统就对应一个war包,然后这个系 ...
- 分布式事务解决方案实战
目录 1.数据库事务ACID 2.什么是分布式事务 3.单体事务和分布式事务 3.1 传统单体架构事务 3.2 微服务或者多数据源分布式事务 4.分布式事务理论基础 4.1 CAP 4.2 BASE ...
- 分布式事务解决方案和原理
分布式事务解决方案和原理 一. 背景: 我们知道, 在以前的 all-in-one 的项目开发模式下, 所有事务问题都是本地事务问题, 基本上利用mysql的优化方案和java提供的API, 可以解决 ...
- 分布式事务解决方案全解析
分布式事务解决方案 对于刚刚接触分布式系统的伙伴来说,分布式看起来非常高大上.深不可测.目前已有Dubbo.SpringCloud等较好的分布式框架,但分布式事务仍是分布式系统一大痛点,本文结合一些经 ...
- 常用的分布式事务解决方案
首页 博客 专栏·视频 下载 论坛 问答 代码 直播 能力认证 高校 会员中心 收藏 动态 消息 创作中心 常用的分布式事务解决方案 凌澜星空 2018-03-11 14:44:55 75315 ...
- 基于activemq的分布式事务解决方案
1.分布式事务出现场景 场景描述:支付宝转账余额宝 分布式事务必须满足的条件: 1.远程RPC调用,支付宝和余额宝存在接口调用 2.支付宝和余额宝使用不同的数据库 如图: 2.分布式事务解决方案 1. ...
- 电商项目实战之分布式事务解决方案
电商项目实战之分布式事务解决方案 本地事务 事务隔离级别 事务传播机制 分布式事务 CAP理论 选举与同步理论 BASE理论 解决方案 2PC模式(XA事务) 柔性事务-TCC事务补偿型方案 柔性事务 ...
- 常用的分布式事务解决方案介绍有多少种?
关于分布式事务,工程领域主要讨论的是强一致性和最终一致性的解决方案.典型方案包括: 两阶段提交(2PC, Two-phase Commit)方案 eBay 事件队列方案 TCC 补偿模式 缓存数据最终 ...
- 这6种最常见分布式事务解决方案!请拿走不谢!
作者:不清不慎,目前在杭州蘑菇街公司任职,Java大数据开发工程师一枚,热爱研究开源技术! 架构师社区合伙人! 一.分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器 ...
最新文章
- 《JAVA程序设计》第七周学习总结
- MACE(2)-----模型编译
- linux运维工程师学习路线
- 垃圾软件!动不动就扣费!| 今日最佳
- Context.getExternalFilesDir()和Context.getExternalCacheDir()方法
- linux----------今天又遇到一个奇葩的问题,就是linux文件的权限已经是777了但是还是没有写入权限,按照下面的命令就解决了
- 实数域上的压缩映射不动点原理
- 动易CMS粘贴word图片且图片文件自动上传功能
- centos7通过startx后进入图形界面,使用eog命令提示unable to open display
- 移动磁盘数据错误循环冗余检查,要怎样恢复数据
- iThenticate查重系统的使用及如何去除参考文献
- YOLOv7(目标检测)入门教程详解---环境安装
- 今日头条“偷偷复活”内涵段子,那快播是不是也能重生了?
- LM5161QPWPTQ1
- Android MultiDex 源码分析
- java 7 反射_【7】java 反射详解
- 试衣网的商业模式很脆弱
- 批处理序列风格与管道过滤器风格对比
- 磁盘性能基本测试方法
- 关于安卓启动模拟器时出现~~~~have you declared this activity in your AndroidMainfest.xml?问题