springcloud实战---整合seata1.4.2(部署与报错解决)

博主随记,供大家参考


前言

  博主本人在参考了黑马的视频后,进行了springcloud整合seata1.4.2的实践,结果是频频报错,在参考与使用了官网的部署后还是出现了很多奇怪的报错,经过两天的部署终于部署完成,整理出了一份正确的部署方案和全方案的报错解决供大家参考。


一、下载seata-server?

下载并解压seata1.4.2,seata下载地址:https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip

二、下载nacos

nacos下载地址:Releases · alibaba/nacos · GitHub

windows环境下,在nacos/bin目录下,进入dos输入命令startup.cmd -m standalone启动nacos

三、创建mysql数据库表

新建数据库seata,然后选择seata数据库创建表

代码如下:

CREATE TABLE IF NOT EXISTS `global_table`
(
    `xid`                       VARCHAR(128) NOT NULL,
    `transaction_id`            BIGINT,
    `status`                    TINYINT      NOT NULL,
    `application_id`            VARCHAR(32),
    `transaction_service_group` VARCHAR(32),
    `transaction_name`          VARCHAR(128),
    `timeout`                   INT,
    `begin_time`                BIGINT,
    `application_data`          VARCHAR(2000),
    `gmt_create`                DATETIME,
    `gmt_modified`              DATETIME,
    PRIMARY KEY (`xid`),
    KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),
    KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
    `branch_id`         BIGINT       NOT NULL,
    `xid`               VARCHAR(128) NOT NULL,
    `transaction_id`    BIGINT,
    `resource_group_id` VARCHAR(32),
    `resource_id`       VARCHAR(256),
    `branch_type`       VARCHAR(8),
    `status`            TINYINT,
    `client_id`         VARCHAR(64),
    `application_data`  VARCHAR(2000),
    `gmt_create`        DATETIME(6),
    `gmt_modified`      DATETIME(6),
    PRIMARY KEY (`branch_id`),
    KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
    `row_key`        VARCHAR(128) NOT NULL,
    `xid`            VARCHAR(128),
    `transaction_id` BIGINT,
    `branch_id`      BIGINT       NOT NULL,
    `resource_id`    VARCHAR(256),
    `table_name`     VARCHAR(32),
    `pk`             VARCHAR(36),
    `gmt_create`     DATETIME,
    `gmt_modified`   DATETIME,
    PRIMARY KEY (`row_key`),
    KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

CREATE TABLE IF NOT EXISTS `distributed_lock`
(
    `lock_key`       CHAR(20) NOT NULL,
    `lock_value`     VARCHAR(20) NOT NULL,
    `expire`         BIGINT,
    primary key (`lock_key`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);
 

四、修改seata-server-1.4.2配置文件

1.配置注册中心

在seata-server-1.4.2/conf文件下修改registry.conf文件,加入注册中心配置:

registry {
  type = "nacos"

  nacos {
    application = "seata-server"         #注册在nacos的服务名
    serverAddr = "127.0.0.1:8848"    #nacos服务的地址端口
    group = "SEATA_GROUP"          #注册在nacos的分组
    namespace = ""                           #指定在nacos的命名空间
    cluster = "default"                        #集群 使用default
    username = "nacos"                    #nacos用户名
    password = "nacos"                     #nacos密码
  }
}

2.配置-配置中心

在seata-server-1.4.2/conf文件下修改registry.conf文件,加入配置中心配置:

config {
  type = "nacos"

   nacos {
    serverAddr = "127.0.0.1:8848"            #配置中心(nacos的地址)
    namespace = ""                                   #配置中心的命名空间
    group = "SEATA_GROUP"                  #配置中心的分组
    username = "nacos"                            #nacos用户名
    password = "nacos"                             #nacos密码
    dataId = "seataServer.properties"        #nacos的seata配置文件的dataId
  }    

}

  大家可能像我一样迷惑,配置配置中心和注册中心的代码很相似,啥是注册中心?啥是配置中心呢?有啥不一样的?

   注册中心就是将seata服务注册在nacos的服务列表,使用nacos管理更加的方便,而配置中心是我们将seata的配置配置在nacos的配置中心中,这样seata就可以直接在nacos中拉取配置,避免了seata集群需要配置整个集群每个服务的配置文件的问题,加快了部署效率。

五、添加seata-server的配置文件

新建配置dataId为seataServer.properties、分组为SEATA_GROUP、配置格式为properties

properties配置文件内容如下:

# 数据存储方式,db代表数据库

store.mode=db

store.db.datasource=druid

store.db.dbType=mysql

store.db.driverClassName=com.mysql.cj.jdbc.Driver

store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=TRUE&serverTimezone=GMT%2B8

store.db.user=root

store.db.password=123456

store.db.minConn=5

store.db.maxConn=30

store.db.globalTable=global_table

store.db.branchTable=branch_table

store.db.queryLimit=100

store.db.lockTable=lock_table

store.db.maxWait=5000

# 事务、日志等配置

server.recovery.committingRetryPeriod=1000

server.recovery.asynCommittingRetryPeriod=1000

server.recovery.rollbackingRetryPeriod=1000

server.recovery.timeoutRetryPeriod=1000

server.maxCommitRetryTimeout=-1

server.maxRollbackRetryTimeout=-1

server.rollbackRetryTimeoutUnlockEnable=false

server.undo.logSaveDays=7

server.undo.logDeletePeriod=86400000

# 客户端与服务端传输方式

transport.serialization=seata

transport.compressor=none

# 关闭metrics功能,提高性能

metrics.enabled=false

metrics.registryType=compact

metrics.exporterList=prometheus

metrics.exporterPrometheusPort=9898

1.天大的坑

注意这里还有一个天大的坑!!!需要在nacos配置中心添加一个配置service.vgroupMapping.my_text_tx_group,分组为SEATA_GROUP内容为text格式的default

这可能是一个bug,浪费我两天的时间才解决,如果不配置这个在启动微服务的项目的时候会报错找不到服务:no available service found in cluster ‘XXXXX‘

注意这个报错: Error creating bean with name 'globalTransactionScanner' defined in class path resource......

这个报错应该是垃圾的回收机制导致的问题,在项目的配置中加入:

--add-opens java.base/java.lang=ALL-UNNAMED  可以解决问题

六、微服务项目整合seata

1.在每个服务引入pom依赖(博主自行配置,供大家参考)

<!--seata依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <exclusions>
                <exclusion>
                    <!--版本较低排除-->
                    <groupId>io.seata</groupId>
                    <artifactId>seata-spring-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--seata 1.42版本-->
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <version>${seata.version}</version>
        </dependency>
        <!--参考官网的依赖配置-->
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>1.4.2</version>
        </dependency>

2.在yml文件中配置项目的配置文件

seata:
  tx-service-group: my_test_tx_group  #对应seataServer.properties中的service.vgroupMapping.my_test_tx_group 集群分组
  registry:
    type: nacos   #注册中心类型:nacos
    nacos:
      application: seata-server      # seata-server注册在nacos中的服务名
      server-addr: 127.0.0.1:8848    # nacos的地址端口
      group : SEATA_GROUP            # seata-server在nacos的分组
      namespace: ""          # seata-server在nacos的命名空间ID
      username: nacos                # nacos账号
      password: nacos                # nacos密码
  config:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      group: SEATA_GROUP
      namespace: ""                # seata-server的配置文件的命名空间ID
      dataId: seataServer.properties       # seata-server在nacos的配置dataId
      username: nacos
      password: nacos

七、启动测试

启动nacos:startup.cmd -m standalone,后启动seata,观察nacos的服务列表和注册列表:

seata启动成功为:

观察nacos的配置中心和注册中心:

之后启动微服务的项目观察seata的日志:

如图则为seata整合成功。


总结

seata的整合确实比较费劲,因为这几天练习科目二导致两天才配置完成,因为各种的报错等等问题,总之希望对大家能有一定的帮助。

  • 37
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

载着梦想的猪

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值