文章出處

背景

相信前面幾篇關于微服務的文章也介紹了那么多了,在構建微服務的過程中確實需要這么一個東西,即便不是在構建微服務,那么在構建分布式應用的過程中也會遇到分布式事務的問題,那么 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

根據底層消息隊列,你可以選擇引入不同的包:

// 如果你使用的是 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 支持一下那就太好了。

如果你覺得本篇文章對你有幫助的話,可以關注一下博主,順手點個【推薦】哦。

GitHub stars
GitHub forks


本文地址:http://www.cnblogs.com/savorboard/p/cap.html
作者博客:Savorboard
歡迎轉載,請在明顯位置給出出處及鏈接


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()