亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前言

在分布式系統中,由于各個系統服務之間的獨立性和網絡通信的不確定性,要確保跨系統的事務操作的最終一致性是一項重大的挑戰。今天給大家推薦一個.NET開源的處理分布式事務的解決方案基于 .NET Standard 的 C# 庫:CAP。

CAP項目介紹

CAP 是一個基于 .NET Standard 的 C# 庫,它是一種處理分布式事務的解決方案,同樣具有 EventBus 的功能,它具有輕量級、易使用、高性能等特點。CAP 是一個EventBus,同時也是一個在微服務或者SOA系統中解決分布式事務問題的一個框架。它有助于創建可擴展,可靠并且易于更改的微服務系統。

什么是 EventBus?

事件總線是一種機制,它允許不同的組件彼此通信而不彼此了解。組件可以將事件發送到Eventbus,而無需知道是誰來接聽或有多少其他人來接聽。組件也可以偵聽Eventbus上的事件,而無需知道誰發送了事件。這樣,組件可以相互通信而無需相互依賴。同樣,很容易替換一個組件。只要新組件了解正在發送和接收的事件,其他組件就永遠不會知道。

CAP架構預覽

.NET開源的處理分布式事務的解決方案

CAP支持的存儲

SQL Server、MySQL、PostgreSql、MongoDB、In-Memory Storage。

CAP 支持以下幾種運輸方式

RabbitMQ、Kafka、Azure Service Bus、Amazon SQS、NATS、In-Memory Queue、redis Streams、Apache Pulsar。

怎么選擇運輸器

.NET開源的處理分布式事務的解決方案

項目源碼

.NET開源的處理分布式事務的解決方案

快速開始

安裝DotNetCore.CAP Nuget包

.NET開源的處理分布式事務的解決方案

CAP 支持主流的消息隊列作為傳輸器:

  • 我本地安裝的是DotNetCore.CAP.RabbitMQ。
//你可以按需選擇下面的包進行安裝:
PM> Install-Package DotNetCore.CAP.Kafka
PM> Install-Package DotNetCore.CAP.RabbitMQ
PM> Install-Package DotNetCore.CAP.AzureServiceBus
PM> Install-Package DotNetCore.CAP.AmazonSQS
PM> Install-Package DotNetCore.CAP.NATS
PM> Install-Package DotNetCore.CAP.RedisStreams
PM> Install-Package DotNetCore.CAP.Pulsar

.NET開源的處理分布式事務的解決方案圖片

CAP 提供了主流數據庫作為存儲:

  • 我本地安裝的是DotNetCore.CAP.MongoDB。
// 按需選擇安裝你正在使用的數據庫:
PM> Install-Package DotNetCore.CAP.SqlServer
PM> Install-Package DotNetCore.CAP.MySql
PM> Install-Package DotNetCore.CAP.PostgreSql
PM> Install-Package DotNetCore.CAP.MongoDB

.NET開源的處理分布式事務的解決方案

配置CAP到 Program.cs 文件中,如下:

builder.Services.AddCap(x =>
            {
                //如果你使用的 EF 進行數據操作,你需要添加如下配置:
                //配置數據庫上下文
                x.UseEntityFramework<AppDbContext>();

                //如果你使用的 MongoDB,你可以添加如下配置:
                x.UseMongoDB("ConnectionStrings");  //注意,僅支持MongoDB 4.0+集群

                //CAP RabbitMQ 配置
                x.UseRabbitMQ(rab => {
                    rab.HostName = "192.0.1.1";
                    rab.Password = "123456";
                    rab.Port = 5672;
                    rab.UserName = "123456";
                });
            });

發布

在 Controller 中注入 ICapPublisher 然后使用 ICapPublisher 進行消息發送。

public class PublishController : Controller
{
    private readonly ICapPublisher _capBus;

    public PublishController(ICapPublisher capPublisher)
    {
        _capBus = capPublisher;
    }
    
    //不使用事務
    [Route("~/without/transaction")]
    public IActionResult WithoutTransaction()
    {
        _capBus.Publish("xxx.services.show.time", DateTime.Now);

        // Publish delay message
        _capBus.PublishDelayAsync(TimeSpan.FromSeconds(delaySeconds), "xxx.services.show.time", DateTime.Now);
 
        return Ok();
    }

    //Ado.Net 中使用事務,自動提交
    [Route("~/adonet/transaction")]
    public IActionResult AdonetWithTransaction()
    {
        using (var connection = new MySqlConnection(ConnectionString))
        {
            using (var transaction = connection.BeginTransaction(_capBus, autoCommit: true))
            {
                //業務代碼

                _capBus.Publish("xxx.services.show.time", DateTime.Now);
            }
        }
        return Ok();
    }

    //EntityFramework 中使用事務,自動提交
    [Route("~/ef/transaction")]
    public IActionResult EntityFrameworkWithTransaction([FromServices]AppDbContext dbContext)
    {
        using (var trans = dbContext.Database.BeginTransaction(_capBus, autoCommit: true))
        {
            //業務代碼

            _capBus.Publish("xxx.services.show.time", DateTime.Now);
        }
        return Ok();
    }
}

訂閱

Action Method

在 Action 上添加 CapSubscribeAttribute 來訂閱相關消息。

public class PublishController : Controller
{
    [CapSubscribe("xxx.services.show.time")]
    public void CheckReceivedMessage(DateTime datetime)
    {
        Console.WriteLine(datetime);
    }
}

Service Method

如果你的訂閱方法沒有位于 Controller 中,則你訂閱的類需要繼承 ICapSubscribe:

namespace xxx.Service
{
    public interface ISubscriberService
    {
        void CheckReceivedMessage(DateTime datetime);
    }

    public class SubscriberService: ISubscriberService, ICapSubscribe
    {
        [CapSubscribe("xxx.services.show.time")]
        public void CheckReceivedMessage(DateTime datetime)
        {
        }
    }
}

項目源碼地址

更多項目實用功能和特性歡迎前往項目開源地址查看

分享到:
標簽:NET
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定