asp.net core集成CAP(分布式事務總線)


一、前言


感謝楊曉東大佬為社區貢獻的CAP開源項目,傳送門在此:.NET Core 事件總線,分布式事務解決方案:CAP 以及 如何在你的項目中集成 CAP【手把手視頻教程】,之前也在工作中遇到分布式數據一致性的問題,也一直都是基於CAP理論和Base。

之前一直有關注楊老板的博客,直到今天才嘗試一下CAP,發現好用,非常的棒,特此把CAP以組件化的方式引入到我的框架中。

二、CAP介紹


針對CAP介紹可以參考上面給出的兩個鏈接。在此我只簡單的說明一下:

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 系統進行無縫結合,並且能夠和你的業務代碼集成支持強一致性的事務處理。

 

三、asp.net core集成CAP


 由於我的框架是DDD六邊形架構,為了解耦方便,我針對外部的工具都是以組件化的方式引入到項目中,即新建了一個CAP類庫。

 

第一步:擴展了Startup類中的IServiceCollection,在CAP中我加入了Consul的注冊,如下圖:

public static void AddCAPConfigure(this IServiceCollection services, IConfiguration configuration)
        {
            services.AddCap(x =>
            {
                //使用Dapper ORM
                x.UseMySql(configuration.GetConnectionString("DBConnection"));

                //使用kafka 進行日志、case的消息推送
                //需要配置一下MQ地址,kafka放在linux系統上,不建議放在window上
                x.UseKafka(configuration["KafkaConfig"]);
                x.UseDashboard();//得到UI界面
                //注冊服務發現
                x.UseDiscovery(d =>
                {
                    d.DiscoveryServerHostName = "192.168.161.163";
                    d.DiscoveryServerPort = 8500;
                    d.CurrentNodeHostName = "localhost";
                    d.CurrentNodePort = 64616;
                    d.NodeName = "CAP No.1 Node";
                });
            });
        }

 

我用的是mysql數據庫,以及使用kafka消息隊列,這邊要注意,kafka最好部署在linux系統上,在windows系統會存在很多的坑,如果你覺得你的天坑能力強,可以嘗試一下。

我這邊也集成了 Consul服務注冊,如果大家對cosnul感謝的興趣的可以看我的另外一篇文章:實戰中的asp.net core結合Consul集群&Docker實現服務治理 里面有講解了consul集群部署。

 

好了然后我在我的主項目中配置一下,就開始用吧:

#region 配置CAP
            services.AddCAPConfigure(Configuration);
#endregion

 

 

第二步:在asp.net core webapi項目中新建一個控制器

配置如下:

[Route("api/[controller]/[action]")]
    public class ValuesController : Controller
    {
        private readonly ICapPublisher _capBus;
        public ValuesController(ICapPublisher capPublisher)
        {
            _capBus = capPublisher;
        }
        [HttpGet]
        public IActionResult Get()
        {
            _capBus.Publish("show.time", DateTime.Now);
            return Ok();
        }
        [HttpGet]
        [CapSubscribe("show.time")]
        public void CheckReceiveMessage(DateTime time)
        {
            Console.WriteLine(time.AddDays(1));
        }
    }

 

此處的mysql配置大家可自行補充,或者按照 @Savorboard  給出的demo操作即可。

 

第三步:部署一下kafka。

我在centos服務器上采用docker部署,命令如下:

//下載zookeeper
docker pull wurstmeister/zookeeper

//下載kafka
docker pull wurstmeister/kafka:2.11-0.11.0.3

 

//啟動zookeeper
docker run -d --name zookeeper --publish 2181:2181 --volume /etc/localtime:/etc/localtime wurstmeister/zookeeper

//啟動kafka
docker run -d --name kafka --publish 9092:9092 \
--link zookeeper \
--env KAFKA_ZOOKEEPER_CONNECT=192.168.161.163:2181 \
--env KAFKA_ADVERTISED_HOST_NAME=192.168.161.163 \
--env KAFKA_ADVERTISED_PORT=9092 \
--volume /etc/localtime:/etc/localtime \
wurstmeister/kafka:2.11-0.11.0.3

 

部署完畢后就進入下一步運行啦。

第四步:運行項目,運行成功后,我嗯可以在數據庫中發現cap會自動在數據庫中創建兩張表,一張是 發布信息表、一張是接收信息表。

 

 表:

 

 

發現 表中有數據存在:

數據體現法發送接收成功。

 

 

我們再來看看cap有提供的UI界面,發現里面有一個我們用consul注冊的服務器。完美實現。

我們看一下consul集群:

 

 

四、總結

 歡迎大家積極嘗試CAP,我也會在后續的項目中采用CAP,希望我們的社區越來越強大。


 

asp.net Core 交流群:787464275 歡迎加群交流
如果您認為這篇文章還不錯或者有所收獲,您可以點擊右下角的【推薦】按鈕精神支持,因為這種支持是我繼續寫作,分享的最大動力!

作者:LouieGuo
聲明:原創博客請在轉載時保留原文鏈接或者在文章開頭加上本人博客地址,如發現錯誤,歡迎批評指正。凡是轉載於本人的文章,不能設置打賞功能,如有特殊需求請與本人聯系!

微信公眾號:歡迎關注                                                 QQ技術交流群: 歡迎加群

                


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM