最近项目中要用到分布式事务功能,调研了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. 十大 CI/CD 安全风险(四)

    在上一篇文章,我们着重介绍 PPE 风险,并提供缓解相关风险的安全建议与实践.在本篇文章中,我们将会了解凭据使用环境管理不善与不安全的系统配置,并给出相应的风险缓解建议. 凭据使用管理不善 由于与凭据 ...

  2. Docker cp 将宿主机上的文件复制到容器中

    [root@localhost ~]# docker cp /opt/web/docker_cp.txt tomcat9093:/usr/local/apache-tomcat-9.0.31/ [ro ...

  3. LSP 网络劫持(Layered Service Provider Hijacking)

    LSP 简介: 分层服务提供商(Layered Service Provider,LSP)是一种可以扩展Winsock作为应用程序的 Windows 的网络套接字工具的机制.Winsock LSP 可 ...

  4. DevEco中被忽略的实用功能

    近期,我一直在业余时间研究纯血鸿蒙(HarmonyOS)App的开发,所使用的IDE是华为官方的DevEco Studio 3.1.1. 随着使用时间的增长,我发现了几个特别容易被忽略,但又特别实用的 ...

  5. WebSoket 的广泛应用

    目前大多数网站都在使用的传统 HTTP 协议,即由 Web 服务器通过 HTTP 接收并响应来自客户端的消息,整个发起请求与响应的过程类似我们点外卖,由以下 2 部分构成: 下订单(发起请求):用户( ...

  6. Grafana-安装饼状图

    官网:https://grafana.com/grafana/plugins/grafana-piechart-panel/?tab=installation 使用grafana-cli直接安装 [r ...

  7. 《consul 简易上手指南》

    consul 是一个用来做服务发现的框架,具有分布式.高可用以及可横向扩展的特性 什么是服务发现?为什么要实现服务发现? 举个常见的例子: 假设有一台 client 想要实现不同的业务,就需要调用接口 ...

  8. Codeforce:131A. cAPS lOCK

    原题链接 ╮(╯▽╰)╭这题题目一开始没看明白,导致wa几次.如果全是大写或者出了首字母是小写其他为大写,则转换为第一个字母大写,其他的小写 ,如果不是以上两种情况则不作处理. ╮(╯▽╰)╭水题还错 ...

  9. Springcloud和Dubbo的区别。Eureka和Ribbon和Hystrix和zuul

    netty 是什么? "netty 是一个基于nio的客户.服务器端编程框架,netty提供异步的,事件驱动的网络应用程序框架和工具,可以快速开发高可用的客户端和服务器.netty是基于ni ...

  10. uniapp#实现自定义省市区三级联动

    uni-APP中的三级联动(省市区)---数据前端写死 https://blog.csdn.net/lwaner/article/details/107150805 uniapp#实现自定义省市区三级 ...