ABP vNext系列文章10---分布式事务集成netcore.Cap
最近项目中要用到分布式事务功能,调研了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的更多相关文章
- ABP vNext系列文章03---依赖注入
一.依赖注入的类型注册 ABP的依赖注入系统是基于Microsoft的依赖注入扩展库(Microsoft.Extensions.DependencyInjection nuget包)开发的.因此,它的 ...
- 分布式事务框架.NetCore CAP总结
来自CAP原作者yang-xiaodong的原理图: 本文撰写者:cmliu,部分内容引用自官方文档,部分内容待更新# .NetCore CAP # 1,简介 CAP 是一个遵循 .NET Stand ...
- 2019 年起如何开始学习 ABP 框架系列文章-开篇有益
2019 年起如何开始学习 ABP 框架系列文章-开篇有益 [[TOC]] 本系列文章推荐阅读地址为:52ABP 开发文档 https://www.52abp.com/Wiki/52abp/lates ...
- 【转】.NET Core 事件总线,分布式事务解决方案:CAP
[转].NET Core 事件总线,分布式事务解决方案:CAP 背景 相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用 ...
- 【转】分布式事务,EventBus 解决方案:CAP【中文文档】
[转]分布式事务,EventBus 解决方案:CAP[中文文档] 最新文档地址:https://github.com/dotnetcore/CAP/wiki 前言 很多同学想对CAP的机制以及用法等想 ...
- Dubbo学习系列之八(分布式事务之MQ方案)
自从小王玩起了微服务,发现微服务果然很强大,好处真是太多,心中暗喜,然而,却也遇到了分布式中最棘手的问题:分布式事务.小王遍访各路神仙,也无个完美开源解决方案,当然,也有些实际可行的手法,虽不算完美, ...
- ABP入门系列(10)——扩展AbpSession
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 一.AbpSession是Session吗? 1.首先来看看它们分别对应的类型是什么? 查看源码发 ...
- ABP vNext EventBus For RabbitMQ 分布式事件总线使用注意事项_补充官网文档
[https://docs.abp.io/zh-Hans/abp/latest/Distributed-Event-Bus-RabbitMQ-Integration](ABP vNext官方文档链接) ...
- 分布式事务最终一致性-CAP框架轻松搞定
前言 对于分布式事务,常用的解决方案根据一致性的程度可以进行如下划分: 强一致性(2PC.3PC):数据库层面的实现,通过锁定资源,牺牲可用性,保证数据的强一致性,效率相对比较低. 弱一致性(TCC) ...
- .NET Core 事件总线,分布式事务解决方案:CAP
背景 相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用的过程中也会遇到分布式事务的问题,那么 CAP 就是在这样的背景 ...
随机推荐
- 火山引擎A/B测试在消费行业的案例实践
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,火山引擎数智平台举办了"走进火山-全链路增长:数据飞轮转动消费新生力"的活动,其中火山引 ...
- Spring Boot Admin 离线实例
一直处于离线状态 spring.boot.admin.client.instance.prefer-ip Use the ip-address rather then the hostname in ...
- 如何通过命令部署.Net
如何通过命令部署.net3.5组件服务 问题:系统安装.net一直报错,无法安装该功能. 问题现象: 终极解决方案: 将windows10系统镜像文件拷贝在硬盘或者U盘中,鼠标右击选择"装载 ...
- Sunshine + Moonlight 纯软件实现全平台设备作 Linux 副屏
目录 初识 Moonlight 部署 Sunshine 服务端与 Moonlight 客户端 创建虚拟显示屏 写一个创建屏幕的脚本(可选) 将副屏进行串流 已知问题 最近,我想要通过视频学习一些技术知 ...
- BBS项目(一): 表设计 注册功能 登录功能 生成随机验证码
目录 表设计 1.确定表的数量 2.确定表的基础字段 自关联字段 3.确定表的外键字段 表关系图 项目初建流程备忘 注册功能 登录功能 生成随机验证码 表设计 # 仿造博客园项目 核心:文章的增删改查 ...
- 将Sublime Text打造为轻量级的C++ IDE
本文较为详细地介绍了在Windows系统下,如何配置Sublime Text的C++编译运行环境.目前实现了了可以在Sublime Text按下快捷键后,调出CMD或者终端来运行C/C++程序,从而解 ...
- Educational Codeforces Round 102 Personal Editorial(A~C,max Rating 1500)
1473A. Replacing Elements Rating 800 对数组排序,一旦数组中最大的数即a[n-1]是一个小于或等于d的数,直接输出YES即可,否则运用数组中最小的两个数加和替换最大 ...
- Manjaro 上手使用简明教程
Manjaro 是一个非常好用的系统,在被很多朋友介绍过很多次以后,我终于试着开始使用这个系统了,今天就简单记录一下,方便从别的系统来的移民,尤其是听说过 Arch 大名,也曾向往之,然而因为它的安装 ...
- VueRouter和ReactRouter路由对比
https://blog.csdn.net/xinxin_csdn/article/details/124652160
- [tslint] Identifier 'loggedIn' is never reassigned; use 'const' instead of 'let'. (prefer-const)