翼度科技»论坛 编程开发 .net 查看内容

开源:Taurus.DTC 微服务分布式事务框架,支持 .Net 和 .Net Core 双系列版

11

主题

11

帖子

33

积分

新手上路

Rank: 1

积分
33
前言:

在经过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配置示例如下:
  1. {
  2.   "ConnectionStrings": {
  3.     "DTC.Server.Conn": "server=.;database=MSLog;uid=sa;pwd=123456"
  4.   }
  5. }
复制代码
也可选择分布式缓存存储,配置示例如下(二者选其一即可):
  1. {
  2.   "AppSettings": {
  3.   "Redis.Servers":"127.0.0.1:6379 ,192.168.1.111:6379-withpassword",
  4.   "MemCache.Servers":"127.0.0.1:11211"
  5.   }
  6. }
复制代码
消息队列:

目前消息队列支持 RabbitMQ 或者 Kafka(配置其中一方即可):
  1. {
  2.   "AppSettings": {
  3.   "DTC.Server.Rabbit":"127.0.0.1;guest;guest;/",//ip;username;password;virtualpath;
  4.   "DTC.Server.Kafka":"127.0.0.1:9092"
  5.   }
  6. }
复制代码
以上配置为Server端,客户端更改 Server 为 Client 即可。
名称空间下提供类库使用:

DTC:
  1. <strong>Client 端:提供三个方法,事务提交、事务回滚、任务发布。</strong>
  2. DTC.Client.CommitAsync(...) //事务提交
  3. DTC.Client.RollBacktAsync(...) //事务回滚
  4. DTC.Client.PublishTaskAsync(...) //发布任务<br><br>
  5. <strong>Server 端:提供一个方法,事务订阅</strong>
  6. DTC.Server.Subscribe(...) //订阅事务回调。
复制代码
DTCConfig:
  1. 左侧为代码,右侧为配置 AppSettings 的 key
  2. // 是否启用,默认 true
  3. DTCConfig.Client.IsEnable,对应配置项:DTC.Client.IsEnable
  4. // 是否打印追踪日志,日志写入App_Data\log 目录。
  5. DTCConfig.Client.IsPrintTraceLog,对应配置项:DTC.Client.IsPrintTraceLog
  6. // 配置数据库存储链接,链接 key 是在 ConnectionStrings 中。
  7. DTCConfig.Client.Conn,对应配置项:DTC.Client.Conn
  8. //配置数据库对应生成的表名:默认DTC_Client
  9. DTCConfig.Client.TableName,对应配置项:DTC.Client.TableName
  10. //配置使用的RabbitMQ消息队列,配置格式为:ip;username;password;virtualpath;
  11. DTCConfig.Client.Rabbit,对应配置项:DTC.Client.Rabbit
  12. //配置使用的Kafka消息队列,配置格式为:ip:port
  13. DTCConfig.Client.Kafka,对应配置项:DTC.Client.Kafka
  14. //以下为定时线程任务配置:
  15. //扫描的间隔时间
  16. DTCConfig.Client.Worker.ScanDBSecond,对应配置项:DTC.Client.ScanDBSecond
  17. //事务或任务确认完成状态时,清除模式是删除还是转移到历史表,对应:DTC_Client_History
  18. DTCConfig.Client.Worker.ConfirmClearMode,对应配置项:DTC.Client.ConfirmClearMode
  19. //事务或任务未完成状态时,保留秒数。
  20. DTCConfig.Client.Worker.TimeoutKeepSecond,对应配置项:DTC.Client.TimeoutKeepSecond
  21. //事务或任务未完成状态时,清除模式是删除还是转移到历史表,对应:DTC_Client_History
  22. DTCConfig.Client.Worker.TimeoutClearMode,对应配置项:DTC.Client.TimeoutClearMode
  23. //事务或任务未完成状态时,最大可重试次数。
  24. DTCConfig.Client.Worker.MaxRetries,对应配置项:DTC.Client.MaxRetries
  25. Server 和 Client 的配置属性一致,仅 Client 换成 Server。
复制代码
DTC 特性标准和方法回调参数:
  1. Server 端:
  2. 特性标注:DTCServerSubscribe
  3. 回调参数:DTCServerSubscribePara
  4. Client 端:
  5. 特性标注:DTCClientCallBack
  6. 回调参数:DTCClientCallBackPara
复制代码
4、Server 端 使用 .Net Core 示例:

1、Nuget 搜索 Taurus.DTC 引入工程项目中。
2、Program 或 Startup 添加服务使用引入:
  1.   services.AddTaurusMvc(); // 服务添加
  2.   app.UseTaurusDtc(StartType.Server); //服务使用,启用服务端
复制代码
3、appsettings.json 配置基本属性:
  1.   {
  2.   "ConnectionStrings": {
  3.     "DTC.Server.Conn": "host=localhost;port=3306;database=cyqdata;uid=root;pwd=123456;Convert Zero Datetime=True;"
  4.   },
  5.   "AppSettings": {
  6.     "DTC.Server.Rabbit": "127.0.0.1;guest;guest;/" //IP;UserName;Password;VirtualPaath
  7. }
复制代码
4、选择数据库对应的依赖组件,如MySql,可以:
  1. Nuget 上可以搜索 MySql.Data 、或者 CYQ.Data.MySql (会自动引入MySql.Data)  都可, 引入项目即可。
复制代码
5、代码编写,可以参考源码中提供的示例代码,如下:
  1.     public class ServerController : Taurus.Mvc.Controller
  2.     {
  3.     /// <summary>
  4.     /// provide a Create api , and it provide a transation , call https://localhost:5001/server/create
  5.     /// </summary>
  6.     [HttpPost]
  7.     [Require("name")]
  8.     public void Create(string name)
  9.     {
  10.         //do something insert
  11.         int createID = 123456;
  12.         //here will receive a header:X-Request-ID
  13.         if (DTC.Server.Subscribe(createID.ToString(), "OnCreate")) // 事务相关信息保存,以便后续回调处理提交或回滚
  14.         {
  15.             Console.WriteLine("call : DTC.Server.Subscribe call.");
  16.         }
  17.         Write(createID, true);
  18.     }
  19.     [DTCServerSubscribe("OnCreate")] //订阅回调,处理提交或回滚
  20.     private static bool AnyMethodNameForOnCreateCallBack(DTCServerSubscribePara para)
  21.     {
  22.         para.CallBackContent = "what message you need?";
  23.         Console.WriteLine("call back :" + para.ExeType + " , content :" + para.Content);
  24.         if (para.ExeType == ExeType.Commit) { return true; }
  25.         if (para.ExeType == ExeType.RollBack)
  26.         {
  27.             string createID = para.Content;
  28.             //return DeleteByID(createID);
  29.             return true;
  30.         }
  31.         return false;
  32.     }
  33.     [DTCServerSubscribe("ToDoTask")] // 订阅任务
  34.     private static bool DoSomeTask(DTCServerSubscribePara para)
  35.     {
  36.         Console.WriteLine("call :" + para.ExeType + " , content :" + para.Content);
  37.         para.CallBackContent = "I do ok.";
  38.         return true;
  39.     }
  40. }
复制代码
5、Client 端 使用 .Net Core 示例:

1、Nuget 搜索 Taurus.DTC 引入工程项目中。
2、Program 或 Startup 添加服务使用引入:
  1.   services.AddTaurusMvc(); // 服务添加
  2.   app.UseTaurusDtc(StartType.Client); //服务使用,启用服务端
复制代码
3、appsettings.json 配置基本属性:
  1.   {
  2.   "ConnectionStrings": {
  3.     "DTC.Client.Conn": "host=localhost;port=3306;database=cyqdata;uid=root;pwd=123456;Convert Zero Datetime=True;"
  4.   },
  5.   "AppSettings": {
  6.     "DTC.Client.Rabbit": "127.0.0.1;guest;guest;/" //IP;UserName;Password;VirtualPaath
  7. }
复制代码
4、选择数据库对应的依赖组件,如MySql,可以:
  1. Nuget 上可以搜索 MySql.Data 、或者 CYQ.Data.MySql (会自动引入MySql.Data)  都可, 引入项目即可。
复制代码
5、代码编写,可以参考源码中提供的示例代码,如下:
  1.    public class ClientController : Taurus.Mvc.Controller
  2.     {
  3.         [HttpGet]
  4.         public void Transation()
  5.         {
  6.             //do something
  7.             RpcTask task = Rpc.StartPostAsync("https://localhost:5001/server/create", Encoding.UTF8.GetBytes("name=hello world"));
  8.             if (task.Result.IsSuccess)
  9.             {
  10.                 if (JsonHelper.IsSuccess(task.Result.ResultText))
  11.                 {
  12.                     if (DTC.Client.CommitAsync(1, "OnOK"))
  13.                     {
  14.                         Console.WriteLine("call : DTC.Client.CommitAsync.");
  15.                     }
  16.                     Write("Commit OK.", true);
  17.                     return;
  18.                 }
  19.             }
  20.             if (DTC.Client.RollBackAsync(1, "OnFail"))
  21.             {
  22.                 Console.WriteLine("call : DTC.Client.RollBackAsync call.");
  23.             }
  24.             Write("RollBack ing....", false);
  25.         }
  26.     [DTCClientCallBack("OnFail")]
  27.     [DTCClientCallBack("OnOK")]
  28.     [DTCClientCallBack("OnDoOK")]
  29.     private void OnCallBack(DTCClientCallBackPara para)
  30.     {
  31.         Console.WriteLine("call back : " + para.ExeType + " - " + para.CallBackKey + " - " + para.CallBackContent);
  32.     }
  33.     /// <summary>
  34.     /// to publish a new task , start https://localhost:5000/client/publishtask
  35.     /// </summary>
  36.     [HttpGet]
  37.     public void PublishTask()
  38.     {
  39.         if (DTC.Client.PublishTaskAsync("I give you some info.", "ToDoTask", "OnDoOK"))
  40.         {
  41.             Console.WriteLine("call : DTC.Client.PublishTaskAsync.");
  42.         }
  43.         Write("Publish Task OK.", true);
  44.     }
  45. }
复制代码
6、其它:CYQ.Data 支持的数据库链接语句示例
  1. ###--------------------------------------------------------###
  2.    Txt::  Txt Path=E:\
  3.    Xml::  Xml Path=E:\
  4. Access::  Provider=Microsoft.Jet.OLEDB.4.0; Data Source=E:\cyqdata.mdb
  5. Sqlite::  Data Source=E:\cyqdata.db;failifmissing=false;
  6. MySql::  host=localhost;port=3306;database=cyqdata;uid=root;pwd=123456;Convert Zero Datetime=True;
  7. Mssql::  server=.;database=cyqdata;uid=sa;pwd=123456;provider=mssql;
  8. Sybase::  data source=127.0.0.1;port=5000;database=cyqdata;uid=sa;pwd=123456;provider=sybase;
  9. Postgre:  server=localhost;uid=sa;pwd=123456;database=cyqdata;provider=pg;
  10.     DB2:  Database=SAMPLE;User ID=administrator;Server=127.0.0.1;password=1234560;provider=db2;
  11. FireBird  user id=SYSDBA;password=123456;database=d:\\test.dbf;server type=Default;data source=127.0.0.1;port number=3050;provider=firebird;
  12. Dameng::  user id=SYSDBA;password=123456789;data source=127.0.0.1;schema=test;provider=dameng;
  13. KingBaseES server=127.0.0.1;User Id=system;Password=123456;Database=test;Port=54321;schema=public;provider=kingbasees;
  14. Oracle ODP.NET::
  15. Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT = 1521)))(CONNECT_DATA =(SID = orcl)));User ID=sa;password=123456
  16. 由于各种数据库链接语句基本一致,除了特定写法外,可以通过链接补充:provider=mssql、provider=mysql、provider=db2、provider=postgre等来区分。
  17. ###--------------------------------------------------------###
复制代码
7、总结:

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

来源:https://www.cnblogs.com/cyq1162/Undeclared/17959791
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具