一、准备
docker部署seata-server 1.5.2参考:docker安装各个组件的命令
二、springboot集成seata
2.1 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
2.2 bootstrap.yml配置seata
seata:
enabled: true
registry:
# 配置seata的注册中心, 告诉seata client 怎么去访问seata server(TC)
type: nacos
nacos:
server-addr: 192.168.200.131:8848 # seata server 所在的nacos服务地址
application: seata-server # seata server 的服务名seata-server ,如果没有修改可以不配
username: nacos
password: nacos
group: SEATA_GROUP # seata server 所在的组,默认就是SEATA_GROUP,没有改也可以不配
config:
type: nacos
nacos:
server-addr: 192.168.200.131:8848
username: nacos
password: nacos
group: SEATA_GROUP
tx-service-group: default-tx-group #这里每个服务都是对应不同的映射名,在配置中心可以看到
service:
vgroup-mapping:
default-tx-group: default
2.3 在nacos的对应分组新增配置文件
这一步必须有,否则会报错找不到service.vgroupMapping.xxxxxxxx
can not get cluster name in registry config 'service.vgroupMapping.default_tx_group', please make sure registry config correct
2.4 切换druid数据源
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.200.131:3306/sd?serverTimezone=GMT%2B8
username: root
password: root
druid:
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 600000
2.5 在业务库中创建undo_log表
CREATE TABLE `undo_log` (
`branch_id` bigint(20) NOT NULL COMMENT 'branch transaction id',
`xid` varchar(100) NOT NULL COMMENT 'global transaction id',
`context` varchar(128) NOT NULL COMMENT 'undo_log context,such as serialization',
`rollback_info` longblob NOT NULL COMMENT 'rollback info',
`log_status` int(11) NOT NULL COMMENT '0:normal status,1:defense status',
`log_created` datetime(6) NOT NULL COMMENT 'create datetime',
`log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AT transaction mode undo table';
三、具体步骤
- 给order-service和product-service的父工程sd-service引入依赖
spring-cloud-starter-alibaba-seata
- 给order-service和product-service的bootstrap.yml加入2.2和2.4的配置
- 在nacos中进行2.3的配置
- 在order-service中测试,代码如下(上面是order-service,下面是product-service,通过feign进行远程调用)
error:
- 在两个微服务中手动回滚GlobalTransactionContext.reload(RootContext.getXID()).rollback()会生效;
- 使用@GlobalTransactional注解时,在order-service中抛出异常回滚会生效;但是在product-service中抛出异常时,事务已执行的操作都会提交,不会回滚,不知道为什么(找到问题了,feign客户端的fallback降级会用aop拦截异常,因此seata的aop识别不到下游服务异常,所以需要把所有fallback关掉测试)
成功!!!