爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      seata-spring-boot-starter 启动配置

      首页 知识中心 服务器 文章详情页

      seata-spring-boot-starter 启动配置

      2024-09-25 10:15:32 阅读次数:49

      spring,事务

      2019年看seata时版本还是0.8,再次接触时已经1.4.2了。

      历史文章:
      ​​​Seata 分布式事务启动配置分析​​​​Seata 分布式事务功能测试(一)​​​​Seata 分布式事务功能测试(二)​​​​Seata 分布式事务功能测试(三)​​

      seata特殊的配置文件形式使得入手很容易蒙,最近看官方博客的部分文档发现可能有不少人都有类似的感觉,最主要的原因就是 ​​registry​​​ 这个配置文件名字起的不好。如果改成 ​​bootstrap​​ 会更容易理解。

      seata支持非常多的配置和服务注册发现方式,想要使用zookeeper,nacos等服务,首先要有一个配置知道如何去连接和使用这些服务。这部分的配置实际上就是 ​​bootstrap​​ 配置,这部分的配置非常少。

      示例环境

      • 框架: Spring Cloud [Alibaba]
      • 配置和注册中心: nacos
      • 使用 seata-spring-boot-starter [1.4.2]

      客户端最简配置

      最简配置就是启动必须用到的配置(包含使用默认值的),其余的配置都需要从配置中心(​​nacos​​​)读取,你在配置文件(​​application.[yaml|properties]​​)配置了也无法生效。

      自动配置类 - 入口配置

      先看 ​​seata-spring-boot-starter​​ 中几个自动配置类的注解:

      @ConditionalOnProperty(prefix = SEATA_PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true)
      public class SeataAutoConfiguration

      @ConditionalOnBean(DataSource.class)
      @ConditionalOnExpression("${seata.enable:true} && ${seata.enableAutoDataSourceProxy:true} && ${seata.enable-auto-data-source-proxy:true}")
      public class SeataDataSourceAutoConfiguration

      @ConditionalOnProperty(prefix = SEATA_PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true)
      @ComponentScan(basePackages = "io.seata.spring.boot.autoconfigure.properties")
      @AutoConfigureBefore({SeataAutoConfiguration.class, SeataDataSourceAutoConfiguration.class})
      public class SeataPropertiesAutoConfiguration

      从这部分我们就已经看到了几个配置,都是开关,而且默认都是 ​​true​​,可以不配置,本文为了知道用到了那些配置,因此全部记录下来:

      seata:
      enable: true # 这是个BUG,官方最新版本已经改成了 enabled,还没发布,想禁用就得写全都设置false
      enabled: true
      enableAutoDataSourceProxy: true
      enable-auto-data-source-proxy: true

      在 Spring Boot 2.0 中,官方文档中推荐使用 ​​enable-auto-data-source-proxy​​​ 这种烤串(用​​-​​​串起来)形式,他可以自动匹配到驼峰和环境变量形式的名字。所以 ​​enable-auto-data-source-proxy​​​ 和 ​​enableAutoDataSourceProxy​​ 代表了相同的含义,因此这里保留烤串,所以变成了两个配置:

      seata:
      enabled: true
      enable-auto-data-source-proxy: true

      在继续从 seata 的入口开始,入口在 ​​io.seata.spring.boot.autoconfigure.SeataAutoConfiguration​​ 代码:

      @Bean
      @DependsOn({BEAN_NAME_SPRING_APPLICATION_CONTEXT_PROVIDER, BEAN_NAME_FAILURE_HANDLER})
      @ConditionalOnMissingBean(GlobalTransactionScanner.class)
      public GlobalTransactionScanner globalTransactionScanner(
      SeataProperties seataProperties, FailureHandler failureHandler) {
      if (LOGGER.isInfoEnabled()) {
      ("Automatically configure Seata");
      }
      return new GlobalTransactionScanner(
      seataProperties.getApplicationId(),
      seataProperties.getTxServiceGroup(), failureHandler);
      }

      这里就已经看到两个配置了 ​​applicationId, txServiceGroup​​​,这两个配置在 spring cloud 中有默认值,在 spring boot 中必须手工配置。 为什么 spring cloud 有默认值,而 spring boot 没有?看 ​​SeataProperties​​ 中的代码:

      @Autowired
      private SpringCloudAlibabaConfiguration springCloudAlibabaConfiguration;

      public String getApplicationId() {
      if (applicationId == null) {
      applicationId = springCloudAlibabaConfiguration.getApplicationId();
      }
      return applicationId;
      }

      public String getTxServiceGroup() {
      if (txServiceGroup == null) {
      txServiceGroup = springCloudAlibabaConfiguration.getTxServiceGroup();
      }
      return txServiceGroup;
      }

      这里多了一层 ​​SpringCloudAlibabaConfiguration​​​,这个类在 ​​Spring Boot​​​ 使用时也存在,但是一般不会配置里面的属性,看​​SpringCloudAlibabaConfiguration​​ 中的代码:

      @Component
      @ConfigurationProperties(prefix = "spring.cloud.alibaba.seata")
      public class SpringCloudAlibabaConfiguration implements ApplicationContextAware {

      private static final Logger LOGGER = LoggerFactory.getLogger(SpringCloudAlibabaConfiguration.class);
      private static final String SPRING_APPLICATION_NAME_KEY = "";
      private static final String DEFAULT_SPRING_CLOUD_SERVICE_GROUP_POSTFIX = "-seata-service-group";
      private String applicationId;
      private String txServiceGroup;
      private ApplicationContext applicationContext;

      /**
      * Gets application id.
      *
      * @return the application id
      */
      public String getApplicationId() {
      if (applicationId == null) {
      applicationId = applicationContext.getEnvironment()
      .getProperty(SPRING_APPLICATION_NAME_KEY);
      }
      return applicationId;
      }

      /**
      * Gets tx service group.
      *
      * @return the tx service group
      */
      public String getTxServiceGroup() {
      if (txServiceGroup == null) {
      String applicationId = getApplicationId();
      if (applicationId == null) {
      LOGGER.warn("{} is null, please set its value", SPRING_APPLICATION_NAME_KEY);
      }
      txServiceGroup = applicationId + DEFAULT_SPRING_CLOUD_SERVICE_GROUP_POSTFIX;
      }
      return txServiceGroup;
      }

      你可以通过 ​​spring.cloud.alibaba.seata.applicationId​​​ 和 ​​spring.cloud.alibaba.seata.tx-service-group​​​ 来配置这两个值,不用 Spring Cloud 时你肯定不这么用。另外如果没有配置这两个值,默认会使用 ​​​​​ 和 ​​${}-seata-service-group​​​ 这两个配置,Spring Cloud 中必须配置 ​​​​,所以默认值有效,Spring Boot中一般没人配置这个,所以没有默认值。

      另外在 seata 中已经不建议使用 ​​spring.cloud.alibaba.seata.applicationId​​​ 和 ​​spring.cloud.alibaba.seata.tx-service-group​​,所以本文忽略这俩配置,直接使用优先级更高的官方推荐配置:

      seata:
      application-id: 应用名
      tx-service-group:

      ​​GlobalTransactionScanner​​ 初始化时会校验上面两个属性必填,所以这俩是必须配置的。


      在 ​​SeataDataSourceAutoConfiguration​​ 中的具体配置中,也有几个存在默认值的配置:

      @Bean(BEAN_NAME_SEATA_DATA_SOURCE_BEAN_POST_PROCESSOR)
      @ConditionalOnMissingBean(SeataDataSourceBeanPostProcessor.class)
      public SeataDataSourceBeanPostProcessor seataDataSourceBeanPostProcessor(SeataProperties seataProperties) {
      return new SeataDataSourceBeanPostProcessor(seataProperties.getExcludesForAutoProxying(), seataProperties.getDataSourceProxyMode());
      }

      /**
      * The bean seataAutoDataSourceProxyCreator.
      */
      @Bean(BEAN_NAME_SEATA_AUTO_DATA_SOURCE_PROXY_CREATOR)
      @ConditionalOnMissingBean(SeataAutoDataSourceProxyCreator.class)
      public SeataAutoDataSourceProxyCreator seataAutoDataSourceProxyCreator(SeataProperties seataProperties) {
      return new SeataAutoDataSourceProxyCreator(seataProperties.isUseJdkProxy(),
      seataProperties.getExcludesForAutoProxying(), seataProperties.getDataSourceProxyMode());
      }

      筛选出来就是:

      seataProperties.isUseJdkProxy(),
      seataProperties.getExcludesForAutoProxying(),
      seataProperties.getDataSourceProxyMode()

      默认值分别为:

      • ​​true​​
      • ​​new String[]{}​​
      • ​​AT​​

      对应的配置为:

      seata:
      use-jdk-proxy: false
      excludes-for-auto-proxying:
      data-source-proxy-mode:

      到这里为止我们能看到所有最浅的一层配置就这几个,其中就俩必须配置的,下面在深入到整个初始化过程中用到的所有配置。


      深入初始化过程

      再深入时,纯静态分析代码已经很难找出所有配置,需要通过动态调试的方式来跟踪出来,下面按照代码执行顺序列出所有配置。

      在 ​​GlobalTransactionScanner​​ 初始化时,有一个字段读取的配置:

      private volatile boolean disableGlobalTransaction = ConfigurationFactory.getInstance().getBoolean(
      ConfigurationKeys.DISABLE_GLOBAL_TRANSACTION, DEFAULT_DISABLE_GLOBAL_TRANSACTION);

      这里需要重点说一下 ​​ConfigurationFactory​​​,当你看到通过 ​​ConfigurationFactory.getInstance()​​​ 调用读取配置时,配置是从配置中心(例如 ​​nacos​​​)读取的。当你看到 ​​ConfigurationFactory.CURRENT_FILE_INSTANCE​​​ 调用读取配置时,就是从启动配置( ​​bootstrap​​ )中读取的。

      所以当上面代码要读取 ​​seata.service.disableGlobalTransaction​​​ 时(默认值 ​​false​​​),因为要从配置中心(​​nacos​​​)读取,所以就要开始初始化 ​​nacos​​​(其他配置中心类似)了,初始化 ​​nacos​​​ 配置中心时,一定会从启动配置( ​​bootstrap​​​)读取 ​​nacos​​ 服务器的信息。

      ​​ConfigurationFactory​​ 初始化

      调用 ​​ConfigurationFactory​​ 方法时,首先会执行该类中的静态方法:

      static {
      load();
      }

      private static void load() {
      String seataConfigName = System.getProperty(SYSTEM_PROPERTY_SEATA_CONFIG_NAME);
      if (seataConfigName == null) {
      seataConfigName = System.getenv(ENV_SEATA_CONFIG_NAME);
      }
      if (seataConfigName == null) {
      seataConfigName = REGISTRY_CONF_DEFAULT;
      }
      String envValue = System.getProperty(ENV_PROPERTY_KEY);
      if (envValue == null) {
      envValue = System.getenv(ENV_SYSTEM_KEY);
      }
      Configuration configuration = (envValue == null) ? new FileConfiguration(seataConfigName,
      false) : new FileConfiguration(seataConfigName + "-" + envValue, false);
      Configuration extConfiguration = null;
      try {
      extConfiguration = EnhancedServiceLoader.load(ExtConfigurationProvider.class).provide(configuration);
      if (LOGGER.isInfoEnabled()) {
      ("load Configuration:{}", extConfiguration == null ? configuration.getClass().getSimpleName()
      : extConfiguration.getClass().getSimpleName());
      }
      } catch (EnhancedServiceNotFoundException ignore) {

      } catch (Exception e) {
      LOGGER.error("failed to load extConfiguration:{}", e.getMessage(), e);
      }
      CURRENT_FILE_INSTANCE = extConfiguration == null ? configuration : extConfiguration;
      }

      这部分是在初始化 ​​CURRENT_FILE_INSTANCE​​,启动配置的初始化是一个 “鸡生蛋和蛋生鸡” 类似的问题,这个问题的处理需要依赖外部的环境,因此初始化中优先读取​​System.getProperty​​​(对应 java 的 ​​-Dproperty=value​​​),不存在时再读取 ​​System.getenv​​ 系统的环境变量,通过外部决定启动配置的配置。

      在 Spring [Boot|Cloud] 中使用 ​​seata-spring-boot-starter​​​ 集成 seata 时,根本不存在这么一个配置文件,在 ​​new FileConfiguration(seataConfigName, false)​​​ 中什么也没读到,这里最关键的过程在于 ​​extConfiguration = EnhancedServiceLoader.load(ExtConfigurationProvider.class).provide(configuration);​​​,这里通过 ​​SpringBootConfigurationProvider​​​ 动态代理 ​​FileConfiguration​​​,将 Spring Boot 形式的配置文件代理了 ​​FileConfiguration​​ 默认的配置(细节不在展开),意思就是:

      “从​​CURRENT_FILE_INSTANCE​​读取配置时,你以为还在从 ​​registry.conf​​ 读取配置,实际上已经从 ​​application.[yaml|properties]​​ 中读取了”

      所以说,初始化时,所有通过 ​​ConfigurationFactory.CURRENT_FILE_INSTANCE​​​ 读取的配置,都是我们可以在 ​​application.[yaml|properties]​​​ 中配置的内容。还有一个重点就是 ​​SpringBootConfigurationProvider​​​ 动态代理中读取配置时,调用了 ​​convertDataId(String rawDataId)​​​ 方法,这个方法会给所有配置增加 ​​seata.​​​ 前缀(还会特殊处理 ​​.grouplist​​​ 后缀),因此后续凡是通过 ​​ConfigurationFactory.CURRENT_FILE_INSTANCE​​​ 读取的配置,在配置文件中配置时,手动增加 ​​seata.​​ 前缀。

      先总结一下:

      1. 通过​​ConfigurationFactory.CURRENT_FILE_INSTANCE​​​ 读取的配置都在​​application.[yaml|properties]​​ 中配置。
      2. 通过​​ConfigurationFactory.getInstance()​​​ 调用读取配置时,配置是从配置中心(例如​​nacos​​)读取的。

      懂 Spring Cloud的人应该知道 ​​application.[yaml|properties]​​ 也可以从配置中心读取,和这里不冲突。

      ​​ConfigurationFactory.getInstance​​ 初始化配置中心

      启动配置 ​​CURRENT_FILE_INSTANCE​​​ 初始化之后,就该 ​​ConfigurationFactory.getInstance​​ 初始化配置中心了。

      public static Configuration getInstance() {
      if (instance == null) {
      synchronized (Configuration.class) {
      if (instance == null) {
      instance = buildConfiguration();
      }
      }
      }
      return instance;
      }

      这里是一个单例的实现,创建过程在 ​​buildConfiguration​​ 中,看代码注释:

      private static Configuration buildConfiguration() {
      //注意看 CURRENT_FILE_INSTANCE,这说明是从启动配置读取的,也就是在 application.[yaml|properties] 中配置的
      //读取 seata.config.type 本文配置的 nacos
      String configTypeName = CURRENT_FILE_INSTANCE.getConfig(
      ConfigurationKeys.FILE_ROOT_CONFIG + ConfigurationKeys.FILE_CONFIG_SPLIT_CHAR
      + ConfigurationKeys.FILE_ROOT_TYPE);

      //忽略其他代码,后续代码会对 nacos 初始化
      }

      在上面方法中增加了一个配置:

      seata:
      config:
      type:

      上面配置 nacos 后,需要创建 nacos 对应的配置,创建过程中还要读取很多配置:

      //注意 nacos 中的这个静态字段
      private static final Configuration FILE_CONFIG = ConfigurationFactory.CURRENT_FILE_INSTANCE;
      //构造方法
      private NacosConfiguration() {
      if (configService == null) {
      try {
      configService = NacosFactory.createConfigService(getConfigProperties());
      initSeataConfig();
      } catch (NacosException e) {
      throw new RuntimeException(e);
      }
      }
      }

      主要的配置在 ​​getConfigProperties()​​​,将 ​​application.[yaml|properties]​​​ 中的配置转换为了一个 nacos 初始化需要用的配置文件,这部分会读取系统变量(​​System.getProperty​​​)和 ​​ConfigurationFactory.CURRENT_FILE_INSTANCE​​​ 中的配置,这里不考虑系统变量,直接列出所有 ​​application.[yaml|properties]​​ 中需要的配置:

      seata:
      config:
      nacos:
      server-addr: IP:port #默认http,如果是https一定要配置为 https://HOSTNAME:port
      namespace: #默认值空,特别注意,空使用的public,但是这里不能写public
      username:
      password:

      特别注意!!!
      namespace 默认值空,空使用的 public,但是这里不能写public,如果写了就会因为nacos的ClientWorker认为文件和服务器端不一致,导致频繁刷日志。

      连接 nacos 只需要这几个配置,只有 ​​server-addr​​​ 是必填的。nacos连接后,通过 ​​initSeataConfig()​​ 初始化配置:

      private static void initSeataConfig() {
      try {
      //配置中心的配置文件 seata.config.nacos.data-id
      //默认值为 seata.properties
      String nacosDataId = getNacosDataId();
      //配置中的GROUP seata.config.nacos.group
      //默认值为 SEATA_GROUP
      String config = configService.getConfig(nacosDataId, getNacosGroup(), DEFAULT_CONFIG_TIMEOUT);
      //如果你配置中存在该配置,就会使用这个配置内容初始化 seataConfig
      //也就是说,你可以把 seata 客户端用到的所有配置放到一个大的配置文件中
      //如果大配置中没有某个配置,seata 还会读取 nacos中是否直接存在某个配置项(dataId=配置)
      if (StringUtils.isNotBlank(config)) {
      try (Reader reader = new InputStreamReader(new ByteArrayInputStream(config.getBytes()),
      StandardCharsets.UTF_8)) {
      seataConfig.load(reader);
      }
      //监控配置文件的变化
      NacosListener nacosListener = new NacosListener(nacosDataId, null);
      configService.addListener(nacosDataId, getNacosGroup(), nacosListener);
      }
      } catch (NacosException | IOException e) {
      LOGGER.error("init config properties error", e);
      }
      }

      上面代码在 ​​application.[yaml|properties]​​ 中需要的配置:

      seata:
      config:
      nacos:
      data-id: seata.properties # 这是默认值
      group: SEATA_GROUP # 这是默认值

      到这里 nacos 配置中心初始化完成了,后续获取获取配置时,可以从 nacos 配置中心读取。

      回到刚开始时字段初始化的代码。

      Nacos 配置中心如何配置

      private volatile boolean disableGlobalTransaction = ConfigurationFactory.getInstance().getBoolean(
      ConfigurationKeys.DISABLE_GLOBAL_TRANSACTION, DEFAULT_DISABLE_GLOBAL_TRANSACTION);

      这里获取配置文件的方式就是读取 nacos 配置中心的内容,默认值为 ​​false​​。nacos 配置中心有两种配置该配置的方式。

      先看代码中读取配置的部分:

      @Override
      public String getLatestConfig(String dataId, String defaultValue, long timeoutMills) {
      //先读取系统属性System.getProperty
      String value = getConfigFromSysPro(dataId);
      if (value != null) {
      return value;
      }
      //这里的seataConfig是Properties,从nacos读取的seata.properties,上面代码有这个初始化过程
      //这里的seata.properties算是大配置,里面可以配置所有属性
      value = seataConfig.getProperty(dataId);
      //如果大配置没有
      if (null == value) {
      try {
      //直接从nacos读取配置
      value = configService.getConfig(dataId, getNacosGroup(), timeoutMills);
      } catch (NacosException exx) {
      LOGGER.error(exx.getErrMsg());
      }
      }

      return value == null ? defaultValue : value;
      }

      从代码可以看出有三种来源,按配置优先级顺序如下:

      1. 系统属性,通过​​-Dkey=val​​ 配置
      2. 从seataConfig读取,在 nacos 的 seata.properties 中配置
      3. 直接从 nacos 读取

      第1点不考虑,先看第2点,截个图方便理解:

      seata-spring-boot-starter 启动配置

      配置的内容:

      seata-spring-boot-starter 启动配置

      再看第3种,第3种可能是官方推荐的方式,因为官方针对 nacos 提供了 shell 和 py 脚本来导入配置信息,导入信息的格式就是第3种:

      seata-spring-boot-starter 启动配置

      通过脚本导入到nacos的配置如下:

      seata-spring-boot-starter 启动配置

      以上只是 nacos 配置中心相关的配置,下面继续看注册中心。

      注册中心相关配置

      注册中心的初始化在 ​​RegistryFactory.getInstance()​​ 中:

      public static RegistryService getInstance() {
      if (instance == null) {
      synchronized (RegistryFactory.class) {
      if (instance == null) {
      instance = buildRegistryService();
      }
      }
      }
      return instance;
      }

      private static RegistryService buildRegistryService() {
      RegistryType registryType;
      String registryTypeName = ConfigurationFactory.CURRENT_FILE_INSTANCE.getConfig(
      ConfigurationKeys.FILE_ROOT_REGISTRY + ConfigurationKeys.FILE_CONFIG_SPLIT_CHAR
      + ConfigurationKeys.FILE_ROOT_TYPE);
      try {
      registryType = RegistryType.getType(registryTypeName);
      } catch (Exception exx) {
      throw new NotSupportYetException("not support registry type: " + registryTypeName);
      }
      if (RegistryType.File == registryType) {
      return FileRegistryServiceImpl.getInstance();
      } else {
      return EnhancedServiceLoader.load(RegistryProvider.class, Objects.requireNonNull(registryType).name()).provide();
      }
      }

      仍然是个单例,在初始化的时候,从 ​​ConfigurationFactory.CURRENT_FILE_INSTANCE​​​ 读取了 ​​seata.registry.type​​​,这里以 ​​nacos​​ 为例。

      和配置一样,需要读取连接 nacos 的基本信息,这里和配置需要的参数一样,只是改成了 registry的配置,初始化过程中的所有配置如下:

      seata:
      registry:
      type: nacos
      nacos:
      server-addr: IP:port #默认http,如果是https一定要配置为 https://HOSTNAME:port
      namespace:
      username:
      password:

      在当前类中搜索所有使用 ​​ConfigurationFactory.CURRENT_FILE_INSTANCE​​ 的代码,发现还有下面几个配置:

      seata:
      registry:
      nacos:
      cluster: default
      application: seata-server
      group: DEFAULT_GROUP #默认值和 config 的 SEATA_GROUP 不一样

      总结

      通过以上分析,当我们使用 seata-spring-boot-starter,配置和注册中心使用 nacos 时,​​application.yaml​​ 配置文件中需要配置的项非常少,必须配置的内容如下:

      seata:
      application-id: 应用名 #Spring Cloud可选,Spring Boot必填
      tx-service-group: 事务分组名 #Spring Cloud可选,Spring Boot必填
      #配置中心
      config:
      type: nacos #必填
      nacos:
      server-addr: IP:port #默认http,如果是https一定要配置为 https://HOSTNAME:port
      #服务注册发现
      registry:
      type: nacos #必填
      nacos:
      server-addr: IP:port #默认http,如果是https一定要配置为 https://HOSTNAME:port

      所有用到的配置如下:

      seata:
      enable: true # 这是个BUG,官方最新版本已经改成了 enabled,还没发布,想禁用就得写全,都设置false
      enabled: true #可选
      enable-auto-data-source-proxy: true #可选
      use-jdk-proxy: false #可选
      excludes-for-auto-proxying: #可选
      data-source-proxy-mode: AT #可选
      application-id: 应用名 #Spring Cloud可选,Spring Boot必填
      tx-service-group: 事务分组名 #Spring Cloud可选,Spring Boot必填
      #配置中心
      config:
      type: nacos #必填
      nacos:
      server-addr: IP:port #默认http,如果是https一定要配置为 https://HOSTNAME:port
      namespace: #可选,默认值空
      username: #可选
      password: #可选
      data-id: seata.properties # 这是默认值
      group: SEATA_GROUP # 这是默认值
      #服务注册发现
      registry:
      type: nacos #必填
      nacos:
      server-addr: IP:port #默认http,如果是https一定要配置为 https://HOSTNAME:port
      namespace: #可选,默认值空
      username: #可选
      password: #可选
      cluster: default #可选
      application: seata-server #可选
      group: DEFAULT_GROUP #默认值和 config 的 SEATA_GROUP 不一样

      以上只是客户端配置文件中需要配置的内容,seata连接nacos配置中心后,seata客户端还会读取大量的配置信息,因此其他的配置项需要在nacos中正确配置。完整的配置项参考官方的 ​​config.txt​​。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/isea533/5602592,作者:isea533,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:ssh 命令

      下一篇:Windows安全加固

      相关文章

      2025-05-14 10:02:48

      SQL Server 事务日志体系结构1--基本术语

      事务包括对数据库的一次更改或一系列更改。它有一个明确开始和明确结束。开始时使用BEGIN TRANSACTION语句,或者SQL Server会自动为您开始一个事务。

      2025-05-14 10:02:48
      Server , SQL , 事务 , 数据库 , 日志 , 磁盘
      2025-05-13 09:49:12

      JDBC事务管理、四大特征(ACID)、事务提交与回滚、MySQL事务管理

      JDBC(Java Database Connectivity)事务是指一系列作为单个逻辑工作单元执行的数据库操作,这些操作要么全部成功——>提交,要么全部失败——>回滚,从而确保数据的一致性和完整性。

      2025-05-13 09:49:12
      MySQL , 事务 , 执行 , 提交 , 操作 , 数据库
      2025-05-08 09:03:21

      基于spring+jsp+mysql实现的Java web论坛系统【源码+数据库+指导运行】

      本项目是一套基于spring+jsp+mysql实现的Java web论坛系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。

      2025-05-08 09:03:21
      Java , jsp , spring , 功能 , 源码
      2025-05-08 09:03:07

      spring Bean的作用域和生命周期

      spring Bean的作用域和生命周期

      2025-05-08 09:03:07
      Bean , method , spring , 作用域 , 配置文件
      2025-05-07 09:08:54

      springboot系列教程(十二):基于转账案例,演示事务管理操作

      springboot系列教程(十二):基于转账案例,演示事务管理操作

      2025-05-07 09:08:54
      spring , 事务 , 接口 , 管理器 , 配置
      2025-05-06 09:19:12

      Spring多线程事务 能否保证事务的一致性(同时提交、同时回滚)?

      Spring的事务信息是存在ThreadLocal中的Connection, 所以一个线程永远只能有一个事务

      2025-05-06 09:19:12
      Spring , 事务 , 多线程 , 线程
      2025-04-22 09:28:19

      61. Spring事务传播行为实现原理

      61. Spring事务传播行为实现原理

      2025-04-22 09:28:19
      Spring , ThreadLocal , 事务
      2025-04-22 09:27:37

      【Redis】浅析 Redis 事务

      【Redis】浅析 Redis 事务

      2025-04-22 09:27:37
      redis , Redis , 事务 , 命令 , 执行
      2025-04-15 09:19:55

      分布式事务大揭秘:使用MQ实现最终一致性

      在单体应用中,事务的管理相对简单,可以通过数据库的事务机制来保证数据的一致性和完整性。然而,在分布式系统中,由于涉及到多个不同的服务和数据源,保证事务的一致性就变得复杂了。

      2025-04-15 09:19:55
      RocketMQ , 一致性 , 事务 , 分布式 , 发送 , 消息 , 系统
      2025-04-14 08:48:01

      Java注解实现之how to use path variable @PathVariable

      Java注解实现之how to use path variable @PathVariable

      2025-04-14 08:48:01
      Java , spring
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5233442

      查看更多

      最新文章

      SQL Server 事务日志体系结构1--基本术语

      2025-05-14 10:02:48

      spring Bean的作用域和生命周期

      2025-05-08 09:03:07

      【面试题】MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别

      2025-04-01 09:21:49

      spring boot整合mybatis和hikariCP时遇到 jdbcUrl is required with driverClassName 错误的解决方法

      2025-03-25 08:08:18

      springboot中配置文件的位置

      2025-02-19 09:04:11

      spring配置双数据源

      2024-09-25 10:14:21

      查看更多

      热门文章

      The type org.springframework.context.ConfigurableApplicationContext cannot be resolved. It is indire

      2022-12-28 07:22:30

      logback在springBoot项目中的使用 springboot中使用日志进行持久化保存日志信息

      2023-03-02 06:29:14

      [spring学习]11、AOP使用,注解&xml配置

      2023-07-03 09:13:10

      《MySQL高级篇》十二、MySQL事务日志

      2023-06-06 05:57:32

      idea新建配置文件没有spring提示信息解决方法

      2023-06-26 08:28:09

      Lombok @Slf4j 使用和配置

      2024-09-25 10:14:09

      查看更多

      热门标签

      服务器 linux 虚拟机 Linux 数据库 运维 网络 日志 数据恢复 java python 配置 nginx centos mysql
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      spring boot整合mybatis和hikariCP时遇到 jdbcUrl is required with driverClassName 错误的解决方法

      idea新建配置文件没有spring提示信息解决方法

      zuul No route found for uri:

      196-maven+springboot 打整个jar包的pom配置(胖包)

      Lombok @Slf4j 使用和配置

      springboot中配置文件的位置

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号