nacos注册服务及集成seata踩坑记录(No available service)

nacos注册服务及集成seata踩坑记录

概述

这一段时间一直在学习阿里微服务的全家桶套餐。功能挺好用的,就是文档太少了,遇到问题太难排查。今天在玩Seata的启动的时候遇到很多坑,在这里通过nacos集成seata来简单阐述一下基于nacos注册服务及配置中心联调排查问题的思路。针对我遇到的问题,暂时讲问题主要归结为4类:

  • 注册服务及获取服务的问题
  • 配置文件读取的问题
  • Alibaba全家桶依赖问题
  • 网路链路的问题

问题复现

因为目前网上提供的demo,大多数是在本地或是windows上进行的集成,这次我的集成是基于一个小项目在Linux环境上的集成。借由这次nacos集成seata我们逐步来分析问题的原因:

1.还原情景

1.引入Alibaba全家桶的依赖
在这里插入图片描述

2.引入nacos服务注册中心及配置中心依赖
在这里插入图片描述

3.引入seata依赖

在这里插入图片描述

4.在服务的配置文件中集成seata

在这里插入图片描述

5.服务器启动nacos服务端及seata服务端

这里我们使用的是1.1.4版本的nacos以及1.4版本的seata

在这里插入图片描述

在这里插入图片描述

6.启动项目,发现错误
在这里插入图片描述

错误详情:
io.seata.common.exception.FrameworkException: No available service

这时我们猜测服务并没有连接到seata服务

解决问题1(读取配置文件的问题)

我们进入seata源码打断点,进入源码 RegistryService 类,找到getServiceGroup方法,发现问题:
在这里插入图片描述

这时我们根据调用链 getConfig 找到从nacos读取配置的方法
在这里插入图片描述

继续跟进getConfig方法,找到getConfigInner方法,忽略使用本地配置,找到获取nacos配置的代码:
在这里插入图片描述

最终,我们获取到seata向nacos发送读取配置的get请求,我们找到url和参数,放入postman模拟请求:
在这里插入图片描述

放入postman进行验证,这里给出GET请求的详细地址,方便大家调试:
http://xxx:8848/nacos/v1/cs/configs?dataId=service.vgroupMapping.my_ums_tx_group&group=DEFAULT_GROUP

找到问题:
在这里插入图片描述

经过几次参数组合的尝试,最终确定不传入namespace时,可以获得正确的配置数据:
在这里插入图片描述

验证修改是否生效

修改ums的ums-application-dev.yml配置文件,删除配置中的namespace,并再次启动项目查看
在这里插入图片描述

在这里插入图片描述

7.发现问题仍然没有解决:
在这里插入图片描述

解决问题2(获取seata服务的问题)

在问题1的基础上,我们跟踪原来来到NettyClientChannelManager中的reconnect方法,发现获取到的服务实例为null:
在这里插入图片描述

跟踪源码到getAvailServerList方法,进入nacos服务获取方法:
在这里插入图片描述

继续向下跟踪代码。发现端倪:
在这里插入图片描述

对于这个常量值我们意外发现与nacos上注册的seata服务名称不一样:
在这里插入图片描述

反复分析导致这个情况产生的原因,是nacos源码写错了嘛?这时我们突然发现服务端的seata版本与我们项目中的seata版本存在较大的差异,之前我们看到服务器上我们使用的时1.4版本的seata,而项目中的seata版本则为1.1版本:
在这里插入图片描述
这里也向大家提供nacos获取服务的GET请求
http://XXXX:8848/nacos/v1/ns/instance/list?app=ums-application&healthyOnly=false&namespaceId=public&clientIP=XXXXXX&serviceName=DEFAULT_GROUP@@seata-server&udpPort=58795&clusters=default

经过在官网的查询,我决定使用最新的Alibaba全家桶版本,及2.2.3版本:
在这里插入图片描述

这时我们发现,seata-all的版本已经提高到了1.3版本,随后我们启动项目并查看源码:
在这里插入图片描述

8.这次我们打上 @GlobalTransactional 标签进行分布式事务验证。发现现在错误解决
在这里插入图片描述

这里我在第二个insert语句中加入了sql错误,在第一句insert后打入断点验证,发现ums表插入了数据,在ums表的相同数据库中的undo_log表中发现有数据记录。
在这里插入图片描述

在这里插入图片描述

放开断点,代码抛出SQL异常.后再观察两个表数据:

  • user表刚刚插入的数据被擦除
  • undo_log表刚刚插入的数据被擦除:
    在这里插入图片描述

9.至此nacos集成seata问题解决,验证生效

总计

这次只时阐述了nacos集成seata相关的问题,因为每个人使用的Alibaba全家桶,nacos服务端及seata服务端的版本都不尽相同,且现在Alibaba全家桶项目更新很快,对代码的修改也比较频繁,很多代码仅仅一个小版本都会带来很多问题,所以阅读nacos相关源码变得尤为重要,笔者这里只时提供一个排除问题,解决异常的思路。也希望大家在使用中遇到的问题相互交流。

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Seata 1.5.2是一个开源的分布式事务解决方案,而Nacos则是一个开源的动态服务发现、配置管理和服务管理平台。集成Seata 1.5.2与Nacos可以使得我们在应用程序中更方便地使用分布式事务功能,并且能够动态地管理配置和服务。 首先,集成Seata 1.5.2和Nacos需要进行一些准备工作。我们需要在应用程序中引入Seata 1.5.2和Nacos的相关依赖包,并进行相应的配置。在Seata 1.5.2的配置中,我们需要指定Nacos作为注册中心和配置中心。 其次,集成Seata 1.5.2和Nacos需要对应用程序进行适当的修改。在应用程序中,我们需要使用Seata 1.5.2提供的事务管理接口来控制分布式事务的开始、提交和回滚。同时,我们还需要修改数据库连接配置,确保Seata 1.5.2能够正确地拦截和管理数据库操作。 最后,集成Seata 1.5.2和Nacos还需要进行一些额外的配置。我们需要在Nacos注册Seata 1.5.2提供的事务协调器服务,并将其配置信息与应用程序进行关联。这样,当应用程序启动时,Seata 1.5.2将会自动从Nacos中获取事务协调器的地址,并与其建立连接。 总结而言,集成Seata 1.5.2和Nacos可以使得我们更方便地使用分布式事务功能,并且能够动态地管理配置和服务。通过适当的配置和修改,我们可以在应用程序中使用Seata 1.5.2提供的事务管理接口,并且将事务协调器的地址信息存储在Nacos中,进一步简化了分布式事务的使用和管理。这样的集成方案可以提高应用程序的可靠性和可伸缩性,同时也减轻了开发和维护的工作量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值