日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET Core 事件总线,分布式事务解决方案:CAP

發(fā)布時間:2023/12/4 asp.net 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core 事件总线,分布式事务解决方案:CAP 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

背景

相信前面幾篇關(guān)于微服務(wù)的文章也介紹了那么多了,在構(gòu)建微服務(wù)的過程中確實需要這么一個東西,即便不是在構(gòu)建微服務(wù),那么在構(gòu)建分布式應(yīng)用的過程中也會遇到分布式事務(wù)的問題,那么 CAP 就是在這樣的背景下誕生的。

最初打算做這個東西是在去年(2016)年底,最初是為了解決分布式系統(tǒng)中的分布式事務(wù)的問題,然后當(dāng)時有了一個大概的概念輪廓,當(dāng)時我對于前面兩篇文章中關(guān)于異步消息和微服務(wù)之間通訊還不是太了解,只是覺得這樣能夠解決這一系列的問題,然后就著手做了,最后發(fā)現(xiàn)和這些概念竟然不謀而合。

經(jīng)過大半年的不斷重構(gòu)以及修改,最終 CAP 1.0 版本發(fā)布了。作為一個開源項目,最初項目是在我的個人Github下,然后于上個月已經(jīng)貢獻(xiàn)給了?.NET China Foundation?組織,目前該項目由我和 DotNetCore 項目組共同維護(hù)。

CAP 介紹

Github:https://github.com/dotnetcore/CAP

開源協(xié)議:MIT

CAP 是一個在分布式系統(tǒng)中(SOA,MicroService)實現(xiàn)事件總線及最終一致性(分布式事務(wù))的一個開源的 C# 庫,她具有輕量級,高性能,易使用等特點。

你可以輕松的在基于 .NET Core 技術(shù)的分布式系統(tǒng)中引入CAP,包括但限于 ASP.NET Core 和 ASP.NET Core on .NET Framework。

CAP 以 NuGet 包的形式提供,對項目無任何入侵,你仍然可以以你喜愛的方式來構(gòu)建分布式系統(tǒng)。

CAP 具有 Event Bus 的所有功能,并且CAP提供了更加簡化的方式來處理EventBus中的發(fā)布/訂閱。

CAP 具有消息持久化的功能,也就是當(dāng)你的服務(wù)進(jìn)行重啟或者宕機(jī)時,她可以保證消息的可靠性。

CAP 實現(xiàn)了分布式事務(wù)中的最終一致性,你不用再去處理這些瑣碎的細(xì)節(jié)。

CAP 提供了基于 Microsoft DI 的 API 服務(wù),她可以和你的 ASP.NET Core 系統(tǒng)進(jìn)行無縫結(jié)合,并且能夠和你的業(yè)務(wù)代碼集成支持強(qiáng)一致性的事務(wù)處理。

CAP 是開源免費(fèi)的。CAP基于MIT協(xié)議開源,你可以免費(fèi)的在你的私人或者商業(yè)項目中使用,不會有人向你收取任何費(fèi)用。

Getting Started

目前, CAP 同時支持使用 RabbitMQ 或 Kafka 進(jìn)行底層之間的消息發(fā)送,你不需要具備 RabbitMQ 或者 Kafka 的使用經(jīng)驗,仍然可以輕松的集成到項目中。

CAP 目前支持使用 MS Sql Server 數(shù)據(jù)庫的項目,其他數(shù)據(jù)庫正在支持中...

CAP 同時支持使用 EntityFrameworkCore 和 Dapper 的項目,你可以根據(jù)需要選擇不同的配置方式。

下面是CAP在系統(tǒng)中的一個不完全示意圖:

圖中實線部分代表用戶代碼,虛線部分代表CAP內(nèi)部實現(xiàn)。

下面,我們看一下 CAP 怎么集成到項目中:

Step 1:

你可以運(yùn)行下面的命令來安裝CAP NuGet 包:

PM> Install-Package DotNetCore.CAP

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

// 如果你使用的是 KafkaPM> Install-Package DotNetCore.CAP.Kafka// 如果你使用的是 RabbitMQPM> 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 進(jìn)行數(shù)據(jù)操作,你需要添加如下配置:// 注意: 你不需要再次配置 x.UseSqlServer(""")x.UseEntityFramework<AppDbContext>(); ? ? ? ?// 如果你使用的Dapper,你需要添加如下配置:x.UseSqlServer("數(shù)據(jù)庫連接字符串"); ? ?// 如果你使用的 RabbitMQ 作為MQ,你需要添加如下配置:x.UseRabbitMQ("localhost"); ? ?//如果你使用的 Kafka 作為MQ,你需要添加如下配置:x.UseKafka("localhost:9092");}); }public void Configure(IApplicationBuilder app){..... ? ?// 添加 CAPapp.UseCap(); }

發(fā)布事件/消息

在 Controller 中注入?ICapPublisher?然后使用?ICapPublisher?進(jìn)行消息發(fā)布:

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()){ ? ? ? ? ? ?//指定發(fā)送的消息標(biāo)題(供訂閱)和內(nèi)容await _publisher.PublishAsync("xxx.services.account.check", ? ? ? ? ? ? ? ?new Person { Name = "Foo", Age = 11 }); ? ? ? ? ? ?// 你的業(yè)務(wù)代碼。trans.Commit();} ? ? ? ?return Ok();} }

訂閱事件/消息

在?Controller?中:
如果是在Controller中,直接添加[CapSubscribe("")]?來訂閱相關(guān)消息。

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("")]標(biāo)記:

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>(); }

結(jié)束了,怎么樣,是不是很簡單?

鳴謝

感謝?lan Ye?同學(xué)對本項目的英文翻譯工作。

感謝?AlexLEWIS?同學(xué)對本項目的其他支持。

感謝?.NET China Foundation?團(tuán)隊成員對本項目的支持。

總結(jié)

如果你有任何問題,都可以去 Github 給我們提交 Issue,我們會在第一時間處理。

如果你覺得這個開源項目還不錯,給個Github Star 支持一下那就太好了。

原文地址:http://www.cnblogs.com/savorboard/p/cap.html


.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的.NET Core 事件总线,分布式事务解决方案:CAP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。