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

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

悟空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后导入即可。如果不是这样原因。得重新初始化一次。或者找其他人要一份配置文件来导入即可。
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值