微服务实战 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
    
  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
    
  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;
      
    • 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);
      
      
    • 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);
      
  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
    
     @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;
        }
    
       @Override
        public SysOrder sale(SysOrder sysOrder) {
            sysOrder.setOrderNo(UUID.randomUUID().toString());
            sysOrderRepository.insert(sysOrder);
            return sysOrder;
        }
    
     @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;
        }
    
  5. 启动服务,模拟发送下单请求
    在seata控制台可以看到相关事务信息
    在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1999

每人一点点,明天会更好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值