前言
在分布式系统中,由于各个系统服务之间的独立性和网络通信的不确定性,要确保跨系统的事务操作的最终一致性是一项重大的挑战。今天给大家推荐一个.NET开源的处理分布式事务的解决方案基于 .NET Standard 的 C# 库:CAP。
CAP项目介绍
CAP 是一个基于 .NET Standard 的 C# 库,它是一种处理分布式事务的解决方案,同样具有 EventBus 的功能,它具有轻量级、易使用、高性能等特点。CAP 是一个EventBus,同时也是一个在微服务或者SOA系统中解决分布式事务问题的一个框架。它有助于创建可扩展,可靠并且易于更改的微服务系统。
什么是 EventBus?
事件总线是一种机制,它允许不同的组件彼此通信而不彼此了解。组件可以将事件发送到Eventbus,而无需知道是谁来接听或有多少其他人来接听。组件也可以侦听Eventbus上的事件,而无需知道谁发送了事件。这样,组件可以相互通信而无需相互依赖。同样,很容易替换一个组件。只要新组件了解正在发送和接收的事件,其他组件就永远不会知道。
CAP架构预览
CAP支持的存储
S服务器托管网QL Server、MySQL、PostgreSql、MongoDB、In-Memory Storage。
CAP 支持以下几种运输方式
RabbitMQ、Kafka、Azure Service Bus、Amazon SQS、NATS、In-Memory Queue、Redis Streams、Apache Pulsar。
怎么选择运输器
项目源码
快速开始
安装DotNetCore.CAP Nuget包
CAP 支持主流的消息队列作为传输器:
我本地安装的是DotNetCore.CAP.RabbitMQ。
//你可以按需选择下面的包进行安装:
PM>Install-PackageDotNetCore.CAP.Kafka
PM>Install-PackageDotNetCore.CAP.RabbitMQ
PM>Install-PackageDotNetCore.CAP.AzureServiceBus
PM>Install-PackageDotNetCore.CAP.AmazonSQS
PM>Install-PackageDotNetCore.CAP.NATS
PM>Install-PackageDotNetCore.CAP.RedisStreams
PM>Install-PackageDotNetCore.CAP.Pulsar
CAP 提供了主流数据库作为存储:
我本地安装的是DotNetCore.CAP.MongoDB。
//按需选择安装你正在使用的数据库:
PM>Install-PackageDotNetCore.CAP.SqlServer
PM>Install-PackageDotNetCore.CAP.MySql
PM>Install-PackageDotNetCore.CAP.PostgreSql
PM>Install-PackageDotNetCore.CAP.MongoDB
配置CAP到 Program.cs 文件中,如下:
builder.Services.AddCap(x=>
{
//如果你使用的 EF 进行数据操作,你需要添加如下配置:
//配置数据库上下文
x.UseEntityFramework();
//如果你使用的 MongoDB,你可以添加如下配置:
x.UseMongoDB("ConnectionStrings");//注意,仅支持MongoDB4.0+集群
//CAPRabbitMQ配置
x.UseRabbitMQ(rab=>{
rab.HostName="192.0.1.1";
rab.Password="123456";
rab.Port=5672;
rab.UserName="123456";
});
});
发布
在 Controller 中注入 ICapPublisher 然后使用 ICapPublisher 进行消息发送。
publicclassPublishController:Controller
{
privatereadonlyICapPublisher_capBus;
publicPublishController(ICapPublishercapPublisher)
{
_capBus=capPublisher;
}
//不使用事务
[Route("~/without/transaction")]
publicIActionResultWithoutTransaction()
{
_capBus.Publish("xxx.services.show.time",DateTime.Now);
//Publishdelaymessage
_capBus.PublishDelayAsync(TimeSpan.FromSeconds(delaySeconds),"xxx.services.show.time",DateTime.Now);
returnOk();
}
//Ado.Net中使用事务,自动提交
[Route("~/adonet/transaction")]
publicIActionResultAdonetWithTransaction()
{
using(varconnection=newMySqlConnection(ConnectionStrin服务器托管网g))
{
using(vartransaction=connection.BeginTransaction(_capBus,autoCommit:true))
{
//业务代码
_capBus.Publish("xxx.services.show.time",DateTime.Now);
}
}
returnOk();
}
//EntityFramework中使用事务,自动提交
[Route("~/ef/transaction")]
publicIActionResultEntityFrameworkWithTransaction([FromServices]AppDbContextdbContext)
{
using(vartrans=dbContext.Database.BeginTransaction(_capBus,autoCommit:true))
{
//业务代码
_capBus.Publish("xxx.services.show.time",DateTime.Now);
}
returnOk();
}
}
订阅
Action Method
在 Action 上添加 CapSubscribeAttribute 来订阅相关消息。
publicclassPublishController:Controller
{
[CapSubscribe("xxx.services.show.time")]
publicvoidCheckReceivedMessage(DateTimedatetime)
{
Console.WriteLine(datetime);
}
}
Service Method
如果你的订阅方法没有位于 Controller 中,则你订阅的类需要继承 ICapSubscribe:
namespacexxx.Service
{
publicinterfaceISubscriberService
{
voidCheckReceivedMessage(DateTimedatetime);
}
publicclassSubscriberService:ISubscriberService,ICapSubscribe
{
[CapSubscribe("xxx.services.show.time")]
publicvoidCheckReceivedMessage(DateTimedatetime)
{
}
}
}
项目源码地址
更多项目实用功能和特性欢迎前往项目开源地址查看,别忘了给项目一个Star支持。
GitHub开源地址:https://github.com/dotnetcore/CAP
官方文档:https://cap.dotnetcore.xyz/
优秀项目和框架精选
该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没
)。
https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
DotNetGuide技术社区交流群
- DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目推荐、招聘资讯和解决问题的平台。
- 在这个社区中,开发者们可以分享自己的技术文章、项目经验、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
- 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值和成长机会。
欢迎加入DotNetGuide技术社区微信交流群
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net