一、seata服务端搭建同上篇。
Seata的AT模式客户端两阶段提交流程源码分析
二、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信息。
接下来我们看到,读到了我们的自定义集群名称。