dubbo报错:Forbid consumer 问题分析 & 解决

旧巷老猫 提交于 2019-11-30 01:50:28

环境:

    dubbo 2.5.3

    ZooKeeper 3.4.11

    docker容器

异常:

Forbid consumer 10.233.102.178 access service io.newbanker.modules.sys.service.ExhibitionCenterConfigService 
from registry zk-0:2181 use dubbo version 2.5.3, Please check registry access list (whitelist/blacklist).

源码分析:

    https://my.oschina.net/grindwheel/blog/522932  (其实并没有解决,只是分析问题原因。)

排查思路:

1、首先在ZooKeeper注册中心上,查看providers是否存在:

        如果不存在,则说明providers未成功注册。则转到第2条。

2、查看docker容器中,providers程序是否运行正常。

        如果运行不正常:则问题在dubbo providers服务。查看provider日志、重启等操作。

        如果运行正常:【前提:一段时间后,重试仍然报错(排除provider侧因网络抖动等原因,出现和注册中心断开的情况)

            

            0.最基本的:这种情况是consumer端找不到提供者,检查注册中心环境,consumer、provider分组版本等是否一致(如果是接口版本号不一样,那.........)

            a.如果使用了docker:docker容器内的providers注册到zk1,而docker容器外的consumer(比如本地consumer程序)连接注册中心也是zk1:

               此时providers是正常的,本地的consumer也是正常的,但是由于docker容器内的provider没有把dubbo协议端口(默认20880)暴露出来,docker外界是无法访问docker内部的20880端口的。

               如果是这种问题的话,就从consumer机器telnet一下provider的ip和端口。看能不能telnet通。

            b.如果报错的服务是:com.alibaba.dubbo.monitor.MonitorService异常,但是不影响正常使用。则可能原因是:consumer项目中配置开启了dubbo-monitor,但是真是情况是不需要开启dubbo-monitor的。

                相关dubbo issues:https://github.com/apache/dubbo/issues/286

                

            c.检查是否是在同一个tomcat中启动了consumer和provider?

                https://github.com/apache/dubbo/issues/1070   jkxqj中问道:本地运行生产者和消费者2个项目在同一个tomcat中,生产者无法正常启动,请问这是什么情况?

                在此issues中,下面人让去看#317,但是#317中并没有明确说出原因。应该去看#684

                

                https://github.com/apache/dubbo/issues/684

                

            x.(最后,以下为猜测)providers宕机(假如任何providers)-》zk通知consumer-》consumer触发refreshInvoker(List<URL> invokerUrls)-》providers启动并在ZooKeeper注册成功后-》ZooKeeper通过watch通知consumer时,因网络或其他原因,未通知到consumer。导致consumer未执行refreshInvoker(List<URL> invokerUrls)-》此时consumer就会一直报错Forbid consumer

private void refreshInvoker(List<URL> invokerUrls){

   if (invokerUrls != null && invokerUrls.size() == 1 && invokerUrls.get(0) != null && Constants.EMPTY_PROTOCOL .equals(invokerUrls.get(0).getProtocol())) {

            this.forbidden = true; // 设置当前consumer禁止访问此providers

            this.methodInvokerMap = null; // 置空列表

            destroyAllInvokers(); // 关闭所有Invoker

   }

此猜测参考:https://github.com/apache/dubbo/issues/317  hesy007评论

 

 

 

参考:

    解决dubbo问题:forbid consumer    https://my.oschina.net/grindwheel/blog/522932   (其实并没有解决,只是分析问题原因。)

其他dubbo issues:

    本地存根和本地伪装无法使用 https://github.com/apache/dubbo/issues/65

    生产环境运行过程中客户端与服务端Channel断了,无法自动恢复 https://github.com/apache/dubbo/issues/458

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!