一 问题:

微服务中,某事务内通过feign调用多个api,但Transcational注解的事务只对本服务的流程有效,feign调用的接口不会回滚。为使feign调用目标参与事务,需使用分布式锁。

二 结构

原有结构:注册中心、调用者、被调用者

需新增:tx微服务,配套的一个数据库表,配套的redis服务,不需注册至注册中心。调用者、被调用者使用指定注解实现分布式锁。

三 原理

tx-manager基于redis,通过独立的微服务建立事务组,协调调用、被调用者的事务。

tx微服务默认监听8070端口,可手动设置;自定义微服务添加依赖后默认连接8070端口与tx微服务通信,可手动配置。

调用者发起分布式事务后,通知tx微服务建立事务组,并得到groupid。被调用者参与事务组,并向tx微服务发送事务执行情况。最终所有事务执行完成,关闭事务组,或发生异常后全部回滚。

若事务中发生网络问题,某步事务组通信无响应,则tx微服务记录此次失败,进入补偿机制,通过自定义的回调函数发送通知。若配置了自动补偿,则会将执行了的事务回滚、未执行的事务不操作、重新执行事务组。

四 实现

https://blog.csdn.net/jingYang07/article/details/100122897  亲测可用。需去掉两句hibernate配置,可自定义监听ip和端口

五 补充

1 后台管理页面时http://lcn服务端地址:服务端配置的接口/  密码codingapi

2 还是别用默认的8070端口了,比如apollo也用这个端口,会冲突

服务端配置  tx-lcn.manager.port=8071

客户端配置 tx-lcn.client.manager-address = 127.0.0.1:8071

3 就算配置了其它监听端口,观察控制台也会发现启动后先连上指定端口,然后再去连8070,重试⑨次失败后才确认只有一个服务端。若使用默认8070且与apollo冲突,则会看到连接失败,重试⑨次后还是失败,然后一大堆线程报错,这时虽然一般的api可以正常用,但涉及分布式事务的api统统报错。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐