kratos分布式事务最佳实践
背景
随着业务的快速发展、业务复杂度越来越高,微服务作为最佳解决方案之一,它解耦服务,降低复杂度,增加可维护性的同时,也带来一部分新问题。
当我们需要跨服务保证数据一致性时,原先的数据库事务力不从心,无法将跨库、跨服务的多个操作放在一个事务中。这样的应用场景非常多,我们可以列举出很多:跨行转账场景,数据不在一个数据库,但需要保证余额扣减和余额增加要么同时成功,要么同时失败发布文章后,更新文章总数等统计信息。其中发布文章和更新统计信息通常在不同的微服务中微服务化之后的订单系统出行旅游需要在第三方系统同时定几张票
面对这些本地事务无法解决的场景,我们需要分布式事务的解决方案,保证跨服务、跨数据库更新数据的一致性。
dtm作为一款非常流行的分布式事务框架,已经支持接入多种微服务框架,下面我们就来着重介绍一下https:github。comgokratoskratos如何接入dtm,解决分布式事务的问题运行一个例子
我们来看一个可运行的例子,然后再看如何自己开发完成一个完整的分布式事务
下面以etcd作为注册服务中心,可以按照如下步骤运行一个kratos的示例:配置dtm
MicroService:
Driver:dtmdriverkratosnameofthedrivertohandleregisterdiscover
Target:discovery:127。0。0。1:2379dtmserviceregisterdtmservertothisurl
EndPoint:grpc:localhost:36790启动etcd
前提:已安装etcd
etcd启动dtm
请先配置好dtm的数据库
gorunappmain。gocconf。ymlconf。yml为你对应的dtm配置文件运行一个kratos的服务
gitclonehttps:github。comdtmlabsdtmdriverclientscddtmdriverclients
cdkratostrans
makebuild。bintransconfconfigsconfig。yaml发起一个kratos使用dtm的事务
在dtmdriverclients的目录下
cdkratosappgorunmain。go
当您在trans的日志中看到INFOmsgconfigloaded:config。yamlformat:yamlINFOmsg〔gRPC〕serverlisteningon:〔::〕:90002022033009:35:36transferout30centsfrom12022033009:35:36transferin30centsto2
那就是事务正常完成了开发接入
参考https:github。comdtmlabsdtmdriverclients的代码下面这些导入kratos的dtm驱动import(github。comdtmlabsdriverkratos)dtm已经经过前面的配置,注册到下面这个地址,因此在dtmgrpc中使用该地址vardtmServerdiscovery:localhost:2379dtmservice业务地址,下面的busi换成实际在server初始化设置的名字varbusiServerdiscovery:localhost:2379busi发起一个msg事务,保证TransOut和TransIn都会完成gid:dtmgrpc。MustGenGid(dtmServer)m:dtmgrpc。NewMsgGrpc(dtmServer,gid)。Add(busiServerapi。trans。v1。TransTransOut,busi。BusiReq{Amount:30,UserId:1})。Add(busiServerapi。trans。v1。TransTransIn,busi。BusiReq{Amount:30,UserId:2})m。WaitResulttrueerr:m。Submit()logger。FatalIfError(err)深入理解动态调用
在kratos使用dtm的分布式事务时,许多的调用是从dtm服务器发起的,例如TCC的ConfirmCancel,SAGAMSG的所有调用。
dtm无需知道组成分布式事务的相关业务api的强类型,它是动态的调用这些api。
grpc的调用,可以类比于HTTP的POST,其中:api。trans。v1。TransTransIn相当于URL中的Path。请注意这个Path一定是要从TransIn的Invoke函数实现里面找busi。BusiReq{Amount:30,UserId:1}相当于Post中Bodyv1。Response相当于HTTP请求的响应
通过下面这部分代码,dtm就拿到了完整信息,就能够发起完整的调用了
Add(busiServerapi。trans。v1。TransTransIn,busi。BusiReq{Amount:30,UserId:1})其他方式接入
kratos的微服务还有非etcd的其他方式,下面列出它们的接入方式直连
对于直连这种方式,您只需要在上面dtm的etcd配置基础上,将Target设置为空字符串即可。
直连的情况,不需要将dtm注册到注册中心联系我们
项目地址:https:github。comdtmlabsdtm欢迎访问,并star支持我们
kratos地址:https:github。comgokratoskratos
经超斩获国剧盛典年度关注男演员分享演员的责任感星关系1月2日讯2019年1月1日,经超亮相安徽卫视国剧盛典。回首2018年,可谓是经超的元年,凭借自己多部作品广受观众的喜爱,当晚更斩获国剧盛典年度关注男演员奖,这也是在他在……
谭维维助阵双卫视跨年曲风多样亮点多燃炸全场星关系1月2日讯刚刚过去的元旦小长假,各大卫视跨年晚会亮点多多话题不断,谭维维分别现身助阵浙江卫视领跑2019爱你依旧演唱会和20182019湖南卫视跨年演唱会,用歌声陪伴全国……
赖雨濛火王之千里同风热播化身景甜仗义小闺蜜星关系12月26日讯由胡意涓执导,饶俊编剧,景甜、陈柏霖、张逸杰、赖雨濛等主演的《火王》系列第二部《火王之千里同风》正在湖南卫视热播当中。而赖雨濛饰演的魏咏倩作为万众瞩目的明星……
于朦胧红色西装助阵冰雪盛典青春正能量开唱燃情跨年星关系1月2日讯近日,北京卫视正式官宣于朦胧加盟2019环球跨年冰雪盛典,以歌手身份登台献唱,与演员周冬雨、张天爱等人一起带来歌曲《强国一代有我在》。于朦胧在现场用歌声传达正能……
王一博程潇湖南跨年霸气酷舞强强联手演绎冰火碰撞星关系1月2日讯一年一度的令人激动人心的跨年演唱会已经纷纷落幕,湖南跨年舞台上,王一博和程潇两位舞台王者打造的跨年限定舞台《Fire》燃翻全场,乐华舞蹈导师line再一次强强联……
知否湖南卫视热播处事哲学被赞古今通用星关系1月2日讯由正午阳光影业出品,赵丽颖、冯绍峰领衔主演,朱一龙、施诗、张佳宁、曹翠芬、刘钧、刘琳、高露、王仁君、李依晓、王鹤润、张晓谦、李洪涛主演,王一楠、陈瑾特别出演的古……
反转?阿里女员工被害案有新进展(北京讯)中国互联网巨头阿里巴巴女员工被侵害一案中,被指侵犯该女员工的阿里客户张某,因涉嫌强制猥亵犯罪而被逮捕;女员工的上司王某文也因涉嫌同一罪名而正在接受审查。据中国检……
为冬奥助力敲响跨年钟声北京卫视跨年被赞诚意之作星关系1月2日讯前日,2019环球跨年冰雪盛典,如约在北京卫视、黑龙江卫视、河北卫视同步播出。此次晚会以天涯共此时,冰雪新篇章为主题,多地携手将冰雪和冬奥融合在环球冰雪盛典其中……
知否硬核奶奶化身人生导师祖孙情感动人心星关系1月2日讯由正午阳光影业出品,赵丽颖、冯绍峰领衔主演,朱一龙、施诗、张佳宁、曹翠芬、刘钧、刘琳、高露、王仁君、李依晓、王鹤润、张晓谦、李洪涛主演,王一楠、陈瑾特别出演的古……
现在的Windows电脑,竟然被微软拖了后腿?最近托尼被Windows系统的色彩管理折腾得没脾气了。事情的起因是这样的,起先托尼打算在自己的Mac上弄个双系统,以便在我需要用到Windows软件的时候可以把电脑快速切……
2019BTV环球冰雪盛典多景同庆热热闹闹燃情跨年星关系1月2日讯今年北京卫视联合黑龙江卫视、河北卫视以实景跨年户外狂欢为特色,贯穿冬奥冰雪元素,致力打造2019环球跨年冰雪盛典。这个独具特色的跨年主题,突破了传统的单一舞台的……
高斌再度联手孔笙黄伟大江大河造型设计成亮点星关系12月29日讯由上海广播电视台、东阳正午阳光影视有限公司、SMG尚世影业联合出品,侯鸿亮制片,孔笙、黄伟执导,曾获得化妆金像奖的高斌担任造型设计的当代题材电视剧《大江大河……