最近项目中要用到分布式事务功能,调研了DTM和Cap,最终确定用Cap来实现,Cap支持最终一致性,项目中采用MQ作为消息中间件,数据库用的mysql,集成步骤如下:

1、在需要发布消息的服务中引入如下的包,我是放在了api层

    <PackageReference Include="DotNetCore.CAP" Version="5.2.0" />
<PackageReference Include="DotNetCore.CAP.Dashboard" Version="5.2.0" />
<PackageReference Include="DotNetCore.CAP.MySql" Version="5.2.0" />
<PackageReference Include="DotNetCore.CAP.RabbitMQ" Version="5.2.0" />

2、编写Cap扩展服务

public static class CapExtensions
{
public static void AddMyCap(this IServiceCollection services, IConfiguration configuration)
{ services.AddCap(
a => {
a.UseEntityFramework<QualificationDbContext>();
a.UseMySql(configuration.GetConnectionString("Default"));
//仅用于测试,正式使用后要换成可配置项
a.UseRabbitMQ(rb =>
{
rb.HostName = "118.111.111.111";
rb.UserName = "root";
rb.Password = "123456";
rb.Port = 5672;
rb.VirtualHost = "/"; }); // 添加cap后台监控页面(人工处理);页面地址为“/cap”;如:http://www.site.com/cap
a.UseDashboard();
// 配置定时器重试策略
a.FailedRetryInterval = 10; //重试间隔时间(秒),使用默认的就可以,可不用配置
a.FailedRetryCount = 5; //重试次数 }
);
services.AddDbContext<QualificationDbContext>();
}
}

3、在配置文件中增加服务

 context.Services.AddMyCap(configuration);

4、在控制器中注册ICapPublisher类就可以发布消息了

namespace Qualification.Controllers
{
[Route("api/Test")] public class TestController : AbpController
{
private readonly ICapPublisher capPublisher;
public TestController(ICapPublisher _capPublisher)
{
this.capPublisher = _capPublisher;
}
/// <summary>
/// 测试cap功能:创建证照时发布消息,在服务平台进行订阅
/// </summary>
/// <returns></returns>
[HttpPost("CreateQualification")]
public async Task<IActionResult> CreateQualification()
{
try
{
this.capPublisher.Publish<CreateQualificationCapDto>("Qualification.Create.Success", new CreateQualificationCapDto { Name = "Qualification", Count = 10 });
return Ok("创建产品证照成功");
}
catch (Exception ex)
{ throw;
} }
} public class CreateQualificationCapDto
{
public string Name { get; set; }
public int Count { get; set; }
}
}

3、在订阅的程序b中同样引用cap的依赖包

4、同样写Cap服务的扩展程序,和服务a是一样的,这里就不再重复了

5、在订阅服务类中继承ICapSubscribe,因为我是用的ABP框架,所以继承了ITransientDependency接口,为了是注入服务实体,如果你不是用这个框架,请在手动注入服务:services.AddSingleton<Controllers.CapSubscribeService>();否则,订阅不到数据。

public interface ICapSubscribeService
{
public void UpdateOrder(CreateQualificationCapDto createQualification);
} public class CapSubscribeService : ICapSubscribeService, ICapSubscribe, ITransientDependency
{
[CapSubscribe("Qualification.Create.Success")]
public void UpdateOrder(CreateQualificationCapDto createQualification)
{
var data = createQualification;
}
} public class CreateQualificationCapDto
{
public string Name { get; set; }
public int Count { get; set; }
}

6、同时启动两个系统数据库中会自动生成两个表

7、服务a中发布一个消息后在服务b中会自动订阅到

8、系统为我们默认生成了交换机和队列,并且可以查看到发了信息

9、后续还会加上发布消息时与业务代码处理放在一个事务中,发布与订阅错误时回调方法。

ABP vNext系列文章10---分布式事务集成netcore.Cap的更多相关文章

  1. ABP vNext系列文章03---依赖注入

    一.依赖注入的类型注册 ABP的依赖注入系统是基于Microsoft的依赖注入扩展库(Microsoft.Extensions.DependencyInjection nuget包)开发的.因此,它的 ...

  2. 分布式事务框架.NetCore CAP总结

    来自CAP原作者yang-xiaodong的原理图: 本文撰写者:cmliu,部分内容引用自官方文档,部分内容待更新# .NetCore CAP # 1,简介 CAP 是一个遵循 .NET Stand ...

  3. 2019 年起如何开始学习 ABP 框架系列文章-开篇有益

    2019 年起如何开始学习 ABP 框架系列文章-开篇有益 [[TOC]] 本系列文章推荐阅读地址为:52ABP 开发文档 https://www.52abp.com/Wiki/52abp/lates ...

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

    [转].NET Core 事件总线,分布式事务解决方案:CAP 背景 相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用 ...

  5. 【转】分布式事务,EventBus 解决方案:CAP【中文文档】

    [转]分布式事务,EventBus 解决方案:CAP[中文文档] 最新文档地址:https://github.com/dotnetcore/CAP/wiki 前言 很多同学想对CAP的机制以及用法等想 ...

  6. Dubbo学习系列之八(分布式事务之MQ方案)

    自从小王玩起了微服务,发现微服务果然很强大,好处真是太多,心中暗喜,然而,却也遇到了分布式中最棘手的问题:分布式事务.小王遍访各路神仙,也无个完美开源解决方案,当然,也有些实际可行的手法,虽不算完美, ...

  7. ABP入门系列(10)——扩展AbpSession

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 一.AbpSession是Session吗? 1.首先来看看它们分别对应的类型是什么? 查看源码发 ...

  8. ABP vNext EventBus For RabbitMQ 分布式事件总线使用注意事项_补充官网文档

    [https://docs.abp.io/zh-Hans/abp/latest/Distributed-Event-Bus-RabbitMQ-Integration](ABP vNext官方文档链接) ...

  9. 分布式事务最终一致性-CAP框架轻松搞定

    前言 对于分布式事务,常用的解决方案根据一致性的程度可以进行如下划分: 强一致性(2PC.3PC):数据库层面的实现,通过锁定资源,牺牲可用性,保证数据的强一致性,效率相对比较低. 弱一致性(TCC) ...

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

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

随机推荐

  1. Mac 复制文件名目录路径

    Mac快速复制文件路径 在Mac电脑上,我们经常需要复制文件的路径,其实,Mac系统提供了快速复制文件路径的方法.下面我们来详细介绍. 方法一:使用菜单栏 首先,打开Finder,然后选择你要复制路径 ...

  2. module 'numpy' has no attribute 'int'.

    原因:np.int 在 NumPy 1.20 中已弃用,在 NumPy 1.24 中已删除 AttributeError: module 'numpy' has no attribute 'int'. ...

  3. Hyper-V CentOS Linux 硬盘扩容

    同一物理盘进行扩容(非挂载),首先在虚机内将硬盘空间扩大, Hyper-V 需要将检查点删除 查看物理卷和卷组,并将物理卷加入到卷组 #将剩余空间添加到逻辑卷 /dev/centos/root lve ...

  4. 用Python自动清理系统垃圾,再也不用360安全卫士了

    用Python自动清理系统垃圾,再也不用360安全卫士了 在Windows在安装和使用过程中都会产生相当多的垃圾文件,包括临时文件(如:.tmp.._mp)日志文件(.log).临时帮助文件(.gid ...

  5. Vue框架基础

    博客目录 前端发展介绍 Vue的快速使用 插值语法 指令系统之文本指令.事件指令.属性指令 style和class 条件渲染 列表渲染 使用v-for进行循环 监控失效 双向数据绑定 input输入框 ...

  6. Q查询进阶操作 ORM查询优化 only与defer select_related与prefetch_related ORM事务 ORM常用字段类型 ORM常用字段参数

    目录 Q查询进阶操作 children.append 图书查询功能 ORM查询优化 惰性查询 自动分页 limit only与defer only defer select_related与prefe ...

  7. SpringCloud学习 系列十、服务熔断与降级(1-简介)

    系列导航 SpringCloud学习 系列一. 前言-为什么要学习微服务 SpringCloud学习 系列二. 简介 SpringCloud学习 系列三. 创建一个没有使用springCloud的服务 ...

  8. 4、SpringBoot连接数据库引入druid

    系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...

  9. <vue 组件 1、组件化基本使用>

    代码结构 组件就是将复杂的功能拆分成简单的块,拆分后的块可以被多处使用. 组件的使用分成三个步骤: 1.创建组件构造器     Vue.extend() 2.注册组件               Vu ...

  10. 洛谷 P9916 「RiOI-03」Just a Q. (Easy ver.) 题解

    前言 Div.2 Rank \(13\) 获奖了,题目也好评. 解法 题目链接:\(\color{Purple}\texttt{P9916「RiOI-03」Just a Q. (Easy ver.)} ...