概述

前段时间一直在学习阿里微服务的全家桶套餐。功能挺好用的,就是文档太少了,遇到问题太难排查。今天在玩Seata的启动的时候遇到很多坑。项目启动成功了,但是一直再报一个很奇怪的错误:如图
在这里插入图片描述
大概意思就是,没有可用的服务器连接。没办法,身边没有大牛朋友,各种搜索引擎都没有能成功解决的答案,只有看源码一步一步分析解决:

源码分析

1.首先我找到了报这个错误的类,当然就是日志里已经出现的NettyClientChannelManager
在这里插入图片描述
从这里可以看到是在获取availList为空造成的,此时的我也是一头雾水,不知道什么意思,只能一步一步往下看。
2.接着点击进入getAvailServerList方法我大概可以猜到是在获取nacos中的配置信息的时候出的问题,
在这里插入图片描述
3.果然我跳过lookup方法发现获取的availInetSocketAddressList为空,这里我们可以继续点击进去查看,这里有个选择你用ctrl+alt+b会出现很多实现类,由于我之前注册配置的nacos所有这里可以直接进入NacosRegistryServiceImpl这个类中(由于之前已经跳过了这个方法,这里需要重启,在NacosRegistryServiceImpl的lookup方法上打断点)。

在这里插入图片描述在这里插入图片描述
4.进入NacosRegistryServiceImpl的lookup方法
在这里插入图片描述
5.进入getAllInstances方法,如下图已经大概猜到是因为hosts为空导致的原因。
在这里插入图片描述
为了证明自己的猜想我把断点打到return这一行
在这里插入图片描述
6.果然和我猜想的一样,接下来就进入HostReactor类中的getServiceInfo方法
在这里插入图片描述
看到这里感觉已经没有希望了,路断了。但是我们怎么能就这样放弃。竟然他是从serviceInfoMap获取的serviceinfo方法。那肯定有设置的地方。这里我就在类里面搜索 serviceInfoMap.put( ,果然搜索到了在这里插入图片描述
7.我们干掉之前所有的断点,在这里从新打断点
在这里插入图片描述
在这里我们看到他有个json字符串入参然后把这个json字符串转化为了ServiceInfo对象,哈哈我们终于找到ServiceInfo是哪里来的了,然后我再看了下json入参数据,发现入参的hosts已经为空了
在这里插入图片描述
8.以我常年写接口的工作经验我大概猜到这之前应该是去请求了某个接口返回的数据(这里肯定是去请求了nacos),这里我在分享一个看源码技巧,
在这里插入图片描述
回到他的调用方法可以明显看到这个方法是调用的接口返回的
在这里插入图片描述
我们之间找到调用远程api的方法
在这里插入图片描述
在这里插入图片描述
下面是我截图的url地址

http://localhost:8848/nacos/v1/ns/instance/list?app=unknown&healthyOnly=false&namespaceId=public&clientIP=192.168.1.1&serviceName=DEFAULT_GROUP%40%40serverAddr&udpPort=52734&encoding=UTF-8&clusters=gph

在这里插入图片描述
用浏览器请求发现hosts就是空的,这里可以猜想到是传入参数除了问题。
在这里插入图片描述
在这里我看到有个参数是clusters是gph然后我猜想可能是这个参数的问题
我把这个参数去掉
在这里插入图片描述

此刻我在想是不是Seata注册到nacos的问题,然后我进入nacos里面
在这里插入图片描述
在这里插入图片描述
此时我发现这个cluster的值和我传入的参数不一样。原因找到了是我在配置
file.conf的时候把my_test_tx_group对应value的值改成了自定义的,然而在注册的register.conf里面没有改还是default
在这里插入图片描述
在这里插入图片描述

总结

虽然是个挺乌龙的问题,但是还是挺开心的,毕竟是自己看源码解决的。这里我可能有的地方表达的不是很好。后面我一定要多多学习,增强自己看源码的能力。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐