一、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=joydayspring.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=nacosseata.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=nacosseata.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信息。
接下来我们看到,读到了我们的自定义集群名称。