seata结合nacos示例及序列化问题处理
说明
nacos版本:2.0.2
seata版本:1.4.2
mysql版本:8.0.25
1. nacos安装配置
1.1 nacos代码拉取
# 拉取最新的代码
git clone https://github.com/alibaba/nacos.git --depth=1
# 获取tag
git fetch --tags
# 切换到最新的tag
git checkout tag
# 打包
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
1.2 将打包好的文件夹复制到自己的安装目录并执行sql
# 进入taget目录
cd (D:\srccode自己的目录)\nacos\distribution\target
# 导入nacos-mysql.sql到自己的nacos库
# 修改application.properties 取消下面行注释
spring.datasource.platform=mysql
db.num=1
db.password.0=nacos# db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456
1.3. 启动
进入bin目录打开命令框
startup.bat -m standalone
2. seata安装配置
2.1 seata代码拉取与配置
# 拉取最新的代码
git clone https://github.com/alibaba/seata.git --depth=1
# 获取tag
git fetch --tags
# 切换到最新的tag
git checkout tag
# 打包
mvn -Prelease-seata -Dmaven.test.skip=true clean install -U
2.2 修改seata配置
file.conf
# 默认file,这里改成数据库,根据自己的需要改
mode = "db"
# db节点下面修改用户名密码,其他介质改其他的
user = "root"
password = "123456"
registry.conf
# 注册中心 registry
# 修改type然后修改对应的配置
type="nacos"
# nacos节点
serverAddr
username
password
# 配置中心
type = "nacos"
配置导入
导入seata配置到nacos
# 进入配置文件目录
cd D:\srccode\seata\script\config-center\nacos
# git 命令框 自己根据情况修改好config.txt后导入配置
# 无需用户名密码
sh ./nacos-config.sh -h 127.0.0.1 -p 8848 ../config.txt
# 需要用户名 密码
sh ./nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -u nacos -w nacos ../config.txt
-h:服务器ip
-g:nacos组
-u:nacos用户名
-w:nacos密码
-t:租户,默认''
注意 :如果seata配置文件registry.conf中含有dataId = "seataServer.properties",将config.txt中的配置复制到nacos的seataServer.properties配置中修改配置
seata启动
# windows
seata-server.bat -h 127.0.0.1 -p 8091 -m db
# linxu
seata-server.sh -h 127.0.0.1 -p 8091 -m db
nacos路径错误
application.properties添加
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
项目中需要添加的配置
seata.config.type=nacos
seata.config.nacos.data-id=seataServer.properties
seata.config.nacos.group=SEATA_GROUP
seata.config.nacos.username=nacos
seata.config.nacos.password=nacos
seata1.4.2较1.3及之前版本中的坑
1. nacos配置文件导入
1.3及之前的导入方式
D:\srccode\seata\script\config-center\nacos\nacos-config.sh
导入
D:\srccode\seata\script\config-center\nacos目录的config.txt,该方式一条配置占用一个配置文件的位置
1.4.2
在nacos配置中创建seataServer.properties配置文件,将config.txt复制到seataServer.properties,然后修改数据库相关配置
2. LocalDateTime坑
如果实体中有LocalDateTime类型字段,数据库为datetime类型,数据库使用了mysql8,同时jdbc驱动也是8.0,使用默认的jackson序列化方式,事务回滚会报序列化失败的错误,解决方式
a. 修改seataServer.properties中的client.undo.logSerialization=kryo
b. 清空seata表中的反序列化错误的数据
c. 重启seata服务
d. 项目中添加kryo依赖,版本与seata lib版本保持一致
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo</artifactId>
</dependency>
<dependency>
<groupId>de.javakaffee</groupId>
<artifactId>kryo-serializers</artifactId>
</dependency>
参考:
https://baijiahao.baidu.com/s?id=1700872368390839990&wfr=spider&for=pc
https://blog.csdn.net/richie696/article/details/116896511
3. 没有undo_log日志
@GlobalTransactional
// @Transactional(rollbackFor = Exception.class)
public void placeOrder(String userId, String commodityCode, Integer count) {
BigDecimal orderMoney = new BigDecimal(count).multiply(new BigDecimal(5));
Order order = new Order()
.setUserId(userId)
.setCommodityCode(commodityCode)
.setCount(count)
.setMoney(orderMoney);
orderMapper.insert(order);
storageFeignClient.deduct(commodityCode, count);
}
去掉事务发起者的@Transactional(rollbackFor = Exception.class)