前言:

在经过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. tmai

    天猫精灵技能应用平台合作协议 发布日期:2020年03月18日 更新日期:2021年02月01日 鉴于您(语音技能.小程序或应用程序APP等的制作.提供或开发者)希望入驻或与天猫精灵技能应用平台(又称 ...

  2. LLM在text2sql上的应用

    一.前言: 目前,大模型的一个热门应用方向text2sql它可以帮助用户快速生成想要查询的SQL语句.那对于用户来说,大部分简单的sql都是正确的,但对于一些复杂逻辑来说,需要用户在产出SQL的基础上 ...

  3. Centos7安装Promethus

    安装Prometheus(普罗米修斯)监控: 实验环境准备: 服务器 IP地址 Prometheus服务器 192.168.1.22 被监控服务器 192.168.1.20 grafana服务器 19 ...

  4. 聊聊RNN与seq2seq

    seq2seq模型也称为Encoder-Decoder模型.顾名思义,这个模型有两个模块--Encoder(编码器)和Decoder(解码器).编码器对输入数据进行编码,解码器对被编码的数据进行解码. ...

  5. Hyper-V中的虚拟机(Centos)安装FTP服务

    linux上是否装上了ftp服务命令: rpm -qa | grep vsftpd ,若没有安装(无显示版本号)则进行下一步 安装ftp服务,命令: yum -y install ftp vsftpd ...

  6. Golang面试题从浅入深高频必刷「2023版」

    大家好,我是阳哥.专注Go语言的学习经验分享和就业辅导. Go语言特点 Go语言相比C++/Java等语言是优雅且简洁的,是我最喜爱的编程语言之一,它既保留了C++的高性能,又可以像Java,Pyth ...

  7. Python 文件处理指南:打开、读取、写入、追加、创建和删除文件

    文件处理是任何Web应用程序的重要部分.Python有多个用于创建.读取.更新和删除文件的函数. 文件处理 在Python中处理文件的关键函数是open()函数.open()函数接受两个参数:文件名和 ...

  8. 如何在Notepad++中轻松删除包含指定文本的字符串

    如果你需要在大量文本中删除指定模式的字符串,可以使用Notepad++中的正则表达式功能.下面是一个示例,让你可以快速学会如何删除包含指定文本的字符串.我们将使用以下示例字符串: This is a ...

  9. Java SPI机制总结系列之万字详细图解SPI源码分析

    原创/朱季谦 我在<Java SPI机制总结系列之开发入门实例>一文当中,分享了Java SPI的玩法,但是这只是基于表面的应用.若要明白其中的原理实现,还需深入到底层源码,分析一番. 这 ...

  10. A组Day7

    A. 放置石子 我们设第一格的东西为 \(x\) ,则接下来的格数为 \[2:1+x\\ 3:2x+1\\ 4:3x+2\\ 5:5x+3\\ ... \] 易得x的系数就是原来的斐波那契额数列,而后 ...