一、seata服务端搭建同上篇。
二、seata客户端的结构
1.示例DEMO工程 下单,扣余额, 减库存。

2. MAVEN配置。
父工程:由于spring-cloud-starter-alibaba-seata依赖的seata-spring-boot-starter项目版本太低,所以要排除,使用1.4.2的版本。
- <seata.version>1.4.2</seata.version>
- <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
-
- <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>
-
- <dependency>
- <groupId>io.seata</groupId>
- <artifactId>seata-spring-boot-starter</artifactId>
- <version>${seata.version}</version>
- </dependency>
子模块:只需要引入基本的WEB框架。
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <!--eureka client-->
- <!-- <dependency>-->
- <!-- <groupId>org.springframework.cloud</groupId>-->
- <!-- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
- <!-- </dependency>-->
-
-
-
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
3.配置文件
BOOTSTRAP配置
- spring.profiles.active=dev
- #spring.application.name=joyday
-
-
-
- spring.cloud.nacos.username=nacos
- spring.cloud.nacos.password = nacos
- spring.cloud.nacos.config.file-extension=properties
- spring.cloud.nacos.config.group=DEFAULT_GROUP
- spring.cloud.nacos.config.server-addr=127.0.0.1:8848
- spring.cloud.nacos.discovery.group=DEFAULT_GROUP
- spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.config.server-addr}
-
- seata.config.nacos.data-id=storageServerSeata.properties
- seata.config.nacos.group=MALL_GROUP
- seata.config.nacos.namespace=seata
- seata.config.nacos.server-addr=${spring.cloud.nacos.config.server-addr}
- seata.config.nacos.username=${spring.cloud.nacos.username}
- seata.config.nacos.password=${spring.cloud.nacos.password}
- seata.config.type=nacos
-
- seata.registry.nacos.application=seata-server
- seata.registry.nacos.group=SEATA_GROUP
- seata.registry.nacos.namespace=seata
- seata.registry.nacos.server-addr=${spring.cloud.nacos.config.server-addr}
- seata.registry.nacos.username=${spring.cloud.nacos.username}
- seata.registry.nacos.password=${spring.cloud.nacos.password}
- seata.registry.type=nacos
-
- seata.tx-service-group=mall_tx_group
- seata.enableAutoDataSourceProxy=false
这次引入的SEATA配置中心要特别注意,data-id无效,被直接用具体的KEY所覆盖了,所以只能直接配置具体的TEXT类型KEY。

SEATA注册中心的目的为从NACOS中寻找服务名为seata-server的服务的实例,作为SEATA的服务端。

这里还有一个细节要特别注意,首先程序中配置了事务分组,程序会通过用户配置的配置中心去寻找service.vgroupMapping .事务分组配置项,取得配置项的值就是TC集群的名称,

这里就是DEFAULT,所以SEATA的服务端就必须注册到集群名称为DEFAULT否则客户端找不到集群。

拿到集群名称程序通过一定的前后缀+集群名称去构造服务名,各配置中心的服务名实现不同。拿到服务名去相应的注册中心去拉取相应服务名的服务列表,获得后端真实的TC服务列表。 3.为什么这么设计,不直接取服务名? 这里多了一层获取事务分组到映射集群的配置。这样设计后,事务分组可以作为资源的逻辑隔离单位,当发生故障时可以快速failover。
三.SEATA读取NACOS配置流程分析。
1.初始化全局事务扫描器,从这里可以看到
SeataProperties的参数不能在NACOS配置。是由seata-springboot-start来自动配置的。
因为我们是用的TCC模式,所以不需要做数据源代理,也不会影响程序性能。
seata.enableAutoDataSourceProxy=false

2.初始化NACOS配置实例。


3.获取NACOS中某个KEY的配置

先读本地, 没有去远程NACOS服务器请求接口

这里我们看到从NACOS读到的配置数据。
这里特别有一点,会根据事务分组,从NACOS注册中心获取SEATA服务端的集群的IP信息。


接下来我们看到,读到了我们的自定义集群名称。
