• springcloud alibaba 整合seata的TCC


    一、seata服务端搭建同上篇。

    Seata的AT模式客户端两阶段提交流程源码分析

    二、seata客户端的结构

    1.示例DEMO工程 下单,扣余额, 减库存。

    2. MAVEN配置。

        父工程:由于spring-cloud-starter-alibaba-seata依赖的seata-spring-boot-starter项目版本太低,所以要排除,使用1.4.2的版本。

    1. <seata.version>1.4.2</seata.version>
    2. <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
    3. <dependency>
    4. <groupId>com.alibaba.cloud</groupId>
    5. <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    6. <!-- 排除依赖,指定版本和服务端一致 -->
    7. <exclusions>
    8. <exclusion>
    9. <groupId>io.seata</groupId>
    10. <artifactId>seata-spring-boot-starter</artifactId>
    11. </exclusion>
    12. </exclusions>
    13. </dependency>
    14. <dependency>
    15. <groupId>io.seata</groupId>
    16. <artifactId>seata-spring-boot-starter</artifactId>
    17. <version>${seata.version}</version>
    18. </dependency>

    子模块:只需要引入基本的WEB框架。

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-web</artifactId>
    5. </dependency>
    6. <!--eureka client-->
    7. <!-- <dependency>-->
    8. <!-- <groupId>org.springframework.cloud</groupId>-->
    9. <!-- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
    10. <!-- </dependency>-->
    11. <dependency>
    12. <groupId>org.springframework.boot</groupId>
    13. <artifactId>spring-boot-starter-test</artifactId>
    14. <scope>test</scope>
    15. </dependency>
    16. <dependency>
    17. <groupId>junit</groupId>
    18. <artifactId>junit</artifactId>
    19. <version>4.12</version>
    20. <scope>test</scope>
    21. </dependency>
    22. </dependencies>

    3.配置文件

    BOOTSTRAP配置

    1. spring.profiles.active=dev
    2. #spring.application.name=joyday
    3. spring.cloud.nacos.username=nacos
    4. spring.cloud.nacos.password = nacos
    5. spring.cloud.nacos.config.file-extension=properties
    6. spring.cloud.nacos.config.group=DEFAULT_GROUP
    7. spring.cloud.nacos.config.server-addr=127.0.0.1:8848
    8. spring.cloud.nacos.discovery.group=DEFAULT_GROUP
    9. spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.config.server-addr}
    10. seata.config.nacos.data-id=storageServerSeata.properties
    11. seata.config.nacos.group=MALL_GROUP
    12. seata.config.nacos.namespace=seata
    13. seata.config.nacos.server-addr=${spring.cloud.nacos.config.server-addr}
    14. seata.config.nacos.username=${spring.cloud.nacos.username}
    15. seata.config.nacos.password=${spring.cloud.nacos.password}
    16. seata.config.type=nacos
    17. seata.registry.nacos.application=seata-server
    18. seata.registry.nacos.group=SEATA_GROUP
    19. seata.registry.nacos.namespace=seata
    20. seata.registry.nacos.server-addr=${spring.cloud.nacos.config.server-addr}
    21. seata.registry.nacos.username=${spring.cloud.nacos.username}
    22. seata.registry.nacos.password=${spring.cloud.nacos.password}
    23. seata.registry.type=nacos
    24. seata.tx-service-group=mall_tx_group
    25. 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信息。

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

  • 相关阅读:
    微信开发工具构建npm and git切换分支
    网络安全观察报告 攻击态势
    RuntimeError: size of dimension does not match previous size, operand 1, dim 1
    基于SpringBoot的网上摄影工作室
    MySQL慢查询优化、索引优化和表优化总结
    深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序 计算机竞赛
    技术学习:Python(14)|爬虫requests库
    react的高阶组件怎么用?
    基于STM32F469 discovery kit 开发板的开发2
    【汇编】Loop指令、段前缀
  • 原文地址:https://blog.csdn.net/lipengyao2010/article/details/138001730