1. 程式人生 > >asp.net core整合CAP(分散式事務匯流排)

asp.net core整合CAP(分散式事務匯流排)

一、前言

之前一直有關注楊老闆的部落格,直到今天才嘗試一下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部署,命令如下:

//下載zookeeperdocker pull wurstmeister/zookeeper

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

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

//啟動kafkadocker 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 歡迎加群交流如果您認為這篇文章還不錯或者有所收穫,您可以點選右下角的【推薦】按鈕精神支援,因為這種支援是我繼續寫作,分享的最大動力!

宣告:原創部落格請在轉載時保留原文連結或者在文章開頭加上本人部落格地址,如發現錯誤,歡迎批評指正。凡是轉載於本人的文章,不能設定打賞功能,如有特殊需求請與本人聯絡!

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