一、前言
感謝楊曉東大佬為社區貢獻的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 歡迎加群交流
如果您認為這篇文章還不錯或者有所收獲,您可以點擊右下角的【推薦】按鈕精神支持,因為這種支持是我繼續寫作,分享的最大動力!
微信公眾號:歡迎關注 QQ技術交流群: 歡迎加群