一、什么是事务分组和集群
事务分组:可以按微服务的需要,在应用程序(客户端)中对自行定义的事务进行分组,每组取一个名字,这个事务分组仅仅是seata的逻辑资源上的,其实是不存在的。
集群:seata服务端一个或多个节点组成的cluster(集群),应用程序(客户端)使用时需要指定事务逻辑分组与seata服务端集群的映射关系。
二、事务分组如何找到Seata服务端集群
1、首先应用程序(客户端)通过配置文件中的seata.tx-service-group属性配置了事务分组名
2、应用程序(客户端)会通过用户配置的配置中心在配置列表中去寻找service.vgroupMapping.[事务分组名]这么一个配置项,取得配置项的值就是TC集群的名称。如果应用程序是一个Spring Boot项目,则通过seata.service.vgroup-mapping.事务分组名=集群名称这么一个配置项获取TC集群的名称。
3、拿到TC集群名称后应用程序通过一定的前后缀+集群名称去构造服务名,各个注册中心服务名的实现是不同的。(前提是seata服务端已经在注册中心中完成服务注册,并且seata服务端向注册中心报告的cluster名与应用程序(客户端)配置的集群名称一致)
4、拿到服务名去相应的注册中心去拉取相应服务名的服务列表,获得后端真实的TC服务列表(即seata服务端集群节点列表)
三、为什么这么设计,不直接取服务名
这里多了一层获取事务分组到映射集群的配置,这样设计后事务分组可以作为资源的逻辑隔离单位,当某集群出现故障时可以快速进行failover(失效转移),只切换对应的事务分组,就可以把故障缩减到服务级别,但前提是需要有足够的seata服务端集群。
四、Seata服务端的集群配置
seata:
config:
type: nacos # 使用nacos作为配置中心
nacos:
server-addr: 192.168.1.108:28999 # nacos配置中心IP:端口
namespace: 93be67df-a5f5-42b6-89cb-e8f048782963 # nacos命名空间id,""为nacos保留public空间控件,用户勿配置namespace = "public"
group: SEATA_GROUP # nacos配置中心的分组名
username: nacos # 指定nacos服务的登录账号
password: nacos # 指定nacos服务的登录密码
data-id: seataServer.properties #