使用springCloud+Seata+Nacos实现分布式事务,并通过docker进行部署

本文关注点主要放在了分布式框架Seata及对其服务进行docker部署上,如果想要了解Nacos,可以通过以下链接了解:

Nacos官方Git地址:https://github.com/alibaba/nacos

Nacos官方文档地址:https://nacos.io/zh-cn/docs/

1、Seata相关文档及下载地址

Seata项目github地址:https://github.com/seata/seata

Seata中间件下载地址:https://github.com/seata/seata/releases

Seata中文官方文档:http://seata.io/zh-cn/

Seata官方示例:https://github.com/seata/seata-samples

2、Seata-server的部署

Seata支持两种事务日志存储方式:file和db模式。file模式是本地单机模式,无法支持HA,seata默认的也是这种模式。本文采取的是支持HA的db模式。

修改配置中心的配置

本文使用Nacos作为注册中心和配置中心。在官方链接 https://github.com/seata/seata/tree/1.1.0/script/config-center
中,该链接下的config.txt文件包含Seata常用的所有配置项,我们需要修改相关项目:

//该项修改为相应客户端中spring.cloud.alibaba.seata.tx-service-group的值,有多个客户端就添加多个
//例如在官方示例springcloud-nacos-seata中order-service和storage-service中spring.cloud.alibaba.seata.tx-service-group的值
//分别为order-service-group、storage-service-group,则需要将该项配置为service.vgroupMapping.order-service-group=default
//和service.vgroupMapping.storage-service-group=default
service.vgroupMapping.my_test_tx_group=default
//事务日志存储模式
store.mode=db
//数据库配置项
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
//配置自己相应的url,user,password
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true
store.db.user=root
store.db.password=root

在上面链接的/nacos目录下,有如下两个脚本:
image.png

使用其中一个脚本就可以将config.txt中配置项导入到指定的nacos中。

sh nacos-config.sh 127.0.0.1(nacos配置中心地址)或者Python nacos-config.py 127.0.0.1

导入成功后,在nacos管理后台可以看到配置项:


image.png
创建事务日志数据库

使用Seata的db模式需要创建相应的数据库seata以及对应的表

//全局事务表
global_table
//分支子事务表
branch_table
//全局锁表
lock_table

在官方链接 https://github.com/seata/seata/tree/develop/script/server/db
下有相应的脚本可以使用。

docker部署seata-sever

本文使用官方示例进行演示,官方的springcloud-nacos-seata示例中使用的是

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-seata</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-all</artifactId>
            <version>1.1.0</version>
        </dependency>

Seata不同版本的依赖关系可以查询官方文档进行了解。客户端使用的Seata 1.1.0版本,为了\color{red}{ 保持版本一致},选用seataio/seata-server:1.1.0镜像(这一点很重要,笔者刚开始拉取的是seataio/seata-server:latest镜像,客户端启动后一直报“no available service 'default' found, please make sure registry config correct”错误,很难发现的错误。)

docker compose启动

yaml文件示例:

version: "3"
services:
  seata-server:
    image: seataio/seata-server:1.1.0
    container_name: seata-server
    ports:
      - "8091:8091"
    environment:
      - SEATA_IP=127.0.0.1 //seata-server启动的IP,用于向注册中心注册使用,默认使用容器IP可能无法与客户端通讯
      - SEATA_PORT=8091 //seata-server启动端口,默认8091

使用该yaml文件启动Seata-server,默认使用的是file模式,无法注册到nacos中和读取nacos中配置。需要进入到容器中修改/seata-server/resources目录下的registry.config文件:

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

  nacos {
  #修改为nacos的ip,默认使用容器ip,可能无法通讯
    serverAddr = "127.0.0.1"
    namespace = ""
    cluster = "default"
  }
  eureka {
    serviceUrl = "http://localhost:8761/eureka"
    application = "default"
    weight = "1"
  }
  redis {
    serverAddr = "localhost:6379"
    db = "0"
  }
  zk {
    cluster = "default"
    serverAddr = "127.0.0.1:2181"
    session.timeout = 6000
    connect.timeout = 2000
  }
  consul {
    cluster = "default"
    serverAddr = "127.0.0.1:8500"
  }
  etcd3 {
    cluster = "default"
    serverAddr = "http://localhost:2379"
  }
  sofa {
    serverAddr = "127.0.0.1:9603"
    application = "default"
    region = "DEFAULT_ZONE"
    datacenter = "DefaultDataCenter"
    cluster = "default"
    group = "SEATA_GROUP"
    addressWaitTime = "3000"
  }
  file {
    name = "file.conf"
  }
}

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

  nacos {
  #修改为nacos的ip,默认使用容器ip,可能无法通讯
    serverAddr = "127.0.0.1"
    namespace = ""
    group = "SEATA_GROUP"
  }
  consul {
    serverAddr = "127.0.0.1:8500"
  }
  apollo {
    app.id = "seata-server"
    apollo.meta = "http://192.168.1.204:8801"
    namespace = "application"
  }
  zk {
    serverAddr = "127.0.0.1:2181"
    session.timeout = 6000
    connect.timeout = 2000
  }
  etcd3 {
    serverAddr = "http://localhost:2379"
  }
  file {
    name = "file.conf"
  }
}

registry.conf修改完成只有重启容器即可(docker restart seata-server)。

为了便于后期的修改与维护,笔者将容器类的配置文件挂载到本地修改yaml文件为:

version: "3"
services:
  seata-server:
    image: seataio/seata-server:1.1.0
    container_name: seata-server
    volumes:
      - "d:/docker/docker-compose/seata/resources1.1.0:/seata-server/resources"
    ports:
      - "8091:8091"
    environment:
      - SEATA_IP=127.0.0.1
      - SEATA_PORT=8091
客户端配置
  1. 在客户端配置中要注意的是,需要将registry.config文件放到resource目录下,并与服务端保持一致。
  2. spring.cloud.alibaba.seata.tx-service-group配置的值与服务端保持一致。
  3. 客户端数据库配置:每个服务都需要有相应的业务表和undo_log表,脚本可以查看链接下的readme。

容易踩到的坑及解决方法

  1. Seata不同版本依赖关系,可以查询官方文档了解。
  2. server端的配置service.vgroupMapping.my_test_tx_group=default,需要注意两点:
  • 在1.1.0版本前后的命名方式不同,之前为service.vgroup_mapping.my_test_tx_group=default
  • my_test_tx_group为spring.cloud.alibaba.seata.tx-service-group的值,不然会报“no available service 'null' found, please make sure registry config”。
  1. 使用容器部署时,配置nacos等注册中心和配置中心地址时,不要默认使用容器IP。
  2. 镜像版本与客户端版本保持一致。

本文是在笔者在配置Seata过程中的记录,有不同观点和错误之处,请指出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,444评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,867评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,157评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,312评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,673评论 3 289
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,802评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,010评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,743评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,470评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,696评论 2 250
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,187评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,538评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,188评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,127评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,889评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,741评论 2 274

推荐阅读更多精彩内容