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
  • 反对高可用,易程度扩大

Java SDK 新版的次要改良

  1. 反对spring cloud微服务系列组件
  2. 引入可插拔的微服务注册核心相干依赖,用户能够依据理论状况引入不同的plugin
  3. 优化了整体包构造

感激 https://github.com/horseLk 的奉献,这次版本更新,次要由他实现

dtmcli-java新版实现

github仓库地址:https://github.com/dtm-labs/d...

我的项目构造

|--dtmcli-java-parent # parent module   |--dtmcli-common # dtmcli common module   |--dtmcli-core # dtmcli core module   |--dtmcli-java # dtmcli java client   |--dtmcli-springcloud # dtmcli springcloud client   |--*-plugin # dtmcli plugin

dtmcli-java新版疾速开始

dtmcli-java新版本提供了多种不同的实现形式,在对原有Java客户端尽可能兼容的根底上进行了改良优化并对微服务进行了反对。新版本的java客户端提供了多种灵便的实现,能够依据业务场景进行抉择。

应用范例

应用HTTP接口开启一个主动生成gid的TCC事务

DtmClient dtmClient;// 依据dtmsvr主动生成giddtmClient.tccGlobalTransaction(new DtmConsumer<Tcc>() {    @Override    public void accept(Tcc tcc) throws Exception {        String svc = "http://127.0.0.1:8888";        Response outResponse = tcc.callBranch( "", svc + "/TransOutTry", svc + "/TransOutConfirm",                                              svc + "/TransOutCancel");              Response inResponse = tcc.callBranch("", svc + "/TransInTry", svc + "/TransInConfirm",                                             svc + "/TransInCancel");    }});// 应用自定义的giddtmClient.tccGlobalTransaction("custom_gid_123456", new DtmConsumer<Tcc>() {    @Override    public void accept(Tcc tcc) throws Exception {        String svc = "http://127.0.0.1:8888";        Response outResponse = tcc.callBranch( "", svc + "/TransOutTry", svc + "/TransOutConfirm",                                              svc + "/TransOutCancel");              Response inResponse = tcc.callBranch("", svc + "/TransInTry", svc + "/TransInConfirm",                                             svc + "/TransInCancel");    }});

应用微服务接口开启一个TCC事务

DtmClient dtmClient;// 依据dtmsvr主动生成giddtmClient.tccGlobalTransaction(new DtmConsumer<Tcc>() {    @Override    public void accept(Tcc tcc) throws Exception {        String appName = "serviceName";        tcc.callBranch(new HashMap<>(), new ServiceMessage(appName, "/TransOutTry"),                new ServiceMessage(appName, "/TransOutConfirm"), new ServiceMessage(appName, "/TransOutCancel"));        tcc.callBranch(new HashMap<>(), new ServiceMessage(appName, "/TransInTry"),                new ServiceMessage(appName, "/TransInConfirm"), new ServiceMessage(appName, "/TransInCancel"));    }});// 应用自定义的giddtmClient.tccGlobalTransaction("custom_gid_123456", new DtmConsumer<Tcc>() {    @Override    public void accept(Tcc tcc) throws Exception {        String appName = "serviceName";        tcc.callBranch(new HashMap<>(), new ServiceMessage(appName, "/TransOutTry"),                new ServiceMessage(appName, "/TransOutConfirm"), new ServiceMessage(appName, "/TransOutCancel"));        tcc.callBranch(new HashMap<>(), new ServiceMessage(appName, "/TransInTry"),                new ServiceMessage(appName, "/TransInConfirm"), new ServiceMessage(appName, "/TransInCancel"));    }});

应用HTTP接口开启一个SAGA事务

DtmClient dtmClient;String svc = "127.0.0.1:8888";// 从dtmsvr获取gidSaga saga = dtmClient    .newSaga()    .add(svc + "/TransOut", svc + "/TransOutCompensate", "")    .add(svc + "/TransIn", svc + "/TransInCompensate", "")    .enableWaitResult()    .submit();// 自定义gidSaga saga = dtmClient    .newSaga("custom_gid_123456")    .add(svc + "/TransOut", svc + "/TransOutCompensate", "")    .add(svc + "/TransIn", svc + "/TransInCompensate", "")    .enableWaitResult()    .submit();

应用微服务接口开启一个SAGA事务

DtmClient dtmClient;String serviceName = "serviceName";// 从dtmsvr获取gidSaga saga = dtmClient    .newSaga()    .add(new ServiceMessage(serviceName, "/TransOut"), new ServiceMessage(serviceName, "/TransOutCompensate"), "")    .add(new ServiceMessage(serviceName, "/TransIn"), new ServiceMessage(serviceName, "/TransInCompensate"), "")    .enableWaitResult()    .submit();// 自定义gidSaga saga = dtmClient    .newSaga("custom_gid_123456")    .add(new ServiceMessage(serviceName, "/TransOut"), new ServiceMessage(serviceName, "/TransOutCompensate"), "")    .add(new ServiceMessage(serviceName, "/TransIn"), new ServiceMessage(serviceName, "/TransInCompensate"), "")    .enableWaitResult()    .submit();

如何获取DtmClient对象

spring-cloud客户端

DtmClient对象曾经注入到容器中,只须要在你须要应用的类中通过@Autowired注解引入即可.

@Autowiredprivate DtmClient dtmClient;

dtmcli-java客户端

直连dtmsvr

只须要将dtmsvr的服务地址传给构造函数即可。

DtmClient dtmClient = new DtmClient("127.0.0.1:36789");

当然如你想讲直连的地址设置到配置文件中,只须要增加一个命名为dtm-conf.properties的配置文件,配置文件格式如下:

# dtmsvr地址dtm.ipport=121.4.131.37:36789
应用服务发现

如果您应用了服务发现并且现有反对的springcloud版本不兼容您我的项目的版本您能够应用dtmcli-java版本,只须要增加一个命名为dtm-conf.properties的配置文件,配置文件格式如下:

# 服务中心地址serverAddr=127.0.0.1:8848# 服务中心登录usernameusername=nacos# 服务中心登录明码password=nacos# namespacenamespace=c3dc917d-906a-429d-90a9-85012b41014e# dtmsvr注册到服务中心的服务名dtm.service.name=dtmService# 服务中心类型dtm.service.registryType=nacos

留神:咱们对一个配置文件有两种不同的配置形式,如果同时应用了两种,会优先选择直连形式。

pom引入dtmcli java客户端

springboot version >= 2.6.0

# dtmcli依赖<dependency>  <groupId>io.github.dtm-labs</groupId>  <artifactId>dtmcli-springcloud</artifactId>  <version>2.1.4.2</version></dependency># 应用的服务中心插件,如果您的我的项目中曾经引入了相干依赖,则能够疏忽<dependency>  <groupId>io.github.dtm-labs</groupId>  <artifactId>nacos-plugin</artifactId>  <version>2.1.4.2</version></dependency>

2.4.0 <= springboot version < 2.6.0

# dtmcli依赖<dependency>  <groupId>io.github.dtm-labs</groupId>  <artifactId>dtmcli-springcloud</artifactId>  <version>2.1.4.1</version></dependency># 应用的服务中心插件,如果您的我的项目中曾经引入了相干依赖,则能够疏忽<dependency>  <groupId>io.github.dtm-labs</groupId>  <artifactId>nacos-plugin</artifactId>  <version>2.1.4.1</version></dependency>

其余状况

# dtmcli依赖<dependency>  <groupId>io.github.dtm-labs</groupId>  <artifactId>dtmcli-java</artifactId>  <version>2.1.4</version></dependency># 如果有须要也能够引入相应的服务中心插件

dtmcli-java新版疾速拓展

目前,dtmcli-java曾经反对了局部开源通信服务框架和服务中心框架,后续会针对大家的诉求尽可能反对更多的通信服务框架和服务中心框架。然而如果你的我的项目应用的公司外部的通信服务框并且想接入dtmsvr您须要实现简略的操作就能够适配您的框架了。

新版客户端提供了IDtmServerStub接口用于拓展不同的通信框架,只须要应用你们我的项目中应用的通信服务框架实现IDtmServerStub接口,并应用其结构一个DtmClient客户端即可应用。思考到须要应用自研框架的我的项目个别不应用开源的springcloud,并且为了避免您的框架和springcloud不兼容引起问题,此构造函数仅在dtmcli-java版本中能够应用。

public DtmClient(IDtmServerStub dtmServerStub) {    this.dtmServerStub = dtmServerStub;}

示例代码

dtm-springcloud示例代码

https://github.com/dtm-labs/dtmcli-java-spring-sample

dtm-java应用到spring我的项目中

https://github.com/dtm-labs/dtmcli-java-sample

基于配置的dtmcli-java应用

https://github.com/horseLk/dtmcli-java-sample-with-conf