https://github.com/dtm-labs/dtm是一个革命性的分布式事务框架,提供了傻瓜式的使用方法,大大降低了使用门槛分布式事务的使用改变了“能用分布式事务就用”的行业现状,优雅的解决了服务间的数据一致性问题。特性支持多语言:支持Go、Java、PHP、C#、Python、Nodejs各种语言的SDK支持多种事务模式:SAGA、TCC、XA、二阶段消息(本地消息表、事务消息)支持多数据库事务:Mysql、Redis、MongoDB、Postgres、TDSQL等支持多种存储引擎:Mysql(常用)、Redis(高性能)、MongoDB(规划中)支持多种微服务架构:go-zero、go-kratos/kratos、polarismesh/polaris支持JavaSDK的高可用和易水平扩展。新版本主要改进支持springcloud微服务系列组件,引入可插拔微服务注册中心相关依赖。用户可以根据实际情况引入不同的插件,优化整体包结构。感谢https://github.com/horseLk的贡献,本次版本更新主要由他完成,实现新版dtmcli-javagithub仓库地址:https://github.com/dtm-labs/d。..项目结构|--dtmcli-java-parent#父模块|--dtmcli-common#dtmcli公共模块|--dtmcli-core#dtmcli核心模块|--dtmcli-java#dtmclijava客户端|--dtmcli-springcloud#dtmclispringcloudclient|--*-plugin#dtmcliplugindtmcli-java新版快速入门新版dtmcli-java提供了多种不同的实现方式,在兼容原版的基础上对微服务进行了完善和优化Java客户端尽可能支持。新版java客户端提供了多种灵活的实现方式,可以根据业务场景进行选择。使用HTTP接口开启自动生成gidDtmClientdtmClient的TCC事务示例;//自动生成giddtmClient.tccGlobalTransaction(newDtmConsumer(){@Overridepublicvoidaccept(Tcctcc)throwsException{Stringsvc="http://127.0.0.1:8888";响应outResponse=tcc.callBranch("",svc+"/TransOutTry",svc+"/TransOutConfirm",svc+"/TransOutCancel");响应inResponse=tcc.callBranch("",svc+"/TransInTry",svc+"/TransInConfirm",svc+"/TransInCancel");}});//使用自定义的giddtmClient.tccGlobalTransaction("custom_gid_123456",newDtmConsumer(){@Overridepublicvoidaccept(Tcctcc)throwsException{Stringsvc="http://127.0.0.1:8888";响应outResponse=tcc.callBranch("",svc+"/TransOutTry",svc+"/TransOutConfirm",svc+"/TransOutCancel");响应inResponse=tcc.callBranch("",svc+"/TransInTry",svc+"/TransInConfirm",svc+"/TransInCancel");}});使用微服务接口开启一个TCC事务DtmClientdtmClient;//自动生成giddtmClient.tccGlobalTransaction(newDtmConsumer(){@Overridepublicvoidaccept(Tcctcc)throwsException{StringappName="serviceName";tcc.callBranch(newHashMap<>(),newServiceMessage(appName,"/TransOutTry"),newServiceMessage(appName,"/TransOutConfirm"),newServiceMessage(appName,"/TransOutCancel"));tcc.callBranch(newHashMap<>(),newServiceMessage(appName,"/TransInTry"),newServiceMessage(appName,"/TransInConfirm"),newServiceMessage(appName,"/TransInCancel"));}});//使用自定义giddtmClient.tccGlobalTransaction("custom_gid_123456",newDtmConsumer(){@Overridepublicvoidaccept(Tcctcc)throwsException{StringappName="serviceName";tcc.callBranch(newHashMap<>(),newServiceMessage(appName,"/TransOutTry"),newServiceMessage(appName,"/TransOutConfirm"),newServiceMessage(appName,"/TransOutCancel"));tcc.callBranch(newHashMap<>(),newServiceMessage(appName,"/TransInTry"),newServiceMessage(appName,"/TransInConfirm"),newServiceMessage(appName,"/TransInCancel"));}});使用HTTP接口开启一个SAGA事务DtmClientdtmClient;Stringsvc="127.0.0.1:8888";//从dtmsvr=dtmClient.newSaga().add(svc+"/TransOut",svc+"/TransOutCompensate","").add(svc+"/TransIn",svc+"/TransInCompensate","").enableWaitResult().submit();//自定义gidSagasaga=dtmClient.newSaga("custom_gid_123456").add(svc+"/TransOut",svc+"/TransOutCompensate","").add(svc+"/TransIn",svc+"/TransInCompensate","").enableWaitResult().submit();使用微服务接口开启一个SAGA事务DtmClientdtmClient;StringserviceName="serviceName";//从dtmsvr获取gidSagasaga=dtmClient.newSaga().add(newServiceMessage(serviceName,"/TransOut"),newServiceMessage(serviceName,"/TransOutCompensate"),"").add(newServiceMessage(serviceName,"/TransIn"),newServiceMessage(serviceName,"/TransInCompensate"),"").enableWaitResult().submit();//自定义gidSagasaga=dtmClient.newSaga("custom_gid_123456").add(newServiceMessage(serviceName,"/TransOut"),newServiceMessage(serviceName,"/TransOutCompensate"),"").add(newServiceMessage(serviceName,"/TransIn"),newServiceMessage(serviceName,"/TransInCompensate"),"").enableWaitResult().submit();如何获取DtmClient对象spring-cloud客户端DtmClient对象已经注入到容器中,通过类中的@Autowired注解导入即可需要使用是的@AutowiredprivateDtmClientdtmClient;dtmcli-java客户端直接连接dtmsvr,只需要将dtmsvr的服务地址传给构造函数DtmClientdtmClient=newDtmClient("127.0.0.1:36789");当然,如果要在配置文件中设置直连的地址,只需要添加一个名为dtm-conf.properties的配置文件即可,配置文件的格式如下:#dtmsvraddressdtm.ipport=121.4.131.37:36789使用服务发现如果你使用服务发现并且现有支持的springcloud版本与你的项目版本不兼容,可以使用dtmcli-java版本,只需要添加一个名为dtm-conf的配置文件即可。properties,配置文件格式如下:#服务中心地址serverAddr=127.0.0.1:8848#服务中心登录用户名username=nacos#服务中心登录密码password=nacos#namespacenamespace=c3dc917d-906a-429d-90a9-85012b41014e#dtmsvr注册到服务中心服务名dtm.service.name=dtmService#服务中心类型dtm.service.registryType=nacos注:我们一个配置文件有两种不同的配置方式,如果两者同时使用,它将直接连接是首选。pom引入dtmclijavaclientspringbootversion>=2.6.0#dtmcli依赖io.github.dtm-labsdtmcli-springcloud2.1.4.2#使用的服务中心插件,如果你的项目引入了相关依赖,可以忽略io.github.dtm-labsnacos-plugin2.1.4.22.4.0<=springbootversion<2.6.0#dtmcli依赖io.github.dtm-labsdtmcli-springcloud2.1.4.1#使用的服务中心插件,如果你的项目引入了相关依赖,可以忽略io.github.dtm-labsnacos-plugin2.1.4.1其他情况#dtmcli依赖于io.github.dtm-labsdtmcli-java2.1.4#如果有需要也可以引入相应的服务中心插件dtmcli-java新版本快展开目前,dtmcli-java已经支持了部分开源的通信服务框架和服务中心框架,未来会根据您的需求尽可能支持更多的通信服务框架和服务中心框架。但是,如果你的项目使用了公司内部通信服务框架,想要访问dtmsvr,你需要完成一些简单的操作来适配你的框架。新版客户端提供IDtmServerStub接口扩展不同的通信框架。你只需要使用你项目中使用的通信服务框架实现IDtmServerStub接口,并用它构造一个DtmClient客户端即可。考虑到需要使用自研框架的项目一般不会使用开源的springcloud,同时为了防止你的框架与springcloud不兼容导致的问题,该构造函数只能在dtmcli-java版本中使用。publicDtmClient(IDtmServerStubdtmServerStub){this.dtmServerStub=dtmServerStub;}示例代码dtm-springcloud示例代码https://github.com/dtm-labs/dtmcli-java-spring-sampledtm-java在spring项目中使用https://github.com/dtm-labs/dtmcli-java-sample基于配置的dtmcli-java使用https://github.com/horseLk/dtmcli-java-sample-with-conf