开发者社区 > 云原生 > 正文

seata 1.4.2 集成springboot项目 在启用consul配置中心的时候,项目无法完成

最近项目中考虑引入seata作为分布式事务解决方案,最开始我们是用springboot的yml配置文件作为配置中心,并做了压测,效果符合理想,后来参照官网高可用部署方式,我们用consul作为配置中心,就出现问题了,业务项目启动不起来,一直卡在读取配置,就像这样:

ERROR 45365 --- [ main] io.seata.config.ConfigFuture : config operation timeout,cost:5000 ms,op:GET,dataId:transport.threadFactory.workerThreadPrefix ERROR 45365 --- [ main] io.seata.config.ConfigFuture : config operation timeout,cost:5003 ms,op:GET,dataId:transport.threadFactory.shareBossWorker ERROR 45365 --- [ main] io.seata.config.ConfigFuture : config operation timeout,cost:5000 ms,op:GET,dataId:transport.type ERROR 45365 --- [ main] io.seata.config.ConfigFuture : config operation timeout,cost:5001 ms,op:GET,dataId:transport.threadFactory.workerThreadSize

上面这个错误,断点调试 发现最开始是在SpringBootConfigurationProvider#get(dataId) 里面 获取 ConfigConsulProperties.class 这个bean 的时候卡住一段时间,大概有30秒,导致没有及时获取到consul连接配置,consul客户端没有及时完成初始化,这导致读取consul服务上配置数据超时失败,但是疑惑的是,后来consul客户端完成了初始化后,consul客户端从注册中心获取seata服务确总是失败,一直出现下面的错误,无法完成启动

ERROR 45365 --- [eoutChecker_2_1] i.s.c.r.netty.NettyClientChannelManager : no available service found in cluster 'kun-ming', please make sure registry config correct and keep your seata server running ERROR 45365 --- [eoutChecker_1_1] i.s.c.r.netty.NettyClientChannelManager : no available service found in cluster 'kun-ming', please make sure registry config correct and keep your seata server running

我们事务组的配置如下: service.vgroupMapping.ji9_tx_group = kun-ming

注册中心该服务其实是存在的

我期望这个错误不应该存在,应该按照配置,能够在注册中心找到服务,期望这个问题尽快修复

最后我在ConsulRegisttryServiceImpl#refreshCluster(cluster) 方法中发现了问题, refreshCluster(cluster) -调用-> getHealthyServices(getClusterName(), -1, -1) 其实getHealthService方法的service 参数应该使用上层方法refreshCluster(cluster) 传入的cluster 参数,而不应该从getClusterName() 获取服务名,因为getClusterName()获取的服务名是本地文件配置的。

环境信息

JDK version : 1.8 OS : centos 8 Others: seata: seata-spring-boot-starter 1.4.2 springboot: 2.3.10.RELEASE 配置中心: consul 注册中心: consul

原提问者GitHub用户Amountsen

展开
收起
学习娃 2023-06-14 17:09:41 154 0
1 条回答
写回答
取消 提交回答
  • 粗略看了下,好像是存在问题,因为传入的cluster,但是用的却是getClusterName(),从本地读了clsutername,而不是getServiceGroup,或者直接使用cluster,我来处理,希望你有空可以参与测试,谢谢反馈

    原回答者GitHub用户a364176773

    2023-06-14 17:37:24
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
《Seata 1.3 新特性以及如何参与社区》 立即下载
集成智能接入网关APP:优化企业级移动办公网络 立即下载
云效助力企业集成安全到DevOps中 立即下载