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

这篇具有很好参考价值的文章主要介绍了开源:Taurus.DTC 微服务分布式事务框架,支持 .Net 和 .Net Core 双系列版本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

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

1、开源地址:

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

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

 

2、Nuget 包引用ID:

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

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

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

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

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.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、代码编写,可以参考源码中提供的示例代码,如下:

    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.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等来区分。
###--------------------------------------------------------###

7、总结:

原本的设计是作为 Taurus.Mvc 微服务系列中的一个插件,单独内部集成使用,后来想了想,还是在设计中独立了出来,支持在任意 Mvc 框架中使用。文章来源地址https://www.toymoban.com/news/detail-783234.html

到了这里,关于开源:Taurus.DTC 微服务分布式事务框架,支持 .Net 和 .Net Core 双系列版本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【springcloud微微服务】分布式事务框架Seata使用详解

    目录 一、前言 二、事务简介 2.1 原子性 2.2 一致性 2.3 隔离性 2.4 持久性

    2023年04月26日
    浏览(30)
  • Java微服务分布式事务框架seata的TCC模式

    🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 专栏 描述 Java项目实战 介绍Java组件安装、使用;手写框架等 Aws服务器实战 Aws Linux服务器上操作nginx、git、JDK、Vue Jav

    2024年03月23日
    浏览(33)
  • 【分布式事务】Seata 开源的分布式事务解决方案

    Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 阿里巴巴作为国内最早一批进行应用分布式(微服务化)改造的企业,很早就遇到微服务架构下

    2024年02月02日
    浏览(40)
  • 分布式事务框架Seata

    分布式事务框架Seata 一、seata是什么 在微服务架构下,由于数据库和应用服务的拆分,导致原本一个事务单元中的多个 DML 操作,变成了跨进程或者跨数据库的多个事务单元的多个 DML 操作, 而传统的数据库事务无法解决这类的问题,所以就引出了分布式事务的概念。 分布式

    2024年02月10日
    浏览(31)
  • 开源.NET8.0小项目伪微服务框架(分布式、EFCore、Redis、RabbitMQ、Mysql等)

    为什么说是伪微服务框架,常见微服务框架可能还包括服务容错、服务间的通信、服务追踪和监控、服务注册和发现等等,而我这里为了在使用中的更简单,将很多东西进行了简化或者省略了。 年前到现在在开发一个新的小项目,刚好项目最初的很多功能是比较通用的,所以

    2024年03月09日
    浏览(45)
  • SpringCloud入门实战(十五)分布式事务框架Seata简介

    📝 学技术、更要掌握学习的方法,一起学习,让进步发生 👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。 💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。 💐学习建议:2、然后记住每个技术最关键的特性(通常一句话或者

    2024年02月10日
    浏览(31)
  • Apache Seata -- 一款开源的分布式事务解决方案

    1.1 分布式事务简介 (1)事务 事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败。 (2)本地事务 ​ 在计算机系统中,更多的是通过关系型数据库来控制事务,这是利用数据库本身的事务特性来实现的,因此叫数据库事务,由于

    2024年03月17日
    浏览(43)
  • 微服务·数据一致-事务与分布式事务

    事务是计算机科学和数据库管理中的一个关键概念,用于确保数据的一致性和可靠想。事务管理是大多数应用程序和数据库系统中不可或缺的一部分。分布式事务扩展了事务的概念,用于多个分布式系统和服务的数据一致性管理。本调查报告将深入探讨事务和分布式事务的概

    2024年02月09日
    浏览(37)
  • 微服务分布式事务处理

    当我们向微服务架构迁移时,如何处理好分布式事务是必须考虑的问题。这篇文章介绍了分布式事务处理的两种方案,可以结合实际采用合适的解决方案。原文:Handling Distributed Transactions in the Microservice world [1] 如今每个人(包括我)都在思考、构建微服务,分布式系统是微服

    2024年02月04日
    浏览(33)
  • 微服务--Seata(分布式事务)

    TCC模式在代码中实现:侵入性强,并且的自己实现事务控制逻辑 Try,Confirm() cancel() 第三方开源框架:BeyeTCCTCC-transactionHimly 异步实现:MQ可靠消息最终一致性 @GlobalTransacational---AT模式

    2024年02月10日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包