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

背景

相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用的过程中也会遇到分布式事务的问题,那么 CAP 就是在这样的背景下诞生的。

最初打算做这个东西是在去年(2016)年底,最初是为了解决分布式系统中的分布式事务的问题,然后当时有了一个大概的概念轮廓,当时我对于前面两篇文章中关于异步消息和微服务之间通讯还不是太了解,只是觉得这样能够解决这一系列的问题,然后就着手做了,最后发现和这些概念竟然不谋而合。

经过大半年的不断重构以及修改,最终 CAP 1.0 版本发布了。作为一个开源项目,最初项目是在我的个人Github下,然后于上个月已经贡献给了 .NET China Foundation 组织,目前该项目由我和 DotNetCore 项目组共同维护。

CAP 介绍

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

开源协议:MIT

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 系统进行无缝结合,并且能够和你的业务代码集成支持强一致性的事务处理。

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.AddDbContext<AppDbContext>();services.AddCap(x =>{        // 如果你的 SqlServer 使用的 EF 进行数据操作,你需要添加如下配置:// 注意: 你不需要再次配置 x.UseSqlServer(""")x.UseEntityFramework<AppDbContext>();        // 如果你使用的Dapper,你需要添加如下配置:x.UseSqlServer("数据库连接字符串");    // 如果你使用的 RabbitMQ 作为MQ,你需要添加如下配置:x.UseRabbitMQ("localhost");    //如果你使用的 Kafka 作为MQ,你需要添加如下配置:x.UseKafka("localhost:9092");});
}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 Task<IActionResult> 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.AddTransient<ISubscriberService,SubscriberService>();
}

结束了,怎么样,是不是很简单?

鸣谢

感谢 lan Ye 同学对本项目的英文翻译工作。

感谢 AlexLEWIS 同学对本项目的其他支持。

感谢 .NET China Foundation 团队成员对本项目的支持。

总结

如果你有任何问题,都可以去 Github 给我们提交 Issue,我们会在第一时间处理。

如果你觉得这个开源项目还不错,给个Github Star 支持一下那就太好了。

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


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dubbo小项目2

1、项目结构搭建 父项目pom.xml <?xml version"1.0" encoding"UTF-8"?>-<project xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi"http://www.w3.org/2001/XM…

Java中的TreeSet集合会自动将元素升序排序

我们都知道&#xff0c;java中的集合可以分为这么两大类&#xff1a;Collection和Map &#xff0c;其中Collection 接口中又可以派生出来两个接口&#xff0c;分别为&#xff1a;List和Set接口。其中&#xff0c;Set下有HashSet&#xff0c;LinkedHashSet&#xff0c;TreeSet&a…

面试时如何介绍自己的项目经验

转载自 面试时如何介绍自己的项目经验 在面试时&#xff0c;经过寒暄后&#xff0c;一般面试官会让介绍项目经验 。常见的问法是&#xff0c;说下你最近的&#xff08;或最拿得出手的&#xff09;一个项目。 根据我们的面试经验&#xff0c;发现有不少候选人对此没准备&…

【2018.3.31】模拟赛之二-ssl2407 负进制【贪心】

正题 大意 将二进制从右到左的权值改为&#xff1a; 1,-2,4,-8,16,-32,64… 然后给出一个数用二进制表达出来&#xff0c;如&#xff1a; −131101111(−32)116141(−2)11−131101111(−32)116141(−2)11解题思路 注意&#xff1a;这不是最优解。 比赛的时候就一直在想用贪…

jsp中使用cookie时报错……

今天在看jsp中的cookie时&#xff0c;遇到一个比较麻烦的问题。关键代码如下&#xff1a;登录页面&#xff1a;login.jsp<form action"doLogin.jsp" method"post">用户名&#xff1a;<input type"text" name"sname" /><…

FastDFS(分布式文件系统)

Tracker&#xff1a;标准服务端口22122、HTTP端口8080 Storage&#xff1a;标准服务端口23000、HTTP端口8888 文章目录一、架构二、文件上传、下载、删除1 时序图2 流程说明3 代码实现一、架构 架构图&#xff1a; Client&#xff1a;客户端。使用java语言编写的项目属于客户…

微服务中的异步消息通讯

前言 在上一篇文章中&#xff0c;我们说到了异步消息通讯&#xff0c;下面这篇文章呢&#xff0c;大部分内容是翻译来自于这篇微软的文章&#xff0c;所以其内容还是具有一定的理论指导意义的。 当我们跨多个微服务进行内部通讯的时候&#xff0c;异步消息和事件驱动至关重要…

10 道关于 Java 泛型的面试题

转载自 10 道关于 Java 泛型的面试题 1.Java中的泛型是什么 ? 使用泛型的好处是什么? 这是在各种Java泛型面试中&#xff0c;一开场你就会被问到的问题中的一个&#xff0c;主要集中在初级和中级面试中。那些拥有Java1.4或更早版本的开发背景的人都知道&#xff0c;在集合…

【2018.3.31】模拟赛之三-ssl2408 比萨【搜索,dfs】

正题 大意 有t种配料&#xff0c;有n种限制。限制就是几种配料不能同时使用&#xff08;可能有多种&#xff09;。求方案数 解题思路 暴力搜索能过 代码 #include<cstdio> using namespace std; int n,t,k[53],a[53][21],v[21],s; bool flag; void dfs(int dep,int x)…

CSS3的几个变形案例……

大家好&#xff0c;欢迎来到雄雄的小课堂&#xff0c;那个……辣椒酱很好吃的&#xff0c;哈哈哈哈&#xff01;今天给大家分享的内容是利用CSS制作网页的动画。辣椒酱&#xff1a;自从有了这款辣椒酱&#xff0c;拌饭再也不用老干妈CSS变形CSS的变形包括这么几种效果&#xff…

图片管理应用

文章目录一、简介二、父项目三、图片管理服务的数据库设计四、定义module &#xff1a; img_pojo五、定义module &#xff1a; img_mapper六、定义module &#xff1a; img_service_api七、module &#xff1a; img_service_provider八、 定义module &#xff1a; imp_service_…

我眼中的ASP.NET Core之微服务

前言 前几天在博客园看到有园友在分享关于微软的一个微服务架构的示例程序&#xff0c;想必大家都已经知道了&#xff0c;那就是eShopOnContainers。 我们先不看项目的后缀名称 OnXXX &#xff0c;因为除了 OnContainers 还有 OnAzure&#xff0c;OnWeb&#xff0c;OnKuberne…

形象的解释神经网络激活函数的作用是什么

转载自 形象的解释神经网络激活函数的作用是什么 神经网络中激活函数的作用 查阅资料和学习&#xff0c;大家对神经网络中激活函数的作用主要集中下面这个观点&#xff1a; 激活函数是用来加入非线性因素的&#xff0c;解决性模型所不能解决的问题。 下面我分别从这个方面…

【2018.3.31】模拟赛之四-ssl2408 句子【dp,字符串】

正题 大意 先给出n个句子&#xff0c;然后给出一个最终句子。最终句子由多个句子加密后组成&#xff08;可能重复&#xff09;。加密方法就是将字母调换位置&#xff0c;加密代价就是该位置与原来的字母不同的数量。求达到最终句子的最小加密代价 解题思路 用f[i]f[i]表示最终…

CSS3中的动画示例

大家好&#xff0c;欢迎来到雄雄的小课堂&#xff0c;上一期我们分享了几个CSS变形案例&#xff0c;大家还记得有哪几个吗&#xff1f;原文在这里&#xff1a;CSS3的几个变形案例……今天&#xff0c;我们来看看CSS的过渡&#xff1a;过渡简单的来讲&#xff0c;就是元素由一种…

ASP.NET Core之跨平台的实时性能监控(2.健康检查)

前言 上篇我们讲了《如何使用App Metrics 做一个简单的APM监控》,最后提到过健康检查这个东西. 这篇主要就是讲解健康检查的内容. 没看过上篇的,请移步:ASP.NET Core之跨平台的实时性能监控 首先我们来了解一下什么是健康检查(health checks)? 1.什么是健康检查? 健康检查…

​通俗理解神经网络BP反向传播算法

转载自 ​通俗理解神经网络BP反向传播算法 通俗理解神经网络BP反向传播算法 在学习深度学习相关知识&#xff0c;无疑都是从神经网络开始入手&#xff0c;在神经网络对参数的学习算法bp算法&#xff0c;接触了很多次&#xff0c;每一次查找资料学习&#xff0c;都有着似懂非…

ssl初一组周六模拟赛【2018.3.31】

前言 先说一下成绩&#xff1a; 姓名成绩hjq300wyc(本人千年老二)270zyc260xjq240lw223xxy220lrz200hzb200 正题 题目1&#xff1a;ssl2406 约数【水题】 水题 链接&#xff1a; https://blog.csdn.net/mr_wuyongcong/article/details/79768338 题目2&#xff1a;ssl2407 …

CSS动画示例(上一篇是CSS过渡…)

大家好&#xff0c;欢迎来到雄雄的小课堂&#xff0c;前面&#xff0c;我们将CSS的变形和过渡都整理了&#xff0c;有需要的可以移步这里看&#xff1a;CSS3中的动画示例CSS3的几个变形案例……今天&#xff0c;我们来看看CSS3的动画。CSS3使用动画分为两个步骤&#xff1a;1.通…

Health Check in eShop -- 解析微软微服务架构Demo(五)

引言 What is the Health Check Health Check&#xff08;健康状态检查&#xff09;不仅是对自己应用程序内部检测各个项目之间的健康状态&#xff08;各项目的运行情况、项目之间的连接情况等&#xff09;&#xff0c;还包括了应用程序对外部或者第三方依赖库的状态检测。 W…