前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >调式源码解决 seata 报错 can not get cluster name 问题

调式源码解决 seata 报错 can not get cluster name 问题

作者头像
用户10384376
发布2023-02-26 13:06:02
1.7K0
发布2023-02-26 13:06:02
举报
文章被收录于专栏:码出code码出code

最近在使用Spring Cloud整合分布式事务seata,项目启动之后,控制台一直报错:

代码语言:javascript
复制
can not get cluster name in registry config 'service.vgroupMapping.nacos-provide-order-seata-service-group', please make sure registry config correct
can not get cluster name in registry config 'service.vgroupMapping.nacos-provide-order-seata-service-group', please make sure registry config correct
can not get cluster name in registry config 'service.vgroupMapping.nacos-provide-order-seata-service-group', please make sure registry config correct

无法在注册配置上找到service.vgroupMapping.nacos-provide-order-seata-service-group配置。

问题分析

搭建seata服务,需要用到配置中心,将配置文件config.txt上传到Nacos配置中心,其中有一项配置是:

代码语言:javascript
复制
service.vgroupMapping.default_tx_group=default

这个配置和控制台报错信息很像:

代码语言:javascript
复制
service.vgroupMapping.nacos-provide-order-seata-service-group

这个配置就是事务分组,从 官网文档 看到事务分组的配置:

总结就是需要在客户端的配置文件添加配置seata.tx-service-group=xxx,seata通过这个配置去Nacos配置中心寻找配置service.vgroupMapping.xxx

上面导入的配置为service.vgroupMapping.default_tx_group,所以在application.yml文件添加配置:

代码语言:javascript
复制
seata:
   tx-service-group: default_tx_group

项目重新启动,还是同样的报错

既然提示找不到配置,在配中心添加配置文件nacos-provide-order-seata-service-group:

添加配置之后,就不报错了,文档有说明:

获取事务分组(服务启动时加载配置) spring/springboot可配置在yml、properties中,对应值"my_test_tx_group"即为事务分组名,若不配置则默认以:spring.application.name值+-seata-service-group拼接后的字符串作为分组名。

seata还是按照默认的配置spring.application.name + -seata-service-group去配置中心找配置,上面的配置没有生效。

调式源码

报错是在NettyClientChannelManager类的176行:

transactionServiceGroup表示事务分组名,调式到分组名值为nacos-provide-stock-seata-service-group,说明配置seata.tx-service-group没有生效,就需要找到transactionServiceGroup来源。

一般调式代码,都是调式下一步,往上调式就用到了调式的上一步:

从上面的断点调式上一步,就定位到RmNettyRemotingClient类的第194行:

transactionServiceGroup是一个实例变量,需要唯一赋值该变量的地方就在RmNettyRemotingClient类的第140行:

setTransactionServiceGroup方法被本类的getInstance方法调用,也就是RmNettyRemotingClient99行,添加断点,重启服务:

调式上一步,定位到RMClient类的init方法:

调式上一步,定位到GlobalTransactionScanner类的201行:

此时txServiceGroup又是一个实例变量,找到变量赋值的位置:

添加断点之后,重启服务,到了断点,再点击上一步,一直定位到GlobalTransactionAutoConfiguration

代码语言:javascript
复制
@Bean
public GlobalTransactionScanner globalTransactionScanner() {

 String applicationName = applicationContext.getEnvironment()
   .getProperty("spring.application.name");

 String txServiceGroup = seataProperties.getTxServiceGroup();

  if (StringUtils.isEmpty(txServiceGroup)) {
  txServiceGroup = applicationName + "-seata-service-group";
  seataProperties.setTxServiceGroup(txServiceGroup);
 }

 return new GlobalTransactionScanner(applicationName, txServiceGroup);
}

txServiceGroup首先通过seataProperties.getTxServiceGroup获取,如果为null,就使用applicationName + -seata-service-group

从最终报错位置看,seataProperties.getTxServiceGroup无法获取txServiceGroup,先看getTxServiceGroup获取数据:

代码语言:javascript
复制
@ConfigurationProperties("spring.cloud.alibaba.seata")
public class SeataProperties {

 // todo support config Seata server information

 /**
  * Seata tx service group.default is ${spring.application.name}-seata-service-group.
  */
 private String txServiceGroup;

 public String getTxServiceGroup() {
  return txServiceGroup;
 }

 public void setTxServiceGroup(String txServiceGroup) {
  this.txServiceGroup = txServiceGroup;
 }

}

最终发现txServiceGroup是通过配置spring.cloud.alibaba.seata.tx-service-group内容获取。

问题解决

application.yml文件配置配置,

代码语言:javascript
复制
spring:
  cloud:
    alibaba:
      seata:
        tx-service-group: default_tx_group

seata获取到default_tx_group属性后,在nacos配置中心找到service.vgroupMapping.default_tx_group配置。

总结

  • Spring Cloud整合seata,控制台报错can not get cluster name in registry config 'service.vgroupMa
  • 查询文档,nacos添加了service.vgroupMapping.xxx配置,就需要在yml文件上seata.tx-service-group=xxx配置。添加后控制台还是报错。
  • 调式源码,找到报错代码位置,一步一步向上调试,找到分组事务无法设置的原因,最后发现分组事务是根据spring.cloud.alibaba.seata.tx-service-group属性来设置。

官方文档更新不及时的时候,这就需要我们调式源码的能力。前段时间一直在写解析源码的文章,所以也在尝试一步步调式代码,最终解决了问题,对自己能力也是一次提高。平时开发遇到问题,通过调式源码,可以快速的定位问题。

授人以鱼不如授人以渔,作为程序员,重要的不是找到问题,而是找到问题的解决方案。要追根溯源,做到心中有数,遇问题也不慌。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码出code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题分析
  • 调式源码
  • 问题解决
  • 总结
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档