alibaba / spring-cloud-alibaba

Spring Cloud Alibaba provides a one-stop solution for application development for the distributed solutions of Alibaba middleware.
https://sca.aliyun.com
Apache License 2.0
27.94k stars 8.33k forks source link

No provider available from registry 192.168.1.169:8848 for service com.flybycloud.microapp.biz.flyby.business.spec.CloudPushDataBusiness on consumer 192.168.1.169 use dubbo version 2.7.8, please check status of providers(disabled, not registered or in blacklist). #2024

Open BuYi-Feng opened 3 years ago

BuYi-Feng commented 3 years ago

本地环境 spring cloud Hoxton.SR8 spring cloud alibaba 2.2.5.RELEASE spring boot 2.3.8.RELEASE dubbo 2.7.8

服务端重启后,消费端找不到对应的服务端 No provider available from registry nacos.test.flybycs.com:8848 for service com.flybycloud.microapp.biz.flyby.business.spec.CloudPushDataBusiness on consumer 192.168.1.169 use dubbo version 2.7.8, please check status of providers(disabled, not registered or in blacklist).

cn-core commented 3 years ago

同样问题,服务端重启后,消费端有时找不到对应的服务端

环境:

  1. Spring Cloud Hoxton.SR8
  2. Spring Cloud Alibab 2.2.5.RELEASE
  3. Spring Boot 2.3.2.RELEASE
  4. Dubbo 2.7.8

异常信息: org.apache.dubbo.rpc.RpcException: No provider available from registry 172.16.0.199:8848 for service xxx:1.0.0 on consumer 192.168.119.4 use dubbo version 2.7.8, please check status of providers(disabled, not registered or in blacklist).

grayzzz commented 3 years ago

同样的问题 + 1

版本: 1.spring-boot 2.3.8.RELEASE 2.spring-cloud Hoxton.SR9 3.spring-cloud-alibaba 2.2.5.RELEASE 4.dubbo 2.7.8

异常信息: No provider available from registry 10.100.66.110:8848 for service com.xxx.rpc.user.api.UserService on consumer 172.16.64.1 use dubbo version 2.7.8, please check status of providers(disabled, not registered or in blacklist).

voyage-1969 commented 3 years ago

用Feign吧 搞了好几个版本都没解决,我的dubbo之魂也烧没了

BuYi-Feng commented 3 years ago

官方已经尝试修复,但是失败了。只能换成Feign了

grayzzz commented 3 years ago

官方已经尝试修复,但是失败了。只能换成Feign了

不是把,我们都要上线了。还指望着它能修复呢。我的天

BuYi-Feng commented 3 years ago

用Feign吧 搞了好几个版本都没解决,我的dubbo之魂也烧没了

直接可以在原框架中,把dubbo换成feign吗?

Fox2210 commented 3 years ago

去年年底时就发现这个bug,一直催促官方并且自己也尝试解决但最终以失败告终,后面匆忙只能改成feign调用勉强解决问题, 我相信很多用dubbo都是冲着tcp去的,首选肯定不是http

theonefx commented 3 years ago

实在是抱歉,给大家带来困扰了。这个问题,我们对dubbo的集成做了一个大的优化,现在 2.2.6-bugfix4-SNAPSHOT 已经修复了这个问题了

ufwq commented 3 years ago

spring cloud Hoxton.SR8 spring cloud alibaba 2.2.6-bugfix4-SNAPSHOT spring boot 2.3.8.RELEASE dubbo 2.7.8 用这个版本吗

theonefx commented 3 years ago

spring cloud Hoxton.SR8 spring cloud alibaba 2.2.6-bugfix4-SNAPSHOT spring boot 2.3.8.RELEASE dubbo 2.7.8 用这个版本吗

是的,也请测试了之后给一个反馈,我们会第一之间处理这个问题

grayzzz commented 3 years ago

spring cloud Hoxton.SR8 spring cloud alibaba 2.2.6-bugfix4-SNAPSHOT spring boot 2.3.8.RELEASE dubbo 2.7.8 用这个版本吗

是的,也请测试了之后给一个反馈,我们会第一之间处理这个问题

什么时候合并到 RELEASE 分支上呢?

theonefx commented 3 years ago

spring cloud Hoxton.SR8 spring cloud alibaba 2.2.6-bugfix4-SNAPSHOT spring boot 2.3.8.RELEASE dubbo 2.7.8 用这个版本吗

是的,也请测试了之后给一个反馈,我们会第一之间处理这个问题

什么时候合并到 RELEASE 分支上呢?

6月份会发布 2.2.6 正式版本,现在正在测试中,也欢迎帮忙一起测试一下

ufwq commented 3 years ago

hi,2.2.6正式版准备发布了没

firelph commented 3 years ago

7月份咯

Four1996 commented 3 years ago

7月份也要加油啊 hao pan @.***

2021年7月2日 上午9:43,firelph @.***> 写道:

7月份咯

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/alibaba/spring-cloud-alibaba/issues/2024#issuecomment-872652485, or unsubscribe https://github.com/notifications/unsubscribe-auth/AGUSAUZZ6OP7YMMOHTENLH3TVUKV7ANCNFSM42OP76QQ.

theonefx commented 3 years ago

我们已经在测试中了,大家稍安勿躁,很快就好了

ufwq commented 3 years ago

ok

ufwq commented 3 years ago

2.2.6.RC1版本测试,dubbo服务提供者断开后,消费者会抛这个异常,但是之前的找不到服务问题没有再出现,继续测试

2021-07-09 11:46:25.407 WARN 7752 --- [ncesChangeEvent] o.a.d.r.p.d.LazyConnectExchangeClient : safe guard client , should not be called ,must have a bug.

java.lang.IllegalStateException: safe guard client , should not be called ,must have a bug.

theonefx commented 3 years ago

2.2.6.RC1版本测试,dubbo服务提供者断开后,消费者会抛这个异常,但是之前的找不到服务问题没有再出现,继续测试

2021-07-09 11:46:25.407 WARN 7752 --- [ncesChangeEvent] o.a.d.r.p.d.LazyConnectExchangeClient : safe guard client , should not be called ,must have a bug.

java.lang.IllegalStateException: safe guard client , should not be called ,must have a bug.

xxxxx should not be called ,must have a bug. 这个是dubbo的一个bug,不过不影响使用,且已经在新版本中修复掉了。

ufwq commented 3 years ago

rc1版本是好的,release版本问题再次出现

ufwq commented 3 years ago

spring cloud Hoxton.SR9 spring cloud alibaba 2.2.6-RC1 spring boot 2.3.2.RELEASE dubbo 2.7.8

rc1版本再次出现问题

ufwq commented 3 years ago

@theonefx spring cloud Hoxton.SR8 spring cloud alibaba 2.2.6.RELEASE spring boot 2.3.2.RELEASE dubbo 2.7.8 在本机测试,没有问题。 通过docker 部署到ecs服务器, 采用 docker run -tid --net=host xxx的方式,经常找不到服务

cn-core commented 3 years ago

spring cloud Hoxton.SR8 spring cloud alibaba 2.2.6.RELEASE spring boot 2.3.2.RELEASE dubbo 2.7.8 在本机测试,没有问题。 通过docker 部署到ecs服务器, 采用 docker run -tid --net=host xxx的方式,经常找不到服务

也遇到同样问题

tan-zhuo commented 3 years ago

你们是不是在调试时几个相互订阅服务同时启动、或者是几个服务并行注册上线到nacos?

根据我调试结果得出、几个服务在同时启动时、先启动好的上游服务注册入nacos之后、发生服务变更事件、但nacos并不会通知正在注册中的下游服务服务变更事件、从而导致下游服务没有获取到最新的订阅服务信息从而导致 No provider available from registr 错误 、如果每个服务顺序、不并行启动是不会有此问题的。

为了避免在注册中途有订阅服务注册上nacos却没有通知到本服务、故此我在服务启动之后会主动去发起一次订阅服务更新事件、经过测试之后已经解决此问题。

环境: spring-cloud-alibaba 2.2.6.RELEASE nacos-service 2.0.3

解决方法:服务启动后主动发起服务变更事件进行补偿。


@Slf4j
@Component
public class CustomDubboActiveProbeSubscriptionService implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        DubboServiceMetadataRepository dubboServiceMetadataRepository = event.getApplicationContext().getBean(DubboServiceMetadataRepository.class);
        Set<String> subscribedServices = dubboServiceMetadataRepository.getSubscribedServices();
        if (!ObjectUtils.isEmpty(subscribedServices)) {
            DiscoveryClient DiscoveryClient = event.getApplicationContext().getBean(DiscoveryClient.class);
            for (String subscribedService : subscribedServices) {
                log.info("主动探测订阅服务:" + subscribedService);
                ServiceInstancesChangedEvent changedEvent = new ServiceInstancesChangedEvent(subscribedService, DiscoveryClient.getInstances(subscribedService));
                event.getApplicationContext().publishEvent(changedEvent);
            }
        }
    }

}

重现方法: 1、在下游服务启动时断点 org.apache.dubbo.registry.integration.RegistryDirectory 类中 refreshInvoker 方法(当时我是条件断点了某个服务的url)、不放走。 2、启动上游服务、待上游服务启动完成并成功注册入nacos 3、放开下游服务断点、继续启动。 4、下游服务启动完成后、没有收到nacos发出的服务变更事件、如果有变更事件通知将会通过 ServiceInstancesChangedEvent 再次进入 org.apache.dubbo.registry.integration.RegistryDirectory 类中 refreshInvoker 的断点中,可是并没有。 5、下游服务没有能获取到最新的nacos服务注册信息、导致调用发生 No provider available from registry 异常

ufwq commented 3 years ago

服务消费者是正常启动的,就是更新服务提供者之后,消费者偶发性找不到服务提供者

ufwq commented 3 years ago

你们是不是在调试时几个相互订阅服务同时启动、或者是几个服务并行注册上线到nacos?

根据我调试结果得出、几个服务在同时启动时、先启动好的上游服务注册入nacos之后、发生服务变更事件、但nacos并不会通知正在注册中的下游服务服务变更事件、从而导致下游服务没有获取到最新的订阅服务信息从而导致 No provider available from registr 错误 、如果每个服务顺序、不并行启动是不会有此问题的。

为了避免在注册中途有订阅服务注册上nacos却没有通知到本服务、故此我在服务启动之后会主动去发起一次订阅服务更新事件、经过测试之后已经解决此问题。

环境: spring-cloud-alibaba 2.2.6.RELEASE nacos-service 2.0.3

解决方法:服务启动后主动发起服务变更事件进行补偿。


@Slf4j
@Component
public class CustomDubboActiveProbeSubscriptionService implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        DubboServiceMetadataRepository dubboServiceMetadataRepository = event.getApplicationContext().getBean(DubboServiceMetadataRepository.class);
        Set<String> subscribedServices = dubboServiceMetadataRepository.getSubscribedServices();
        if (!ObjectUtils.isEmpty(subscribedServices)) {
            DiscoveryClient DiscoveryClient = event.getApplicationContext().getBean(DiscoveryClient.class);
            for (String subscribedService : subscribedServices) {
                log.info("主动探测订阅服务:" + subscribedService);
                ServiceInstancesChangedEvent changedEvent = new ServiceInstancesChangedEvent(subscribedService, DiscoveryClient.getInstances(subscribedService));
                event.getApplicationContext().publishEvent(changedEvent);
            }
        }
    }

}

重现方法: 1、在下游服务启动时断点 org.apache.dubbo.registry.integration.RegistryDirectory 类中 refreshInvoker 方法(当时我是条件断点了某个服务的url)、不放走。 2、启动上游服务、待上游服务启动完成并成功注册入nacos 3、放开下游服务断点、继续启动。 4、下游服务启动完成后、没有收到nacos发出的服务变更事件、如果有变更事件通知将会通过 ServiceInstancesChangedEvent 再次进入 org.apache.dubbo.registry.integration.RegistryDirectory 类中 refreshInvoker 的断点中,可是并没有。 5、下游服务没有能获取到最新的nacos服务注册信息、导致调用发生 No provider available from registry 异常


服务消费者是正常启动,就是更新服务提供者之后,消费者偶发性找不到服务提供者

tan-zhuo commented 3 years ago

你们是不是在调试时几个相互订阅服务同时启动、或者是几个服务并行注册上线到nacos? 根据我调试结果得出、几个服务在同时启动时、先启动好的上游服务注册入nacos之后、发生服务变更事件、但nacos并不会通知正在注册中的下游服务服务变更事件、从而导致下游服务没有获取到最新的订阅服务信息从而导致 No provider available from registr 错误 、如果每个服务顺序、不并行启动是不会有此问题的。 为了避免在注册中途有订阅服务注册上nacos却没有通知到本服务、故此我在服务启动之后会主动去发起一次订阅服务更新事件、经过测试之后已经解决此问题。 环境: spring-cloud-alibaba 2.2.6.RELEASE nacos-service 2.0.3 解决方法:服务启动后主动发起服务变更事件进行补偿。


@Slf4j
@Component
public class CustomDubboActiveProbeSubscriptionService implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        DubboServiceMetadataRepository dubboServiceMetadataRepository = event.getApplicationContext().getBean(DubboServiceMetadataRepository.class);
        Set<String> subscribedServices = dubboServiceMetadataRepository.getSubscribedServices();
        if (!ObjectUtils.isEmpty(subscribedServices)) {
            DiscoveryClient DiscoveryClient = event.getApplicationContext().getBean(DiscoveryClient.class);
            for (String subscribedService : subscribedServices) {
                log.info("主动探测订阅服务:" + subscribedService);
                ServiceInstancesChangedEvent changedEvent = new ServiceInstancesChangedEvent(subscribedService, DiscoveryClient.getInstances(subscribedService));
                event.getApplicationContext().publishEvent(changedEvent);
            }
        }
    }

}

重现方法: 1、在下游服务启动时断点 org.apache.dubbo.registry.integration.RegistryDirectory 类中 refreshInvoker 方法(当时我是条件断点了某个服务的url)、不放走。 2、启动上游服务、待上游服务启动完成并成功注册入nacos 3、放开下游服务断点、继续启动。 4、下游服务启动完成后、没有收到nacos发出的服务变更事件、如果有变更事件通知将会通过 ServiceInstancesChangedEvent 再次进入 org.apache.dubbo.registry.integration.RegistryDirectory 类中 refreshInvoker 的断点中,可是并没有。 5、下游服务没有能获取到最新的nacos服务注册信息、导致调用发生 No provider available from registry 异常

服务消费者是正常启动,就是更新服务提供者之后,消费者偶发性找不到服务提供者

好吧、我这个问题是满足步骤必现、并不是你描述的这个问题。你这个是并行启动 还是 顺序启动呢?

ufwq commented 3 years ago

你们是不是在调试时几个相互订阅服务同时启动、或者是几个服务并行注册上线到nacos? 根据我调试结果得出、几个服务在同时启动时、先启动好的上游服务注册入nacos之后、发生服务变更事件、但nacos并不会通知正在注册中的下游服务服务变更事件、从而导致下游服务没有获取到最新的订阅服务信息从而导致 No provider available from registr 错误 、如果每个服务顺序、不并行启动是不会有此问题的。 为了避免在注册中途有订阅服务注册上nacos却没有通知到本服务、故此我在服务启动之后会主动去发起一次订阅服务更新事件、经过测试之后已经解决此问题。 环境: spring-cloud-alibaba 2.2.6.RELEASE nacos-service 2.0.3 解决方法:服务启动后主动发起服务变更事件进行补偿。


@Slf4j
@Component
public class CustomDubboActiveProbeSubscriptionService implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        DubboServiceMetadataRepository dubboServiceMetadataRepository = event.getApplicationContext().getBean(DubboServiceMetadataRepository.class);
        Set<String> subscribedServices = dubboServiceMetadataRepository.getSubscribedServices();
        if (!ObjectUtils.isEmpty(subscribedServices)) {
            DiscoveryClient DiscoveryClient = event.getApplicationContext().getBean(DiscoveryClient.class);
            for (String subscribedService : subscribedServices) {
                log.info("主动探测订阅服务:" + subscribedService);
                ServiceInstancesChangedEvent changedEvent = new ServiceInstancesChangedEvent(subscribedService, DiscoveryClient.getInstances(subscribedService));
                event.getApplicationContext().publishEvent(changedEvent);
            }
        }
    }

}

重现方法: 1、在下游服务启动时断点 org.apache.dubbo.registry.integration.RegistryDirectory 类中 refreshInvoker 方法(当时我是条件断点了某个服务的url)、不放走。 2、启动上游服务、待上游服务启动完成并成功注册入nacos 3、放开下游服务断点、继续启动。 4、下游服务启动完成后、没有收到nacos发出的服务变更事件、如果有变更事件通知将会通过 ServiceInstancesChangedEvent 再次进入 org.apache.dubbo.registry.integration.RegistryDirectory 类中 refreshInvoker 的断点中,可是并没有。 5、下游服务没有能获取到最新的nacos服务注册信息、导致调用发生 No provider available from registry 异常

服务消费者是正常启动,就是更新服务提供者之后,消费者偶发性找不到服务提供者

好吧、我这个问题是满足步骤必现、并不是你描述的这个问题。你这个是并行启动 还是 顺序启动呢?

我的问题: 例如,我有3个消费者服务,3个服务提供者服务,都在正常使用中;我更新其中某一个服务提供者服务,这个服务被3个消费者使用,会有1个或2个或3个消费者都找不到我刚刚更新的这个服务,不固定

我在本地调试是好的,通过docker的方式部署到阿里云服务器上面就会出现这种问题。。。。

paoyingshidai commented 3 years ago

我也遇到这样的问题,我有一个优雅的解决方案,添加下面的类 @Component public class DubboRegistryAdapter implements ApplicationListener\<ServiceInstancesChangedEvent> {

@Override
public void onApplicationEvent(ServiceInstancesChangedEvent event) {
    Collection<Registry> registries = SpringCloudRegistryFactory.getRegistries();

    for (Registry registry : registries) {
        DubboCloudRegistry dubboCloudRegistry = (DubboCloudRegistry) registry;

        dubboCloudRegistry.onApplicationEvent(event);
    }
}

}

解释原因: 1,我们首先需要理解 springcloud 体系的负载均衡和 dubbo 的负载均衡,这是两个不同的体系, 当使用 @FeignClient @DubboTransported 的时候,就是将负载均衡的功能委托给 dubbo 体系去解决。 那么这时候我们就需要了解 dubbo 的服务发现和服务变更时 customer 端 refresh 服务注册表是如何实现的。 比如 ZookeeperRegistry 当服务引用 @DubboReference 时, 调用 Protocol --> zookeeperRegistry --> RegistryDirectory#refreshInvoker, 将注册信息保存到 注册表中,因为同时也添加了 zookeeper 对 path 的监听, 当服务端有变化时,customer 端就会监听回调。重新走一遍 zookeeperRegistry --> RegistryDirectory#refreshInvoker,从而更新了注册表。
2,然而 springcloud-alibaba 中,使用的是 DubboCloudRegistry, 它继承 FailbackRegistry, 实现 ApplicationListener 接口。触发DubboCloudRegistry 重新注册的不是直接来自 zookeeper 的回调,而是 zookeeper 回调, 将回调信息放到 ServiceInstancesChangedEvent(个人认为这是为了迎合 springcloud commons 的服务发现规范), 然后发送 ApplicationEvent 事件, 这时候实现了 ApplicationListener 接口的 DubboCloudRegistry 就会监听到 event, 然后进行重新刷新 注册表 的服务 com.alibaba.cloud.dubbo.registry.DubboCloudRegistry#onApplicationEvent---> RegistryDirectory#refreshInvoker 。
3,在 debug 的时候发现,provider 服务变动了,Zookeeper 有收到变更并且生成了 ServiceInstancesChangedEvent,但是DubboCloudRegistry#onApplicationEvent 却收不到事件,继续 debug 了DubboCloudRegistry 的创建和 reference, 发现它并没有纳入 spring IOC 的管理,所以没有收到事件。 DubboCloudRegistry 的创建过程通过 org.apache.dubbo.registry.support.AbstractRegistryFactory#getRegistry(org.apache.dubbo.common.URL) 进行,创建完成之后放在 Map<String, Registry> 中,参看 SpringCloudRegistryFactory 源码。 整个过程都没有将 DubboCloudRegistry 注册为 bean, 导致 ApplicationListener 失效。
4,所以解决方案就简单了,首先自己新建一个类,实现 ApplicationListener 接口, 并注册为 bean, 在实现方法中将 ServiceInstancesChangedEvent 传给 SpringCloudRegistryFactory.getRegistries(), 之前注册的DubboCloudRegistry,DubboCloudRegistry 调用 RegistryDirectory 更新注册表。完美解决。
5,但是如果先启动 customer 然后再启动 provider, 这种情况还是没能解决。原因是 com.alibaba.cloud.dubbo.openfeign.TargeterInvocationHandler#createDubboInvocationHandler 生成代理的时候,如果在注册中心找不到 provider 的注册信息,就会生成 defaultFeignClientInvocationHandler,这是个 404 请求。同时 feignMethodMetadataMap.size() == 0, 在执行服务调用的时候就会调用 defaultFeignClientInvocationHandler。参看 com.alibaba.cloud.dubbo.openfeign.DubboInvocationHandler#invoke。然而在 provider 启动之后,没有将信息添加到com.alibaba.cloud.dubbo.openfeign.DubboInvocationHandler#feignMethodMetadataMap 中,导致服务端启动后依然请求了 defaultFeignClientInvocationHandler,所以导致错误。
6,思考:dubbo 在融合进 springcloud-commons 规范的过程中遇到的问题,@DubboTransported 有强行将服务调用 与负载均衡强行打包的意思,如果不做重构,将与后面的 springcloud loadbalance 规范产生大的分歧。

mercyblitz commented 3 years ago

@paoyingshidai Can you Pull request your code?

mercyblitz commented 3 years ago

6,思考:dubbo 在融合进 springcloud-commons 规范的过程中遇到的问题,@DubboTransported 有强行将服务调用 与负载均衡强行打包的意思,如果不做重构,将与后面的 springcloud loadbalance 规范产生大的分歧。

@DubboTransported will switch the load balancer using Dubbo's, Spring Cloud Load Balancer will be ignored.

It may adapter Spring Cloud Load Balancer into Dubbo LoadBalance SPI.

mercyblitz commented 3 years ago

@paoyingshidai Can you Pull request your code?

https://gitee.com/paoyingshidai/springcloud-alibaba.git

Please PR to here, thanks~

dujie-js commented 2 years ago

2.2.7.RELEASE 版本在对应的生产者消费者同时启动时存在消费者找不到对应的dubbo生产者,我自己测试采用的单机同时启动生产者和消费者。采用的idea 的服务管理同时启动,可能生产者和消费者启动的间隔时间很短。我这里必现 https://github.com/spring-cloud-alibaba-study/NacosGradle/tree/spring-cloud-dubbo%E7%89%88%E6%9C%AC2.3.12.RELEASE 这里有我对应的所有组件的版本号

Duorhs commented 2 years ago

https://github.com/alibaba/spring-cloud-alibaba/issues/1581 https://github.com/alibaba/spring-cloud-alibaba/issues/1697 我也遇到了这个问题,同时启动时会出现no provider。根据这两个issue,把配置文件的dubbo.registry.address前缀改成nacos就没事了..

tan-zhuo commented 2 years ago

我觉得这个问题可以开一个新问题,仔细描述一下原因与过程。

liuxinaction commented 1 year ago

这个问题现在到底解决了没

dujie-js commented 1 year ago

这个问题现在到底解决了没

没有 整合dubbo连分支都拆走了不维护了