• 微服务实战 06 seata 搭建与集成SpringCloud Alibaba


    请添加图片描述

    seata 搭建

    1. 下载 seata-server
      在官网下载Seata包 我这里用的是 1.5.*

    2. 更改配置文件
      更改 application.yml 配置文件 ,以 Nacos 为 注册和配置中心 dataId 设置为 seata-server.properties

      server:
        port: 7091
      
      spring:
        application:
          name: seata-server
      
      logging:
        config: classpath:logback-spring.xml
        file:
          path: ./logs/seata
      console:
        user:
          username: seata
          password: seata
      
      seata:
        config:
          # support: nacos 、 consul 、 apollo 、 zk  、 etcd3
          type: nacos
          nacos:
            # nacos ip地址
            server-addr: 127.0.0.1:8848
            group: ${设置自己的group
            namespace: ${设置自己的名称空间}
            username:
            password:
            ##if use MSE Nacos with auth, mutex with username/password attribute
            #access-key: ""
            #secret-key: ""
            # 读取nacos上的配置文件
            data-id: seata-server.properties
        registry:
          # support: nacos 、 eureka 、 redis 、 zk  、 consul 、 etcd3 、 sofa
          type: nacos
          nacos:
            application: seata-server
            # nacos ip地址
            server-addr: 127.0.0.1:8848
            group: ${设置自己的group
            namespace: ${设置自己的名称空间}
            cluster: default
            username:
            password:
            ##if use MSE Nacos with auth, mutex with username/password attribute
            #access-key: ""
            #secret-key: ""
        security:
          secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
          tokenValidityInMilliseconds: 1800000
          ignore:
            urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
    3. 配置 seata-server.properties
      打开Nacos 控制台 添加 seata-server.properties 配置
      我这里使用的是Mysql 8.0 需要更改 数据库连接驱动为 com.mysql.cj.jdbc.Driver
      具体参数配置含义参考官网 seata参数配置

      	transport.type=TCP
      transport.server=NIO
      transport.heartbeat=true
      transport.enableClientBatchSendRequest=true
      transport.threadFactory.bossThreadPrefix=NettyBoss
      transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
      transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
      transport.threadFactory.shareBossWorker=false
      transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
      transport.threadFactory.clientSelectorThreadSize=1
      transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
      transport.threadFactory.bossThreadSize=1
      transport.threadFactory.workerThreadSize=default
      transport.shutdown.wait=3
      transport.serialization=seata
      transport.compressor=none
      # server
      server.recovery.committingRetryPeriod=1000
      server.recovery.asynCommittingRetryPeriod=1000
      server.recovery.rollbackingRetryPeriod=1000
      server.recovery.timeoutRetryPeriod=1000
      server.undo.logSaveDays=7
      server.undo.logDeletePeriod=86400000
      server.maxCommitRetryTimeout=-1
      server.maxRollbackRetryTimeout=-1
      server.rollbackRetryTimeoutUnlockEnable=false
      server.distributedLockExpireTime=10000
      # store
      #model改为db
      store.mode=db
      store.lock.mode=file
      store.session.mode=file
      # store.publicKey=""
      store.file.dir=file_store/data
      store.file.maxBranchSessionSize=16384
      store.file.maxGlobalSessionSize=512
      store.file.fileWriteBufferCacheSize=16384
      store.file.flushDiskMode=async
      store.file.sessionReloadReadSize=100
      store.db.datasource=druid
      store.db.dbType=mysql
      store.db.driverClassName=com.mysql.cj.jdbc.Driver
      # 改为上面创建的seata服务数据库
      store.db.url=jdbc:mysql://ip:port/umapp_appcenter?useUnicode=true&rewriteBatchedStatements=true
      # 改为自己的数据库用户名
      store.db.user=appcenter
      # 改为自己的数据库密码
      store.db.password=123456
      store.db.minConn=5
      store.db.maxConn=30
      store.db.globalTable=global_table
      store.db.branchTable=branch_table
      store.db.distributedLockTable=distributed_lock
      store.db.queryLimit=100
      store.db.lockTable=lock_table
      store.db.maxWait=5000
      store.redis.mode=single
      store.redis.single.host=127.0.0.1
      store.redis.single.port=6379
      # store.redis.sentinel.masterName=""
      # store.redis.sentinel.sentinelHosts=""
      store.redis.maxConn=10
      store.redis.minConn=1
      store.redis.maxTotal=100
      store.redis.database=0
      # store.redis.password=""
      store.redis.queryLimit=100
      # log
      log.exceptionRate=100
      # metrics
      metrics.enabled=false
      metrics.registryType=compact
      metrics.exporterList=prometheus
      metrics.exporterPrometheusPort=9898
      # service
      # 自己命名一个vgroupMapping
      service.vgroupMapping.qingdao=default
      service.default.grouplist=ip:port
      service.enableDegrade=false
      service.disableGlobalTransaction=false
      # client
      client.rm.asyncCommitBufferLimit=10000
      client.rm.lock.retryInterval=10
      client.rm.lock.retryTimes=30
      client.rm.lock.retryPolicyBranchRollbackOnConflict=true
      client.rm.reportRetryCount=5
      client.rm.tableMetaCheckEnable=false
      client.rm.tableMetaCheckerInterval=60000
      client.rm.sqlParserType=druid
      client.rm.reportSuccessEnable=false
      client.rm.sagaBranchRegisterEnable=false
      client.rm.tccActionInterceptorOrder=-2147482648
      client.tm.commitRetryCount=5
      client.tm.rollbackRetryCount=5
      client.tm.defaultGlobalTransactionTimeout=60000
      client.tm.degradeCheck=false
      client.tm.degradeCheckAllowTimes=10
      client.tm.degradeCheckPeriod=2000
      client.tm.interceptorOrder=-2147482648
      client.undo.dataValidation=true
      client.undo.logSerialization=jackson
      client.undo.onlyCareUpdateColumns=true
      client.undo.logTable=undo_log
      client.undo.compress.enable=true
      client.undo.compress.type=zip
      client.undo.compress.threshold=64k
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78
      • 79
      • 80
      • 81
      • 82
      • 83
      • 84
      • 85
      • 86
      • 87
      • 88
      • 89
      • 90
      • 91
      • 92
      • 93
      • 94
      • 95
      • 96
      • 97
      • 98
      • 99
      • 100
      • 101
      • 102
      • 103
      • 104
      • 105
      • 106
    4. 启动Seata 服务
      在Nacos控制台可以看到以下服务
      在这里插入图片描述

    SpringCloud Alibaba 集成 Seata

    集成前的准备

    1. 我们先构建如下几个服务:

      • order-service:订单服务
      • stock-service:库存服务
      • account-service: 账户服务
      • common:公共组件
      • rest-web:提供统一的REST接口服务
    2. 数据库准备:

      • seata_order 订单数据库

        	CREATE TABLE `sys_order` (
        `id` bigint NOT NULL COMMENT 'id',
        `order_no` varchar(32) DEFAULT NULL COMMENT '单号',
        `user_id` bigint DEFAULT NULL,
        `sku_code` varchar(32) DEFAULT NULL COMMENT '商品编码',
        `sku_name` varchar(32) DEFAULT NULL COMMENT '商品名称',
        `price` decimal(32,4) DEFAULT NULL COMMENT '单价',
        `total` decimal(32,4) DEFAULT NULL COMMENT '总价',
        PRIMARY KEY (`id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
      • seata_stock 库存数据库

        	CREATE TABLE `sys_stock` (
        `id` bigint NOT NULL,
        `sku_code` varchar(32) DEFAULT NULL COMMENT '商品编码',
        `sku_name` varchar(32) DEFAULT NULL COMMENT '商品名称',
        `count` decimal(32,4) DEFAULT NULL COMMENT '数量',
        PRIMARY KEY (`id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
        
        INSERT INTO `seata_stock`.`sys_stock`(`id`, `sku_code`, `sku_name`, `count`) VALUES (1, '00001', '肘子', 10.00000000);
        INSERT INTO `seata_stock`.`sys_stock`(`id`, `sku_code`, `sku_name`, `count`) VALUES (2, '00002', '耳塞', 20.00000000);
        
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
      • seata_account 账户数据库

        	CREATE TABLE `sys_user` (
        	  `user_id` bigint NOT NULL COMMENT 'user_id',
        	  `balance` decimal(32,4) DEFAULT NULL COMMENT '余额',
        	  PRIMARY KEY (`user_id`) USING BTREE
        	) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
        
        	INSERT INTO `seata_account`.`sys_user`(`user_id`, `balance`) VALUES (1, 1000.0000);
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
    3. 我们使用 mybatis-plus 与数据库进行交互
      具体的代码交互代码不在这里贴出了 如有需要可以评论之后,发送到邮箱

    4. 编写业务逻辑代码
      测试时使用openFeign进行服务间通信

      每个seata-client中加入如下配置

      seata:
        application-id: ${spring.application.name}
        tx-service-group: qingdao
      
        # Seata 的注册方式为 nacos
        registry:
          type: nacos
          nacos:
            namespace: "zcctConfig"
            group: zcct
            server-addr: 127.0.0.1:8848
        # Seata 的配置中心为 nacos
        config:
          type: nacos
          nacos:
            namespace: "zcctConfig"
            group: zcct
            server-addr: 127.0.0.1:8848
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
       @Override
          public SysUser cutDown(BigDecimal total, Long userId) {
              SysUser sysUser = sysUserRepository.selectById(userId);
              if(sysUser == null) throw new BadRequestException("用户信息不存在");
              sysUser.setBalance(sysUser.getBalance().subtract(total));
              sysUserRepository.updateById(sysUser);
              return sysUser;
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
         @Override
          public SysOrder sale(SysOrder sysOrder) {
              sysOrder.setOrderNo(UUID.randomUUID().toString());
              sysOrderRepository.insert(sysOrder);
              return sysOrder;
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
       @Override
          public SysStock cutDown(BigDecimal count, String skuCode) {
              SysStock sysStock = sysStockRepository.selectOne(new QueryWrapper<SysStock>().eq("sku_code", skuCode));
              sysStock.setCount(sysStock.getCount().subtract(count));
              sysStockRepository.updateById(sysStock);
              return sysStock;
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    5. 启动服务,模拟发送下单请求
      在seata控制台可以看到相关事务信息
      在这里插入图片描述

  • 相关阅读:
    十八、openlayers官网示例Custom Animation解析——地图上添加自定义动画
    Excel数据表定制分组排序
    计算机MSVCP90.dll怎么重新安装?MSVCP90.dll丢失的解决方法分享
    Spring Cloud 微服务系列文章合集,一次性看个够!
    USB协议层数据格式
    mysql的监控大屏
    SpringBoot开发实用篇
    深入理解synchronized关键字
    搭建Redis集群
    Vue基础语法2&事件修饰符&按键修饰符&常用控件&自定义指令&全局&样式绑定
  • 原文地址:https://blog.csdn.net/qq_44808472/article/details/126450767