前言:
在經過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、框架在設計上采用異步最終一致性的設計理念,并實現了無需入侵業(yè)務數據庫的機制。
數據存儲:
可選擇數據庫(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 端:提供三個方法,事務提交、事務回滾、任務發(fā)布。 DTC.Client.CommitAsync(...) //事務提交 DTC.Client.RollBacktAsync(...) //事務回滾 DTC.Client.PublishTaskAsync(...) //發(fā)布任務
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 //事務或任務確認完成狀態(tài)時,清除模式是刪除還是轉移到歷史表,對應:DTC_Client_History DTCConfig.Client.Worker.ConfirmClearMode,對應配置項:DTC.Client.ConfirmClearMode //事務或任務未完成狀態(tài)時,保留秒數。 DTCConfig.Client.Worker.TimeoutKeepSecond,對應配置項:DTC.Client.TimeoutKeepSecond //事務或任務未完成狀態(tài)時,清除模式是刪除還是轉移到歷史表,對應:DTC_Client_History DTCConfig.Client.Worker.TimeoutClearMode,對應配置項:DTC.Client.TimeoutClearMode //事務或任務未完成狀態(tài)時,最大可重試次數。 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.AddTaurusDtc(); // 服務添加 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、代碼編寫,可以參考源碼中提供的示例代碼,如下:文章來源:http://www.zghlxwxcb.cn/news/detail-783234.html
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")) // 事務相關信息保存,以便后續(xù)回調處理提交或回滾 { 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.AddTaurusDtc(); // 服務添加 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等來區(qū)分。
###--------------------------------------------------------###
7、總結:
原本的設計是作為?Taurus.Mvc?微服務系列中的一個插件,單獨內部集成使用,后來想了想,還是在設計中獨立了出來,支持在任意 Mvc 框架中使用。文章來源地址http://www.zghlxwxcb.cn/news/detail-783234.html
到了這里,關于開源:Taurus.DTC 微服務分布式事務框架,支持 .Net 和 .Net Core 雙系列版本的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!