最近项目中要用到分布式事务功能,调研了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. Axure 形状交互

  2. 远程桌面CredSSP 加密数据库修正

    如图所示: 远程桌面连接,出现身份验证错误,要求的函数不受支持,这可能是由于 CredSSP 加密数据库修正

  3. python像操作文件一样操作内存的模块 StringIO

    io流(io stream) 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插 ...

  4. 在 Ubuntu 20.04 上安装 Visual Studio Code

    Visual Studio Code 是一个由微软开发的强大的开源代码编辑器.它包含内建的调试支持,嵌入的 Git 版本控制,语法高亮,代码自动完成,集成终端,代码重构以及代码片段功能. Visual ...

  5. Seata是什么?一文了解其实现原理

    一.背景 随着业务发展,单体系统逐渐无法满足业务的需求,分布式架构逐渐成为大型互联网平台首选.伴随而来的问题是,本地事务方案已经无法满足,分布式事务相关规范和框架应运而生. 在这种情况下,大型厂商根据 ...

  6. 【有奖体验】AI 都这么厉害了,可以看图生成文字描述!

    立即体验基于函数计算部署[图生文]一键部署图像描述模型: https://developer.aliyun.com/topic/aigc_fc 人工智能生成内容(Artificial Intellig ...

  7. java进阶(22)--Collection接口

    一.基本概念呢 1.Collection在没有使用泛型之前的,Collection中可存储所有Object所有子类型 使用泛型后,Collection只能存储某个具体类型.   二.collectio ...

  8. Could not get a resource from the pool 异常定位和解决

    最近在服务中经常看到以下错误,进行下定位和问题解决分析: 2023-12-08 00:10:58.248 WARN [terra-sr-server,a9006fd27ccb81d0,a9006fd2 ...

  9. ES 分词器简单应用

    本文为博主原创,未经允许不得转载: 1. ES 分词器 1.1 elasticsearch 默认分词器: standard standard 分词器会将每个英文单词及每个汉字进行单独拆分进行索引 使用 ...

  10. Redis服务端辅助的客户端缓存机制

    一.背景和问题 二.Redis6 的解决方案及原理 2.1 服务端支持客户端缓存的两种模式 1. 默认模式 2. 广播模式 2.2 客户端实现的两种连接模式 1. 使用同一连接 2. 使用不同连接 3 ...