• 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自己的目录)
    acosdistribution	arget
    # 导入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:srccodeseatascriptconfig-center
    acos
    
    # 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配置官网

    注意 :如果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
    

    seata启动成功


    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:srccodeseatascriptconfig-center
    acos
    acos-config.sh
    导入
    D:srccodeseatascriptconfig-center
    acos目录的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)

    代码

  • 相关阅读:
    bootstrap
    Bootstrap面试题
    h5+css3 考试题
    less安装与使用
    css3(四)响应式 Web 设计 - 媒体查询
    css3(三)弹性布局
    css3(三)多列布局
    JavaScriptAPI初识
    Bootstrap面试题
    BS初识
  • 原文地址:https://www.cnblogs.com/javashare/p/15059282.html
Copyright © 2020-2023  润新知