悟空CRM系统启动报错获取seata服务失败原因分析

it2025-01-11  6

悟空CRM系统启动报ERROR io.seata.core.rpc.netty.NettyClientChannelManager - no available service 'default' found的原因分析

悟空CRM系统seata-server版本admin启动报错问题定位相关问题延申

悟空CRM系统

: 悟空CRM系统的安装请参考链接https://blog.csdn.net/oThrowsException/article/details/109065644.

seata-server版本

本地安装的seata-server是1.3.0版本

admin启动报错

2020-10-21 17:04:20 admin ERROR io.seata.core.rpc.netty.NettyClientChannelManager - no available service ‘default’ found, please make sure registry config correct

其他用到seata服务的都会有相同的报错。

问题定位

通过debug模式打开NettyClientChannelManager类在getAvailServerList打上断点。方法如下

private List<String> getAvailServerList(String transactionServiceGroup) throws Exception { List<InetSocketAddress> availInetSocketAddressList = RegistryFactory.getInstance().lookup(transactionServiceGroup); return CollectionUtils.isEmpty(availInetSocketAddressList) ? Collections.emptyList() : (List)availInetSocketAddressList.stream().map(NetUtil::toStringAddress).collect(Collectors.toList()); }

这个方法中调用NacosRegistryServiceImpl的lookup方法

public List<InetSocketAddress> lookup(String key) throws Exception { String clusterName = this.getServiceGroup(key); if (null == clusterName) { return null; } else { if (!LISTENER_SERVICE_MAP.containsKey(clusterName)) { synchronized(LOCK_OBJ) { if (!LISTENER_SERVICE_MAP.containsKey(clusterName)) { List<String> clusters = new ArrayList(); clusters.add(clusterName); List<Instance> firstAllInstances = getNamingInstance().getAllInstances(getServiceName(), clusters); if (null != firstAllInstances) { List<InetSocketAddress> newAddressList = (List)firstAllInstances.stream().filter((instance) -> { return instance.isEnabled() && instance.isHealthy();

跟进NacosNamingService类中的getAllInstances(getServiceName(), clusters);方法发现,通过重载的方式,调用到getAllInstances(String serviceName, List clusters, boolean subscribe)方法。代码如下:

public List<Instance> getAllInstances(String serviceName, List<String> clusters, boolean subscribe) throws NacosException { return this.getAllInstances(serviceName, "DEFAULT_GROUP", clusters, subscribe); }

敲黑板 这里就是问题的关键。这个方法中使用了默认的服务组名使用了写死的 “DEFAULT_GROUP”,而在registry.conf配置文件中 group = “SEATA_GROUP”,这就导致了无法找到服务实例。坑~晕~

这时候,想到了版本会不会不兼容问题。查看主pom.xml.发现引用的seata-spring-boot-starter是1.2.0版本

<dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>1.2.0</version> </dependency>

于是把版本改为1.3.0,然后重新加载引用、编译、运行。该错误消失。 通过调试代码发现。 打开NacosRegistryServiceImpl类的lookup方法中的getNamingInstance().getAllInstances(getServiceName(), getServiceGroup(), clusters);已经增加了一个参数,获取服务组。这样就可以传入配置服务组的配置参数

public List<InetSocketAddress> lookup(String key) throws Exception { String clusterName = this.getServiceGroup(key); if (clusterName == null) { return null; } else { if (!LISTENER_SERVICE_MAP.containsKey(clusterName)) { synchronized(LOCK_OBJ) { if (!LISTENER_SERVICE_MAP.containsKey(clusterName)) { List<String> clusters = new ArrayList(); clusters.add(clusterName); List<Instance> firstAllInstances = getNamingInstance().getAllInstances(getServiceName(), getServiceGroup(), clusters); if (null != firstAllInstances) { List<InetSocketAddress> newAddressList = (List)firstAllInstances.stream().filter((instance) -> { return instance.isEnabled() && instance.isHealthy(); }).map((instance) -> {

相关问题延申

还有一种类似的启动报错ERROR io.seata.core.rpc.netty.NettyClientChannelManager - no available service ‘null’ found 这种问题,是因为在nacos中。没人注入配置文件,在nacos中的配置管理中。看不到如下配置信息。这些信息是在系统第一次初始化的时候写入的。(即在系统登录输入用户名、密码、序列号这个步骤中),如果当时nacos没其他或者后续修改了nacos的存储方式,如后来修改为db存储。就会产生这个问题。如果是改了数据存储方式导致的。可以把nacos改为之前的存储方式,重启nacos后在配置管理界面中。导出所有配置。再改为新的存储方式,重启nacos后导入即可。如果不是这样原因。得重新初始化一次。或者找其他人要一份配置文件来导入即可。

最新回复(0)