做漫画在线观看网站,网线制作的心得体会,麻涌网站建设,网站开发如何报价单背景
相信前面几篇关于微服务的文章也介绍了那么多了#xff0c;在构建微服务的过程中确实需要这么一个东西#xff0c;即便不是在构建微服务#xff0c;那么在构建分布式应用的过程中也会遇到分布式事务的问题#xff0c;那么 CAP 就是在这样的背景下诞生的。
最初打算做…背景
相信前面几篇关于微服务的文章也介绍了那么多了在构建微服务的过程中确实需要这么一个东西即便不是在构建微服务那么在构建分布式应用的过程中也会遇到分布式事务的问题那么 CAP 就是在这样的背景下诞生的。
最初打算做这个东西是在去年2016年底最初是为了解决分布式系统中的分布式事务的问题然后当时有了一个大概的概念轮廓当时我对于前面两篇文章中关于异步消息和微服务之间通讯还不是太了解只是觉得这样能够解决这一系列的问题然后就着手做了最后发现和这些概念竟然不谋而合。
经过大半年的不断重构以及修改最终 CAP 1.0 版本发布了。作为一个开源项目最初项目是在我的个人Github下然后于上个月已经贡献给了 .NET China Foundation 组织目前该项目由我和 DotNetCore 项目组共同维护。
CAP 介绍
Githubhttps://github.com/dotnetcore/CAP
开源协议MIT
CAP 是一个在分布式系统中SOAMicroService实现事件总线及最终一致性分布式事务的一个开源的 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
根据底层消息队列你可以选择引入不同的包
// 如果你使用的是 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.AddDbContextAppDbContext();services.AddCap(x { // 如果你的 SqlServer 使用的 EF 进行数据操作你需要添加如下配置// 注意: 你不需要再次配置 x.UseSqlServer()x.UseEntityFrameworkAppDbContext(); // 如果你使用的Dapper你需要添加如下配置x.UseSqlServer(数据库连接字符串); // 如果你使用的 RabbitMQ 作为MQ你需要添加如下配置x.UseRabbitMQ(localhost); //如果你使用的 Kafka 作为MQ你需要添加如下配置x.UseKafka(localhost9092);});
}public void Configure(IApplicationBuilder app){..... // 添加 CAPapp.UseCap();
}
发布事件/消息
在 Controller 中注入 ICapPublisher 然后使用 ICapPublisher 进行消息发布:
public class PublishController : Controller{ private readonly ICapPublisher _publisher; public PublishController(ICapPublisher publisher) {_publisher publisher;}[Route(~/checkAccountWithTrans)] public async TaskIActionResult 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.AddTransientISubscriberService,SubscriberService();
}
结束了怎么样是不是很简单
鸣谢
感谢 lan Ye 同学对本项目的英文翻译工作。
感谢 AlexLEWIS 同学对本项目的其他支持。
感谢 .NET China Foundation 团队成员对本项目的支持。
总结
如果你有任何问题都可以去 Github 给我们提交 Issue我们会在第一时间处理。
如果你觉得这个开源项目还不错给个Github Star 支持一下那就太好了。
原文地址http://www.cnblogs.com/savorboard/p/cap.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注