dynamic-datasource 多数据源 seata 分布式事务 dubbo微服务框架环境配置

dynamic-datasource 多数据源 seata 分布式事务 dubbo微服务框架环境配置

在开发中dubbo需要引入seata来进行分布式事务管理,查了很多文章,都是seata版本比较老旧等文章环境配起来很麻烦,踩了不少坑,浪费了不少时间,记录一下。

一.安装seata服务端

百度很多文章都是seata版本老旧等文章,有的还需要自己手动添加zookeeper节点。
因此我们使用“seata官方提供的最新版本1.4.0(https://seata.io/zh-cn/blog/download.html)
1.下载完成后修改conf目录下的
file.conf文件

transport {
  # tcp udt unix-domain-socket
  type = "TCP"
  #NIO NATIVE
  server = "NIO"
  #enable heartbeat
  heartbeat = true
  # the client batch send request enable
  enableClientBatchSendRequest = true
  #thread factory for netty
  threadFactory {
    bossThreadPrefix = "NettyBoss"
    workerThreadPrefix = "NettyServerNIOWorker"
    serverExecutorThread-prefix = "NettyServerBizHandler"
    shareBossWorker = false
    clientSelectorThreadPrefix = "NettyClientSelector"
    clientSelectorThreadSize = 1
    clientWorkerThreadPrefix = "NettyClientWorkerThread"
    # netty boss thread size,will not be used for UDT
    bossThreadSize = 1
    #auto default pin or 8
    workerThreadSize = "default"
  }
  shutdown {
    # when destroy server, wait seconds
    wait = 3
  }
  serialization = "seata"
  compressor = "none"
}
service {
  #transaction service group mapping
  vgroupMapping.my_test_tx_group = "default"
  #only support when registry.type=file, please don't set multiple addresses
  default.grouplist = "127.0.0.1:8091"
  #degrade, current not support
  enableDegrade = false
  #disable seata
  disableGlobalTransaction = false
}

client {
  rm {
    asyncCommitBufferLimit = 10000
    lock {
      retryInterval = 10
      retryTimes = 30
      retryPolicyBranchRollbackOnConflict = true
    }
    reportRetryCount = 5
    tableMetaCheckEnable = false
    reportSuccessEnable = false
  }
  tm {
    commitRetryCount = 5
    rollbackRetryCount = 5
  }
  undo {
    dataValidation = true
    logSerialization = "jackson"
    logTable = "undo_log"
  }
  log {
    exceptionRate = 100
  }
}

2.然后修改registry.conf文件

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "zk"

  nacos {
    application = "seata-server"
    serverAddr = "localhost"
    namespace = ""
    username = ""
    password = ""
  }
  eureka {
    serviceUrl = "http://localhost:8761/eureka"
    weight = "1"
  }
  redis {
    serverAddr = "localhost:6379"
    db = "0"
    password = ""
    timeout = "0"
  }
  zk {
    serverAddr = "127.0.0.1:2181"
    sessionTimeout = 6000
    connectTimeout = 2000
    username = ""
    password = ""
  }
  consul {
    serverAddr = "127.0.0.1:8500"
  }
  etcd3 {
    serverAddr = "http://localhost:2379"
  }
  sofa {
    serverAddr = "127.0.0.1:9603"
    region = "DEFAULT_ZONE"
    datacenter = "DefaultDataCenter"
    group = "SEATA_GROUP"
    addressWaitTime = "3000"
  }
  file {
    name = "file.conf"
  }
}

config {
  # file、nacos 、apollo、zk、consul、etcd3、springCloudConfig
  type = "file"

  nacos {
    serverAddr = "localhost"
    namespace = ""
    group = "SEATA_GROUP"
    username = ""
    password = ""
  }
  consul {
    serverAddr = "127.0.0.1:8500"
  }
  apollo {
    appId = "seata-server"
    apolloMeta = "http://192.168.1.204:8801"
    namespace = "application"
  }
  zk {
    serverAddr = "127.0.0.1:2181"
    sessionTimeout = 6000
    connectTimeout = 2000
    username = ""
    password = ""
  }
  etcd3 {
    serverAddr = "http://localhost:2379"
  }
  file {
    name = "file.conf"
  }
}

type修改为你是用的注册中心(我这边用的zookeeper就修改为zk)

3.切换bin目录直接命令运行seata-server.sh(.bat)可执行文件,运行时保证注册中心已启动
4.新增seata所需的数据库表

DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

二.在pom文件中引入seata包

		<dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <version>1.4.0</version>
        </dependency>

这里引入seata和springboot的整合包。

dynamic-datasource
我这里已经引入过dynamic-datasource多数据源的等依赖了,这些百度有详细配置自行引入

三.修改Springboot的yml配置

spring:
  boot:
    admin:
      client:
        url: http://127.0.0.1:8180
        instance:
          prefer-ip: true
          service-base-url: http://127.0.0.1:${server.port}
  datasource:
    dynamic:
      primary: db1 #设置默认的数据源或者数据源组,默认值即为master
      strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
      seata: true #seata1.0之后支持自动代理 这里直接配置true
      seata-mode: at #seata模式使用的at
      datasource:
        db1: # 数据源1配置
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/test1
          username: root
          password: root
        db2: # 数据源2配置
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/test2
          username: root
          password: root
seata:
  service:
    grouplist:
      default: 127.0.0.1:8091
    vgroup-mapping:
      my_test_tx_group: default
      enable-degrade: false
      disable-global-transaction: false
  enabled: true
  application-id: ${dubbo.application.id} #这里填你服务的id
  tx-service-group: my_test_tx_group #这里填seata服务端 file.conf里 service vgroupMapping.{分组名}
  client:
    tm:
      commit-retry-count: 3
      rollback-retry-count: 3
      enable-auto-data-source-proxy: false
    rm:
      report-success-enable: true
      table-meta-check-enable: true
      report-retry-count: 5
      async-commit-buffer-limit: 1000
  transport:
    type: TCP
    server: NIO
    heartbeat: true
    serialization: seata
    compressor: none
    enable-auto-data-source-proxy: true
    shutdown:
      wait: 3
    thread-factory:
      boss-thread-prefix: NettyBoss
      client-worker-thread-prefix: NettyServerNIOWorker
      server-executor-thread-prefix: NettyServerBizHandler
      client-selector-thread-size: 1
      client-selector-thread-prefix: NettyClientWorkerThread          

新版本的seata只需要把上面的yml文件复制到相应位置就可以了

四.开启分布式事务在这里插入图片描述

@GlobalTransactional 开启分布式事务
@DS(“db2") 切换数据源名称“db2”的数据源
在开启的每个分布式事务的方法上标记的数据源,对应的每个数据库中里都需要有一张seata用于回滚的undo_log表,他会记录事务的信息到对应数据源的表中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值