springboot集成分布式事物fescar
一直以来,分布式事物一直是一个痛点,一直没有一个特别好的解决办法,直到今年一月份,阿里开源了分布式事物框架fescar,今天就让我们一起来学习下.
至于介绍,我就在这里不啰嗦了,官网上介绍的很清楚,不清楚的同学先去官网查看wiki,今天,我们就从diamante角度介入fescar,实现分布式事物框架。
先看下我的工程目录
![](https://img.haomeiwen.com/i13521431/3b352bc818ddadfd.png)
parent 父工程
service-discovery 注册中心使用的是eureka注册中心
service-product 服务提供者
service-consumer 服务消费者
fescar-config 分布式事物的autoconfig:也就是需要传递的xid的所涉及到的类
服务提供者和服务消费者使用feign实现rpc调用
这是初步工作,你先搭建好这样一个工程,接下来我们进行fescar接入
第一步:先去官网下载fescar-server,我下载的0.4.2版本
第二步:创建fescar-config项目,
第三步:引入依赖
![](https://img.haomeiwen.com/i13521431/b8d7392c54088016.png)
第四步:在fescar-config中创建配置类,拦截器类,过滤器三个类。具体代码官网都有现成的例子
配置类
![](https://img.haomeiwen.com/i13521431/7a70f16c8b0cf110.png)
拦截器类
![](https://img.haomeiwen.com/i13521431/6157f414648f970a.png)
过滤器类
![](https://img.haomeiwen.com/i13521431/ac6b6122efcf357d.png)
第五步:改造service-product项目
在配置文件中加入fescar事物组的名称
spring.cloud.alibaba.fescar.tx-service-group=test_group
编辑file.conf文件,标记为深色的为需要修改的地方
transport {
# tcp udt unix-domain-socket
type ="TCP"
#NIO NATIVE
server ="NIO"
#enable heartbeat
heartbeat =true
#thread factory for netty
thread-factory {
boss-thread-prefix ="NettyBoss"
worker-thread-prefix ="NettyServerNIOWorker"
server-executor-thread-prefix ="NettyServerBizHandler"
share-boss-worker =false
client-selector-thread-prefix ="NettyClientSelector"
client-selector-thread-size =1
client-worker-thread-prefix ="NettyClientWorkerThread"
# netty boss thread size,will not be used for UDT
boss-thread-size =1
#auto default pin or 8
worker-thread-size =8
}
}
service {
#vgroup->rgroup
#vgroup_mapping.business-service-fescar-service-group = "localRgroup"
vgroup_mapping.test_group ="default"
#only support single node
localRgroup.grouplist ="127.0.0.1:8091"
#degrade current not support
enableDegrade =false
#disable
disable =false
}
client {
async.commit.buffer.limit =10000
lock {
retry.internal =10
retry.times =30
}
}
编辑register.conf文件
registry {
# file 、nacos 、eureka、redis、zk
type ="eureka"
nacos {
serverAddr ="192.169.250.177"
namespace ="public"
cluster ="default"
}
eureka {
serviceUrl ="http://localhost:8260/eureka"
application ="default"
weight ="1"
}
redis {
serverAddr ="localhost:6381"
db ="0"
}
zk {
cluster ="default"
serverAddr ="127.0.0.1:2181"
session.timeout =6000
connect.timeout =2000
}
file {
name ="file.conf"
}
}
config {
# file、nacos 、apollo、zk
type ="file"
nacos {
serverAddr ="192.169.250.177"
namespace ="public"
cluster ="default"
}
apollo {
app.id ="fescar-server"
apollo.meta ="http://192.168.1.204:8801"
}
zk {
serverAddr ="127.0.0.1:2181"
session.timeout =6000
connect.timeout =2000
}
file {
name ="file.conf"
}
}
第六步:在项目中引入fescart-config依赖
第七步:在service-consumer中重复上述步骤
第八步:我们开始测试,我准备了两个数据库,
@Override
@GlobalTransactional
public void globalTransactionAdd(String name,Integer price) {
//先往商品列表新增,之后再往另一个数据库新增
this.productService.insertPro(name,price);(A数据库插如记录)
SuccessProduct successProduct =new SuccessProduct();
successProduct.setName(name);
successProduct.setId(new Random().nextInt(100));
//不同的数据源
int i =1/0;(模拟异常)
this.successProductMapper.insert(successProduct);(在B数据库插如一条记录)
}
测试的时候,先启动fescar-server
然后当没有异常的时候,会正常执行,当出现异常的时候,A和B都不会生成新的记录,达到目标!