编程人 cdmana.com

SpringCloud Alibaba Seata安装配置,使用Nacos为配置中心

下载安装

官网下载地址:https://github.com/seata/seata/releases
下载下来解压即可,目前最新版本为1.4.0(下载服务包和源码包)

概念介绍

seata分布式事务解决方案在使用中分为server端和client端。

  1. server端:就是下载的seata,配置好后直接启动运行。
  2. client端:需要业务系统集成seata。

主要配置文件registry.conf。
Server端存储模式(store.mode)现有file、db、redis三种(后续将引入raft,mongodb),file模式无需改动,直接启动即可,下面专门讲下db和redis启动步骤。
注: file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高;

db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;

redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置.
在这里插入图片描述
注册中心

  1. 什么是注册中心?
    注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用.比如Seata Client端(TM,RM),发现Seata Server(TC)集群的地址,彼此通信.
  2. Seata的注册中心与Dubbo,Spring cloud的注册中心区别是?
    在广义上来说,并无区别,只不过Dubbo与Spring cloud的注册中心仅是作用于它们自身的组件,而Seata的注册中心也是一样是作用于Seata自身.(注:Dubbo与Spring cloud的注册中心与Seata无关)

配置中心

  1. 什么是配置中心?
    配置中心可以说是一个"大衣柜",内部放置着各种配置文件,你可以通过自己所需进行获取配置加载到对应的客户端.比如Seata Client端(TM,RM),Seata Server(TC),会去读取全局事务开关,事务会话存储模式等信息.
  2. Seata的配置中心与Spring cloud的配置中心区别是?
    在广义上来说,并无区别,只不过Spring cloud的配置中心仅是作用于它们自身的组件,而Seata的配置中心也是一样是作用于Seata自身.(注:Spring cloud的配置中心与Seata无关)

事务分组

  1. 事务分组是什么?
    事务分组是seata的资源逻辑,类似于服务实例。在file.conf中的my_test_tx_group就是一个事务分组。

  2. 通过事务分组如何找到后端集群?

  • 首先程序中配置了事务分组(GlobalTransactionScanner 构造方法的txServiceGroup参数)
  • 程序会通过用户配置的配置中心去寻找service.vgroupMapping .[事务分组配置项],取得配置项的值就是TC集群的名称
  • 拿到集群名称程序通过一定的前后缀+集群名称去构造服务名,各配置中心的服务名实现不同
  • 拿到服务名去相应的注册中心去拉取相应服务名的服务列表,获得后端真实的TC服务列表
  1. 为什么这么设计,不直接取服务名?
    这里多了一层获取事务分组到映射集群的配置。这样设计后,事务分组可以作为资源的逻辑隔离单位,出现某集群故障时可以快速failover,只切换对应分组,可以把故障缩减到服务级别,但前提也是你有足够server集群。

SpringCloud项目整合Seata

maven依赖 官方推荐依赖方式(默认项目已经使用Nacos)
   			<!-- 集成seata分布式事务 -->
			<dependency>
                <groupId>io.seata</groupId>
                <artifactId>seata-spring-boot-starter</artifactId>
                <version>1.4.0</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
                <version>项目中spring-cloud-alibaba的版本</version>
                <exclusions>
                    <exclusion>
                        <groupId>io.seata</groupId>
                        <artifactId>seata-spring-boot-starter</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!-- seata注册配置中心 -->
			<dependency>
				<groupId>com.alibaba.nacos</groupId>
				<artifactId>nacos-client</artifactId>
				<version>1.3.2</version>
			</dependency>
修改server端registry.conf配置(注册中心和配置中心使用nacos)
  1. 在nacos控制台中创建一个新的命名空间seata(记住这个ID
    在这里插入图片描述
  2. 配置server端注册中心和配置中心
registry {
	  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
	  type = "nacos"
	  loadBalance = "RandomLoadBalance"
	  loadBalanceVirtualNodes = 10
	
	  nacos {
	    application = "seata-server"
	    serverAddr = "127.0.0.1:8848"
	    group = "SEATA_GROUP"
	    namespace = "naocs中命名空间ID"
	    cluster = "default"
	    username = "nacos登录账号"
	    password = "nacos登录密码"
	  }
}
config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"
  
  nacos {
    serverAddr = "127.0.0.1:8848"
    namespace = "naocs中命名空间ID"
    group = "SEATA_GROUP"
    username = "nacos"
    password = "nacos"
  }

上传配置到至Nacos配置中心,在下载的源码包中seata-source-1.4.0\script\config-center文件夹下。在这里插入图片描述
config.txt是官方配置好的参数,直接使用nacos文件里面的脚本上传配置即可。参数介绍

./nacos/nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 命名空间ID -u nacos账号-w nacos密码

官方教程连接
上传成功后,就可以在nacos上面看见了
在这里插入图片描述

  1. 配置client端注册中心和配置中心
    在项目的通用配置application.yml中配置(也可以在要使用seata的每个服务里面的application,yml中配置)
# seata配置
seata:
  registry:
    type: nacos
    # 复制的seata config文件夹里面的registry.conf内容
    nacos:
      # 和server端中application一致
      application: "seata-server"
      serverAddr: localhost:8848
      group: "SEATA_GROUP"
      namespace: "命名空间ID"
      cluster: "default"
      username: "nacos账号"
      password: "nacos密码"
  config:
    type: nacos
    nacos:
      serverAddr: localhost:8848
      group: "SEATA_GROUP"
      namespace: "命名空间ID"
      username: "nacos账号"
      password: "nacos密码"     

然后在需要使用seata的服务中配置参数(比如有订单模块和用户模块)

mall-order-dev.yml

# seata事务分组
seata:
  tx-service-group: mall-order-seata-group

mall-user-dev.yml

# seata事务分组
seata:
  tx-service-group: mall-user-seata-group

然后修改nacos中的配置
在这里插入图片描述

  1. 最后使用
    在需要处理分布式事务的类上面添加
    @GlobalTransactional(rollbackFor = Exception.class)即可(默认是AT模式)

参考资料

Seata 官网
Seata GitHub地址

Scroll to Top