共计 5838 个字符,预计需要花费 15 分钟才能阅读完成。
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 新版的次要改良
- 反对 spring cloud 微服务系列组件
- 引入可插拔的微服务注册核心相干依赖,用户能够依据理论状况引入不同的 plugin
- 优化了整体包构造
感激 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 主动生成 gid
dtmClient.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");
}
});
// 应用自定义的 gid
dtmClient.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 主动生成 gid
dtmClient.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"));
}
});
// 应用自定义的 gid
dtmClient.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 获取 gid
Saga saga = dtmClient
.newSaga()
.add(svc + "/TransOut", svc + "/TransOutCompensate", "")
.add(svc + "/TransIn", svc + "/TransInCompensate", "")
.enableWaitResult()
.submit();
// 自定义 gid
Saga 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 获取 gid
Saga saga = dtmClient
.newSaga()
.add(new ServiceMessage(serviceName, "/TransOut"), new ServiceMessage(serviceName, "/TransOutCompensate"), "")
.add(new ServiceMessage(serviceName, "/TransIn"), new ServiceMessage(serviceName, "/TransInCompensate"), "")
.enableWaitResult()
.submit();
// 自定义 gid
Saga 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 注解引入即可.
@Autowired
private 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
# 服务中心登录 username
username=nacos
# 服务中心登录明码
password=nacos
# namespace
namespace=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