前言:

在经过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.666666: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 classServerController : Taurus.Mvc.Controller
{
/// <summary> ///provide a Create api , and it provide a transation , callhttps://localhost:5001/server/create/// </summary> [HttpPost]
[Require(
"name")]public void Create(stringname)
{
//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 boolAnyMethodNameForOnCreateCallBack(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 boolDoSomeTask(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 classClientController : Taurus.Mvc.Controller
{
[HttpGet]
public voidTransation()
{
//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 voidOnCallBack(DTCClientCallBackPara para)
{
Console.WriteLine(
"call back :" + para.ExeType + "-" + para.CallBackKey + "-" +para.CallBackContent);
}
/// <summary> ///to publish a new task , starthttps://localhost:5000/client/publishtask/// </summary> [HttpGet]public voidPublishTask()
{
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 框架中使用。

标签: none

添加新评论