kratos分布式事务最佳实践
发布网友
发布时间:2022-12-23 06:01
我来回答
共1个回答
热心网友
时间:2024-11-24 17:12
随着业务的快速发展、业务复杂度越来越高,微服务作为最佳解决方案之一,它解耦服务,降低复杂度,增加可维护性的同时,也带来一部分新问题。
当我们需要跨服务保证数据一致性时,原先的数据库事务力不从心,无法将跨库、跨服务的多个操作放在一个事务中。这样的应用场景非常多,我们可以列举出很多:
面对这些本地事务无法解决的场景,我们需要分布式事务的解决方案,保证跨服务、跨数据库更新数据的一致性。
dtm作为一款非常流行的分布式事务框架,已经支持接入多种微服务框架,下面我们就来着重介绍一下 https://github.com/go-kratos/kratos 如何接入dtm,解决分布式事务的问题
我们来看一个可运行的例子,然后再看如何自己开发完成一个完整的分布式事务
下面以etcd作为注册服务中心,可以按照如下步骤运行一个kratos的示例:
MicroService:
Driver: 'dtm-driver-kratos' # name of the driver to handle register/discover
Target: 'discovery://127.0.0.1:2379/dtmservice' # register dtm server to this url
EndPoint: 'grpc://localhost:36790'
# 前提:已安装etcd
etcd
# 请先配置好dtm的数据库
go run app/main.go -c conf.yml # conf.yml 为你对应的 dtm 配置文件
git clone https://github.com/dtm-labs/dtmdriver-clients && cd dtmdriver-clients
cd kratos/trans
make build && ./bin/trans -conf configs/config.yaml
# 在 dtmdriver-clients 的目录下
cd kratos/app && go run main.go
当您在trans的日志中看到
那就是事务正常完成了
参考 https://github.com/dtm-labs/dtmdriver-clients 的代码
在 kratos 使用 dtm 的分布式事务时,许多的调用是从 dtm 服务器发起的,例如 TCC 的Confirm/Cancel,SAGA/MSG 的所有调用。
dtm 无需知道组成分布式事务的相关业务 api 的强类型,它是动态的调用这些api。
grpc 的调用,可以类比于 HTTP 的 POST,其中:
通过下面这部分代码,dtm就拿到了完整信息,就能够发起完整的调用了
Add(busiServer+"/api.trans.v1.Trans/TransIn", &busi.BusiReq{Amount: 30, UserId: 1})
kratos 的微服务还有非 etcd 的其他方式,下面列出它们的接入方式
对于直连这种方式,您只需要在上面 dtm 的 etcd 配置基础上,将 Target 设置为空字符串即可。
直连的情况,不需要将 dtm 注册到注册中心
项目地址:https://github.com/dtm-labs/dtm 欢迎访问,并star支持我们
kratos地址:https://github.com/go-kratos/kratos