.NET开源的处理分布式事务的解决方案
<h2 data-tool="mdnice编辑器">前言</h2><p data-tool="mdnice编辑器">在分布式系统中,由于各个系统服务之间的独立性和网络通信的不确定性,要确保跨系统的事务操作的最终一致性是一项重大的挑战。今天给大家推荐一个.NET开源的处理分布式事务的解决方案基于 .NET Standard 的 C# 库:CAP。</p>
<h2 data-tool="mdnice编辑器">CAP项目介绍</h2>
<p data-tool="mdnice编辑器">CAP 是一个基于 .NET Standard 的 C# 库,它是一种处理分布式事务的解决方案,同样具有 EventBus 的功能,它具有轻量级、易使用、高性能等特点。CAP 是一个EventBus,同时也是一个在微服务或者SOA系统中解决分布式事务问题的一个框架。它有助于创建可扩展,可靠并且易于更改的微服务系统。</p>
<h2 data-tool="mdnice编辑器">什么是 EventBus?</h2>
<p data-tool="mdnice编辑器">事件总线是一种机制,它允许不同的组件彼此通信而不彼此了解。组件可以将事件发送到Eventbus,而无需知道是谁来接听或有多少其他人来接听。组件也可以侦听Eventbus上的事件,而无需知道谁发送了事件。这样,组件可以相互通信而无需相互依赖。同样,很容易替换一个组件。只要新组件了解正在发送和接收的事件,其他组件就永远不会知道。</p>
<h2 data-tool="mdnice编辑器">CAP架构预览</h2>
<div>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202311/1336199-20231130200323299-1549620648.png" alt="" loading="lazy"></p>
<h2 data-tool="mdnice编辑器">CAP支持的存储</h2>
<p data-tool="mdnice编辑器">SQL Server、MySQL、PostgreSql、MongoDB、In-Memory Storage。</p>
<h2 data-tool="mdnice编辑器">CAP 支持以下几种运输方式</h2>
<p data-tool="mdnice编辑器">RabbitMQ、Kafka、Azure Service Bus、Amazon SQS、NATS、In-Memory Queue、Redis Streams、Apache Pulsar。</p>
<h3 data-tool="mdnice编辑器">怎么选择运输器</h3>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202311/1336199-20231130200347236-531333063.png" alt="" loading="lazy"></p>
<h2 data-tool="mdnice编辑器">项目源码</h2>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202311/1336199-20231130200358407-1930690259.png" alt="" loading="lazy"></p>
<h2 data-tool="mdnice编辑器">快速开始</h2>
<h3 data-tool="mdnice编辑器">安装DotNetCore.CAP Nuget包</h3>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202311/1336199-20231130200412350-1214394356.png" alt="" loading="lazy"></p>
<h3 data-tool="mdnice编辑器">CAP 支持主流的消息队列作为传输器:</h3>
<blockquote>
<p>我本地安装的是DotNetCore.CAP.RabbitMQ。</p>
</blockquote>
<pre data-tool="mdnice编辑器"><code>//你可以按需选择下面的包进行安装:<br>PM> Install-Package DotNetCore.CAP.Kafka<br>PM> Install-Package DotNetCore.CAP.RabbitMQ<br>PM> Install-Package DotNetCore.CAP.AzureServiceBus<br>PM> Install-Package DotNetCore.CAP.AmazonSQS<br>PM> Install-Package DotNetCore.CAP.NATS<br>PM> Install-Package DotNetCore.CAP.RedisStreams<br>PM> Install-Package DotNetCore.CAP.Pulsar</code></pre>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202311/1336199-20231130200433605-69133440.png" alt="" loading="lazy"></p>
<h3 data-tool="mdnice编辑器">CAP 提供了主流数据库作为存储:</h3>
<blockquote>
<p>我本地安装的是DotNetCore.CAP.MongoDB。</p>
</blockquote>
<pre data-tool="mdnice编辑器"><code>// 按需选择安装你正在使用的数据库:<br>PM> Install-Package DotNetCore.CAP.SqlServer<br>PM> Install-Package DotNetCore.CAP.MySql<br>PM> Install-Package DotNetCore.CAP.PostgreSql<br>PM> Install-Package DotNetCore.CAP.MongoDB</code></pre>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202311/1336199-20231130200446841-1489130209.png" alt="" loading="lazy"></p>
<h3 data-tool="mdnice编辑器">配置CAP到 Program.cs 文件中,如下:</h3>
<pre data-tool="mdnice编辑器"><code> builder.Services.AddCap(x =><br> {<br> //如果你使用的 EF 进行数据操作,你需要添加如下配置:<br> //配置数据库上下文<br> x.UseEntityFramework<AppDbContext>();<br><br> //如果你使用的 MongoDB,你可以添加如下配置:<br> x.UseMongoDB("ConnectionStrings"); //注意,仅支持MongoDB 4.0+集群<br><br> //CAP RabbitMQ 配置<br> x.UseRabbitMQ(rab => {<br> rab.HostName = "192.0.1.1";<br> rab.Password = "123456";<br> rab.Port = 5672;<br> rab.UserName = "123456";<br> });<br> });<br></code></pre>
<h3 data-tool="mdnice编辑器">发布</h3>
<p data-tool="mdnice编辑器">在 Controller 中注入 ICapPublisher 然后使用 ICapPublisher 进行消息发送。</p>
<pre data-tool="mdnice编辑器"><code>public class PublishController : Controller<br>{<br> private readonly ICapPublisher _capBus;<br><br> public PublishController(ICapPublisher capPublisher)<br> {<br> _capBus = capPublisher;<br> }<br> <br> //不使用事务<br> <br> public IActionResult WithoutTransaction()<br> {<br> _capBus.Publish("xxx.services.show.time", DateTime.Now);<br><br> // Publish delay message<br> _capBus.PublishDelayAsync(TimeSpan.FromSeconds(delaySeconds), "xxx.services.show.time", DateTime.Now);<br> <br> return Ok();<br> }<br><br> //Ado.Net 中使用事务,自动提交<br> <br> public IActionResult AdonetWithTransaction()<br> {<br> using (var connection = new MySqlConnection(ConnectionString))<br> {<br> using (var transaction = connection.BeginTransaction(_capBus, autoCommit: true))<br> {<br> //业务代码<br><br> _capBus.Publish("xxx.services.show.time", DateTime.Now);<br> }<br> }<br> return Ok();<br> }<br><br> //EntityFramework 中使用事务,自动提交<br> <br> public IActionResult EntityFrameworkWithTransaction(AppDbContext dbContext)<br> {<br> using (var trans = dbContext.Database.BeginTransaction(_capBus, autoCommit: true))<br> {<br> //业务代码<br><br> _capBus.Publish("xxx.services.show.time", DateTime.Now);<br> }<br> return Ok();<br> }<br>}<br></code></pre>
<h3 data-tool="mdnice编辑器">订阅</h3>
<h4 data-tool="mdnice编辑器">Action Method</h4>
<p data-tool="mdnice编辑器">在 Action 上添加 CapSubscribeAttribute 来订阅相关消息。</p>
<pre data-tool="mdnice编辑器"><code>public class PublishController : Controller<br>{<br> <br> public void CheckReceivedMessage(DateTime datetime)<br> {<br> Console.WriteLine(datetime);<br> }<br>}<br></code></pre>
<h4 data-tool="mdnice编辑器">Service Method</h4>
<p data-tool="mdnice编辑器">如果你的订阅方法没有位于 Controller 中,则你订阅的类需要继承 ICapSubscribe:</p>
<pre data-tool="mdnice编辑器"><code><br>namespace xxx.Service<br>{<br> public interface ISubscriberService<br> {<br> void CheckReceivedMessage(DateTime datetime);<br> }<br><br> public class SubscriberService: ISubscriberService, ICapSubscribe<br> {<br> <br> public void CheckReceivedMessage(DateTime datetime)<br> {<br> }<br> }<br>}</code></pre>
<h2 data-tool="mdnice编辑器">项目源码地址</h2>
<p data-tool="mdnice编辑器"><strong>更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。</strong></p>
<blockquote>
<p>GitHub开源地址:https://github.com/dotnetcore/CAP</p>
<p>官方文档:https://cap.dotnetcore.xyz/</p>
</blockquote>
<h2 data-tool="mdnice编辑器">优秀项目和框架精选</h2>
<p data-tool="mdnice编辑器">该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(<code>让优秀的项目和框架不被埋没🤞</code>)。</p>
<blockquote>
<p>https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md</p>
</blockquote>
<h2 id="activity-name" class="rich_media_title ">DotNetGuide技术社区交流群</h2>
<ul>
<li>DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目推荐、招聘资讯和解决问题的平台。</li>
<li>在这个社区中,开发者们可以分享自己的技术文章、项目经验、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。</li>
<li>我们致力于构建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值和成长机会。</li>
</ul>
<blockquote>
<p id="activity-name" class="rich_media_title "><strong>欢迎加入DotNetGuide技术社区微信交流群👪</strong></p>
</blockquote>
</div>
</div>
<div id="MySignature" role="contentinfo">
<blockquote >
<p style='font-family:YouYuan;font-size: 16px;margin: 0 auto 0.01em auto;'><span style='font-size: 17px; '>作者名称:</span>追逐时光者</p>
<p style='font-family:YouYuan;font-size: 16px;margin: 0 auto 0.01em auto;'><span style='font-size: 17px; '>作者简介:</span>一个热爱编程、善于分享、喜欢学习、探索、尝试新事物和新技术的全栈软件工程师。</p>
<p style='font-family:YouYuan;font-size: 16px;margin: 0 auto 0.01em auto;'>
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如果该篇文章对您有帮助的话,可以点一下右下角的【♥推荐♥】,希望能够持续的为大家带来好的技术文章,文中可能存在描述不正确的地方,欢迎指正或补充,不胜感激。
</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/Can-daydayup/p/17868155.html
頁:
[1]