前言:

在经过1年多的深思,十几年的框架编写技术沉淀下,花了近一个月的时间,终于又为 .Net 及 .Net Core 的微服务系列框架贡献当中的一个重要组件。

1、开源地址:

https://github.com/cyq1162/Taurus.DTC

2、Nuget 包引用ID:

由于 CYQ.Data Orm 组件本身支持10多种数据库,因此提供的包,只根据消息队列的需要分拆提供。

默认Taurus.DTC 支持同时使用 RabbitMQ 和 Kafka 两种消息队列。

如果一个项目中只用RabbitMQ,则引入 Tarurus.DTC.RabbitMQ,减少对 Kafka 的依赖包。

3、Taurus.DTC 微服务分布式事务框架基础说明:

基础说明:

1、框架分为 Client(客户端,即调用端)和 Server(服务端,即服务提供方)。

2、项目需要选择数据存储类型(数据库或分布式缓存)和数据传输类型(消息队列)。

3、框架的名称空间:Taurus.Plugin.DistributedTransaction。

4、框架在设计上采用异步最终一致性的设计理念,并实现了无需入侵业务数据库的机制。

数据存储:

可选择数据库(MSSQL、MySql、Oracle、PostgreSql 等 CYQ.Data 所支持的10多种数据库之一)

MSSQL配置示例如下:

{
"ConnectionStrings": {
"DTC.Server.Conn": "server=.;database=MSLog;uid=sa;pwd=123456"
}
}

也可选择分布式缓存存储,配置示例如下(二者选其一即可):

{
"AppSettings": {
"Redis.Servers":"127.0.0.1:6379 ,192.168.1.111:6379-withpassword",
"MemCache.Servers":"127.0.0.1:11211"
}
}

消息队列:

目前消息队列支持 RabbitMQ 或者 Kafka(配置其中一方即可):

{
"AppSettings": {
"DTC.Server.Rabbit":"127.0.0.1;guest;guest;/",//ip;username;password;virtualpath;
"DTC.Server.Kafka":"127.0.0.1:9092"
}
}

以上配置为Server端,客户端更改 Server 为 Client 即可。

名称空间下提供类库使用:

DTC:

Client 端:提供三个方法,事务提交、事务回滚、任务发布。
DTC.Client.CommitAsync(...) //事务提交
DTC.Client.RollBacktAsync(...) //事务回滚
DTC.Client.PublishTaskAsync(...) //发布任务

Server 端:提供一个方法,事务订阅
DTC.Server.Subscribe(...) //订阅事务回调。

DTCConfig:

左侧为代码,右侧为配置 AppSettings 的 key
// 是否启用,默认 true
DTCConfig.Client.IsEnable,对应配置项:DTC.Client.IsEnable
// 是否打印追踪日志,日志写入App_Data\log 目录。
DTCConfig.Client.IsPrintTraceLog,对应配置项:DTC.Client.IsPrintTraceLog
// 配置数据库存储链接,链接 key 是在 ConnectionStrings 中。
DTCConfig.Client.Conn,对应配置项:DTC.Client.Conn
//配置数据库对应生成的表名:默认DTC_Client
DTCConfig.Client.TableName,对应配置项:DTC.Client.TableName
//配置使用的RabbitMQ消息队列,配置格式为:ip;username;password;virtualpath;
DTCConfig.Client.Rabbit,对应配置项:DTC.Client.Rabbit
//配置使用的Kafka消息队列,配置格式为:ip:port
DTCConfig.Client.Kafka,对应配置项:DTC.Client.Kafka
//以下为定时线程任务配置:
//扫描的间隔时间
DTCConfig.Client.Worker.ScanDBSecond,对应配置项:DTC.Client.ScanDBSecond
//事务或任务确认完成状态时,清除模式是删除还是转移到历史表,对应:DTC_Client_History
DTCConfig.Client.Worker.ConfirmClearMode,对应配置项:DTC.Client.ConfirmClearMode
//事务或任务未完成状态时,保留秒数。
DTCConfig.Client.Worker.TimeoutKeepSecond,对应配置项:DTC.Client.TimeoutKeepSecond
//事务或任务未完成状态时,清除模式是删除还是转移到历史表,对应:DTC_Client_History
DTCConfig.Client.Worker.TimeoutClearMode,对应配置项:DTC.Client.TimeoutClearMode
//事务或任务未完成状态时,最大可重试次数。
DTCConfig.Client.Worker.MaxRetries,对应配置项:DTC.Client.MaxRetries Server 和 Client 的配置属性一致,仅 Client 换成 Server。

DTC 特性标准和方法回调参数:

Server 端:
特性标注:DTCServerSubscribe
回调参数:DTCServerSubscribePara Client 端:
特性标注:DTCClientCallBack
回调参数:DTCClientCallBackPara

4、Server 端 使用 .Net Core 示例:

1、Nuget 搜索 Taurus.DTC 引入工程项目中。

2、Program 或 Startup 添加服务使用引入:

  services.AddTaurusMvc(); // 服务添加
app.UseTaurusDtc(StartType.Server); //服务使用,启用服务端

3、appsettings.json 配置基本属性:

  {
"ConnectionStrings": {
"DTC.Server.Conn": "host=localhost;port=3306;database=cyqdata;uid=root;pwd=123456;Convert Zero Datetime=True;"
},
"AppSettings": {
"DTC.Server.Rabbit": "127.0.0.1;guest;guest;/" //IP;UserName;Password;VirtualPaath
}

4、选择数据库对应的依赖组件,如MySql,可以:

Nuget 上可以搜索 MySql.Data 、或者 CYQ.Data.MySql (会自动引入MySql.Data)  都可, 引入项目即可。

5、代码编写,可以参考源码中提供的示例代码,如下:

    public class ServerController : Taurus.Mvc.Controller
{
/// <summary>
/// provide a Create api , and it provide a transation , call https://localhost:5001/server/create
/// </summary>
[HttpPost]
[Require("name")]
public void Create(string name)
{
//do something insert
int createID = 123456;
//here will receive a header:X-Request-ID
if (DTC.Server.Subscribe(createID.ToString(), "OnCreate")) // 事务相关信息保存,以便后续回调处理提交或回滚
{
Console.WriteLine("call : DTC.Server.Subscribe call.");
}
Write(createID, true);
} [DTCServerSubscribe("OnCreate")] //订阅回调,处理提交或回滚
private static bool AnyMethodNameForOnCreateCallBack(DTCServerSubscribePara para)
{
para.CallBackContent = "what message you need?";
Console.WriteLine("call back :" + para.ExeType + " , content :" + para.Content);
if (para.ExeType == ExeType.Commit) { return true; }
if (para.ExeType == ExeType.RollBack)
{
string createID = para.Content;
//return DeleteByID(createID);
return true;
}
return false;
} [DTCServerSubscribe("ToDoTask")] // 订阅任务
private static bool DoSomeTask(DTCServerSubscribePara para)
{
Console.WriteLine("call :" + para.ExeType + " , content :" + para.Content);
para.CallBackContent = "I do ok.";
return true;
} }

5、Client 端 使用 .Net Core 示例:

1、Nuget 搜索 Taurus.DTC 引入工程项目中。

2、Program 或 Startup 添加服务使用引入:

  services.AddTaurusMvc(); // 服务添加
app.UseTaurusDtc(StartType.Client); //服务使用,启用服务端

3、appsettings.json 配置基本属性:

  {
"ConnectionStrings": {
"DTC.Client.Conn": "host=localhost;port=3306;database=cyqdata;uid=root;pwd=123456;Convert Zero Datetime=True;"
},
"AppSettings": {
"DTC.Client.Rabbit": "127.0.0.1;guest;guest;/" //IP;UserName;Password;VirtualPaath
}

4、选择数据库对应的依赖组件,如MySql,可以:

Nuget 上可以搜索 MySql.Data 、或者 CYQ.Data.MySql (会自动引入MySql.Data)  都可, 引入项目即可。

5、代码编写,可以参考源码中提供的示例代码,如下:

   public class ClientController : Taurus.Mvc.Controller
{
[HttpGet]
public void Transation()
{
//do something
RpcTask task = Rpc.StartPostAsync("https://localhost:5001/server/create", Encoding.UTF8.GetBytes("name=hello world"));
if (task.Result.IsSuccess)
{
if (JsonHelper.IsSuccess(task.Result.ResultText))
{
if (DTC.Client.CommitAsync(1, "OnOK"))
{
Console.WriteLine("call : DTC.Client.CommitAsync.");
}
Write("Commit OK.", true);
return;
}
}
if (DTC.Client.RollBackAsync(1, "OnFail"))
{
Console.WriteLine("call : DTC.Client.RollBackAsync call.");
}
Write("RollBack ing....", false);
}
[DTCClientCallBack("OnFail")]
[DTCClientCallBack("OnOK")]
[DTCClientCallBack("OnDoOK")]
private void OnCallBack(DTCClientCallBackPara para)
{
Console.WriteLine("call back : " + para.ExeType + " - " + para.CallBackKey + " - " + para.CallBackContent);
} /// <summary>
/// to publish a new task , start https://localhost:5000/client/publishtask
/// </summary>
[HttpGet]
public void PublishTask()
{
if (DTC.Client.PublishTaskAsync("I give you some info.", "ToDoTask", "OnDoOK"))
{
Console.WriteLine("call : DTC.Client.PublishTaskAsync.");
}
Write("Publish Task OK.", true);
} }

6、其它:CYQ.Data 支持的数据库链接语句示例

###--------------------------------------------------------###

   Txt::  Txt Path=E:\
Xml:: Xml Path=E:\
Access:: Provider=Microsoft.Jet.OLEDB.4.0; Data Source=E:\cyqdata.mdb
Sqlite:: Data Source=E:\cyqdata.db;failifmissing=false;
MySql:: host=localhost;port=3306;database=cyqdata;uid=root;pwd=123456;Convert Zero Datetime=True;
Mssql:: server=.;database=cyqdata;uid=sa;pwd=123456;provider=mssql;
Sybase:: data source=127.0.0.1;port=5000;database=cyqdata;uid=sa;pwd=123456;provider=sybase;
Postgre: server=localhost;uid=sa;pwd=123456;database=cyqdata;provider=pg;
DB2: Database=SAMPLE;User ID=administrator;Server=127.0.0.1;password=1234560;provider=db2;
FireBird user id=SYSDBA;password=123456;database=d:\\test.dbf;server type=Default;data source=127.0.0.1;port number=3050;provider=firebird;
Dameng:: user id=SYSDBA;password=123456789;data source=127.0.0.1;schema=test;provider=dameng;
KingBaseES server=127.0.0.1;User Id=system;Password=123456;Database=test;Port=54321;schema=public;provider=kingbasees;
Oracle ODP.NET::
Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT = 1521)))(CONNECT_DATA =(SID = orcl)));User ID=sa;password=123456 由于各种数据库链接语句基本一致,除了特定写法外,可以通过链接补充:provider=mssql、provider=mysql、provider=db2、provider=postgre等来区分。
###--------------------------------------------------------###

7、总结:

原本的设计是作为 Taurus.Mvc 微服务系列中的一个插件,单独内部集成使用,后来想了想,还是在设计中独立了出来,支持在任意 Mvc 框架中使用。

开源:Taurus.DTC 微服务分布式事务框架,支持 .Net 和 .Net Core 双系列版本的更多相关文章

  1. Spring Cloud Alibaba | 微服务分布式事务之Seata

    Spring Cloud Alibaba | 微服务分布式事务之Seata 本篇实战所使用Spring有关版本: SpringBoot:2.1.7.RELEASE Spring Cloud:Green ...

  2. .Net Core with 微服务 - 分布式事务 - TCC

    上一次我们讲解了分布式事务的 2PC.3PC .那么这次我们来理一下 TCC 事务.本次还是讲解 TCC 的原理跟 .NET 其实没有关系. TCC Try 准备阶段,尝试执行业务 Confirm 完 ...

  3. .Net Core with 微服务 - 分布式事务 - 可靠消息最终一致性

    前面我们讲了分布式事务的2PC.3PC , TCC 的原理.这些事务其实都在尽力的模拟数据库的事务,我们可以简单的认为他们是一个同步行的事务.特别是 2PC,3PC 他们完全利用数据库的事务能力,在一 ...

  4. 微服务分布式事务之LCN、TCC

    在亿级流量架构之分布式事务解决方案对比中, 已经简单阐明了从本机事务到分布式事务的演变过程, 文章的最后简单说明了TCC事务, 这儿将会深入了解TCC事务是原理, 以及理论支持, 最后会用Demo举例 ...

  5. .Net Core with 微服务 - 分布式事务 - 2PC、3PC

    最近比较忙,好久没更新了.这次我们来聊一聊分布式事务. 在微服务体系下,我们的应用被分割成多个服务,每个服务都配置一个数据库.如果我们的服务划分的不够完美,那么为了完成业务会出现非常多的跨库事务.即使 ...

  6. 【推荐】微服务分布式企业框架Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis

              摘要: 主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件.数据权限组件.数据字典组件.核心工具 组件.视图操作组件.工作流组件.代码 ...

  7. 终于跑通分布式事务框架tcc-transaction的示例项目

    1.背景 前段时间在看项目代码的时候,发现有些接口的流程比较长,在各个服务里面都有通过数据库事务保证数据的一致性,但是在上游的controller层并没有对一致性做保证. 网上查了下,还没找到基于Go ...

  8. 快速了解阿里微服务热门开源分布式事务框架——Seata

    一.Seata 概述 Seata 是 Simple Extensible Autonomous Transaction Architecture 的简写,由 feascar 改名而来. Seata 是 ...

  9. 开源的分布式事务框架 springcloud Alibaba Seata 的搭建使用 一次把坑踩完。。。

    seata的使用 1. Seata 概述 Seata 是 Simple Extensible Autonomous Transaction Architecture 的简写,由 feascar 改名而 ...

  10. Taurus.MVC 微服务框架 入门开发教程:项目部署:1、微服务应用程序常规部署实现多开,节点扩容。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

随机推荐

  1. Django框架项目之课程主页——课程页页面、课程表分析、课程表数据、课程页面、课程接口、前台、后台

    文章目录 1-课程页页面 课程组件 2 课程主页之课程表分析 课程表分析 免费课案例 创建models:course/models.py 注册models:course/adminx.py 数据库迁移 ...

  2. the solution of Mining Your Own Business

    the description of problem (我看的是 PDF 里面的原题所以这里描述会和题目不一样,但是大意一致) 给定一个未必连通的无向图,问最少在几个点设置出口,可以保证任意一个点坍塌 ...

  3. vcpkg manifest 的使用

    最近项目上要使用 CMakeLists 管理,由于 Windows 版本有依赖到 vcpkg 提供的库,所以需要使用 vcpkg manifest 来统一设置库的版本,方便后续维护 推荐一个文章,介绍 ...

  4. PKCS#11:密码设备与应用程序的密码学接口

    密码学在信息安全中扮演着至关重要的角色.为了保护敏感信息.数字身份和网络通信的安全性,密码设备(如硬件安全模块HSM)与应用程序之间的安全通信和互操作性变得至关重要.PKCS#11(Public-Ke ...

  5. C#经典十大排序算法(完结)

    C#冒泡排序算法 简介 冒泡排序算法是一种基础的排序算法,它的实现原理比较简单.核心思想是通过相邻元素的比较和交换来将最大(或最小)的元素逐步"冒泡"到数列的末尾. 详细文章描述 ...

  6. Go 常用标准库之 fmt 介绍与基本使用

    Go 常用标准库之 fmt 介绍与基本使用 目录 Go 常用标准库之 fmt 介绍与基本使用 一.介绍 二.向外输出 2.1 Print 系列 2.2 Fprint 系列 2.3 Sprint 系列 ...

  7. 火山引擎 ByteHouse:只需 2 个方法,增强 ClickHouse 数据导入能力

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 作为企业数字化建设的必备要素,易用的数据引擎能帮助企业提升数据使用效率,更好提升数据应用价值,夯实数字化建设基础. ...

  8. CTA策略介绍

    CTA策略更多的时候是一种投资方法,更准确的说,主要投资于衍生品的.比较系统化规则化的投资方法都可以称作CTA投资,它并不拘泥于量化或是主动,其具有相当的生命力,会长期存在. CTA策略的收入来源是多 ...

  9. Modbus转Profinet 网关

    产品简介 实现 PROFINET 网络与串口网络之间的数据通信,三个串口可分别连接具有 RS232 或 RS485 接口的设 备到 PROFINET 网络.即将串口设备转换为 PROFINET 设备. ...

  10. 【Spring Boot】【外包杯】学习day01 | 项目目录结构划分以及代码分层

    起因:扒了一个开源的项目,但是啃起来很硬,所以决定开始学习相关的知识. 我们之前的SSM项目,搭建过程较为繁琐: 1)配置 web.xml,加载 spring 和 spring mvc 2)配置数据库 ...