首页 > 其他分享 >Go-zero对接dtm

Go-zero对接dtm

时间:2023-11-07 17:15:40浏览次数:34  
标签:dtm barrier grpc DEFAULT go zero Go

go-zero对接分布式事务dtm保姆式教程

一、首先需要注意

go-zero 1.2.4版本以上,这个一定要注意

dtm 你用最新的就行了

二、clone dtm

git clone https://github.com/yedf/dtm.git

三、配置文件

1、找到项目跟文件夹下的conf.sample.yml

2、cp conf.sample.yml conf.yml

3、使用etcd , 把配置中下面这段注释打开

MicroService:
 Driver: 'dtm-driver-gozero' # name of the driver to handle register/discover
 Target: 'etcd://localhost:2379/dtmservice' # register dtm server to this url
 EndPoint: 'localhost:36790'

解释一下:

MicroService 这个不要动,这个代表要对把dtm注册到那个微服务服务集群里面去,使微服务集群内部服务可以通过grpc直接跟dtm交互

Driver :'dtm-driver-gozero' , 使用go-zero的注册服务发现驱动,支持go-zero

Target: 'etcd://localhost:2379/dtmservice' 将当前dtm的server直接注册到微服务所在的etcd集群中,如果go-zero作为微服务使用的话,就可以直接通过etcd拿到dtm的server grpc链接,直接就可以跟dtm server交互了

EndPoint: 'localhost:36790' , 代表的是dtm的server的连接地址+端口 , 集群中的微服务可以直接通过etcd获得此地址跟dtm交互了,

如果你自己去改了dtm源码grpc端口,记得这里要改下端口

四、启动dtm server

在dtm项目根目录下

go run app/main.go -c conf.yml

五、使用go-zero的grpc对接dtm

项目地址 :

这里只是做demo,不必纠结于数据库表字段

order-api是http服务入口

order-srv是订单的rprc服务,与dtm-gozero-order数据库中order表交互

stock-srv是库存的rprc服务,与dtm-gozero-stock数据库中stock表交互

整体就是,http调用order-api中立即下单接口,然后order-api立即下单接口会去调用order-srv创建订单并且调用stock-srv扣减库存,因为order-srv与stock-srv是2个独立grpc服务,所以使用dtm来做分布式事务协调

其他不用我多说了,直接看项目地址就可以了

六、go-zero对接中注意事项

1、rpc服务的pb路径

在order-api的logic中,调用后端rpc服务时候,找到rpc的pb路径时,一定要找invoke的路径,因为grpc在生成pb文件时候下方也有一堆有路径的,一定要找到invoke那个路径,当然如果你的proto文件方法名字都是大写,这2者都一样如果proto中方法名字小写的,invoke中跟他的方法名就不一样

2、dtm的回滚补偿

在使用dtm的grpc时候,当我们使用saga、tcc等如果第一步尝试或者执行失败了,是希望它能执行后面的rollback的,在grpc中的服务如果发生错误了,必须返回 : status.Error(codes.Aborted, dtmcli.ResultFailure) , 返回其他错误,不会执行你的rollback操作,dtm会一直重试

3、barrier的空补偿、悬挂等

之前准备工作中,我们创建了dtm_barrier库以及执行了barrier.mysql.sql,这个其实就是为我们的业务服务做了一个检查,防止空补偿,具体可以看barrier.Call中源码,没几行代码可以看懂的。

如果我们线上使用的话,你的每个与db交互的服务只要用到了barrier,这个服务使用到的mysql账号,要给他分配barrier库的权限,这个不要忘记了

4、barrier在rpc中本地事务

在rpc的业务中,如果使用了barrier的话,那么在model中与db交互时候必须要用事务,并且一定要跟barrier用同一个事务

5、dtm_barrier这个库和表要建立一下,不然执行子事务sql会报错。sql可以去dtm的源码里找,或者用这个

CREATE TABLE `dtm_barrier.barrier` (
  `id` bigint(22) NOT NULL AUTO_INCREMENT,
  `trans_type` varchar(45) DEFAULT '',
  `gid` varchar(128) DEFAULT '',
  `branch_id` varchar(128) DEFAULT '',
  `op` varchar(45) DEFAULT '',
  `barrier_id` varchar(45) DEFAULT '',
  `reason` varchar(45) DEFAULT '' COMMENT 'the branch type who insert this record',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `gid` (`gid`,`branch_id`,`op`,`barrier_id`),
  KEY `create_time` (`create_time`),
  KEY `update_time` (`update_time`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4;

七、使用go-zero的http对接

这个基本没啥难度,grpc会了这个很简单,鉴于go在微服务中去使用http场景不多,这里就不详细去做了,我之前一个版本写过一个简单的,但是没这个完善,有兴趣可以去看下,不过那个barrier是自己基于go-zero的sqlx,将dtm的官方的做了修改,现在不需要了。

项目地址:https://github.com/Mikaelemmmm/dtmbarrier-go-zero

标签:dtm,barrier,grpc,DEFAULT,go,zero,Go
From: https://www.cnblogs.com/qcy-blog/p/17815383.html

相关文章

  • 通关Go语言,从基本原理到项目实战,由浅入深Go的底层原理与核心特性
    通关Go语言,从基本原理到项目实战,由浅入深Go的底层原理与核心特性go核心原理本人在一家go技术栈工作2年有余,因此梳理一下我认为比较重要的go语言技术知识,一些基础的概念,比如function,interface这些就忽略了。https://draveness.me/golang/https://www.bookstack.cn/read/qcr......
  • 关于fieldMask在go项目使用
    介绍: NetflixAPI设计实践:使用FieldMask(qq.com)该文章,详述了关于proto中,使用fieldMask的背景及收益,还有具体example提供参考。接下来,需要考虑在go项目中的使用。主要为以下几方面:1.服务端需要提供新的proto文件2.客户端需要感知这些proto文件,且需要关注声明为fiel......
  • 旅游管理与推荐系统Python+Django网页平台+协同过滤推荐算法
    一、介绍旅游管理与推荐系统。本系统使用Python作为主要编程语言,前端采用HTML、CSS、BootStrap等技术实现界面展示平台的开发,后端使用Django框架处理用户响应请求,并使用Ajax等技术实现前后端的数据通信。本系统主要功能有:系统分为两个角色:用户和管理员对于用户角色可以进行登......
  • go语言处理错误的正确姿势
    Go语言处理错误的正确姿势原创 枫潇潇兮 程序员技术成长之路 2023-09-2021:34 发表于福建收录于合集#go语言58个在Go语言中,错误处理是通过内置的error类型来实现的,而异常则是通过panic和recover函数来处理。Errorerror是一个内置的接口类型,它的定义如下:typeerro......
  • Gene Ontology (GO)简介
        为了查找某个研究领域的相关信息,生物学家往往要花费大量的时间,更糟糕的是,不同的生物学数据库可能会使用不同的术语,好比是一些方言一样,这让信息查找更加麻烦,尤其是使得机器查找无章可循。GeneOntology就是为了解决这种问题而发起的一个项目。    GeneOntology中最基......
  • Django实战项目-学习任务系统-发送短信通知
    接着上期代码内容,继续完善优化系统功能。本次增加发送短信通知功能,学习任务系统发布的任务,为了更加及时通知到学生用户,再原有发送邮件通知基础上,再加上手机短信通知功能。第一步:开通短信通知服务目前短信通知都是要收费的,本人还没发现免费的短信通知服务,如有网友知道免费资源请......
  • Gene Ontology (GO) 简介
    为了查找某个研究领域的相关信息,生物学家往往要花费大量的时间,更糟糕的是,不同的生物学数据库可能会使用不同的术语,好比是一些方言一样,这让信息查找更加麻烦,尤其是使得机器查找无章可循。GeneOntology就是为了解决这种问题而发起的一个项目。GeneOntology中最基本的概念是term。GO......
  • django的paginator都是假分页,数据量大很卡
    paginator使用defget(self,request,*args,**kwargs):rs_data={'count':0,'items':[]}page=int(self.request.GET.get('page',1))page_size=int(self.request......
  • Django动态创建表模型,并使用drf
    序列化器fromrest_frameworkimportserializersclassMySerializer(serializers.ModelSerializer):"""序列化器"""classMeta:model=None#可以设置为None,动态生成之后,再通过反射来重新设置。fields='__all__'......
  • Golang实现简单的后门程序
    packagemainimport( "io" "net" "os/exec")funcmain(){ var( listenernet.Listener errerror connnet.Conn ) listener,err=net.Listen("tcp",":8080") iferr!=nil{ panic(e......