线下环境经常出现类似这种异常:

com.alibaba.dubbo.rpc.RpcException: Forbid consumer 10.0.53.69 access service com.kuaidadi.op.api.pay.service.PayChannelConfigRemoteService from registry 10.0.50.150:2181 use dubbo version 2.5.3, Please check registry access list (whitelist/blacklist).

大致意思是当前调用者被禁止访问某个服务,请检查下注册中心访问列表,还有黑名单和白名单。
其实线下环境根本没有对服务做白名单和黑名单机制,因为线下环境给开发人员的账号是guest,没有权限做黑白名单。今天有好几个人问我这个问题,我仔细看了源码,找出了根源所在。
根据异常栈,抛出这个异常的代码在RegistryDirectory的第579行,如下:

public List<Invoker<T>> doList(Invocation invocation) {if (forbidden ) {throw new RpcException(RpcException.FORBIDDEN_EXCEPTION , ” Forbid consumer “ +  NetUtils. getLocalHost() + ” access service “ +        getInterface().getName() + ” from registry “ + getUrl().getAddress() + ” use dubbo version “ + Version.getVersion() + “, Please check registry access list (whitelist/blacklist).”);
}

如果forbidden变量为true,则抛出该异常。forbidden变量默认为false,那么什么时候变成true了呢?看RegistryDirectory的这段代码:

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; // 禁止访问this.methodInvokerMap = null; // 置空列表destroyAllInvokers(); // 关闭所有Invoker}

意思是如果invokerUrls的size为1,并且url的协议头是Constants.EMPTY_PROTOCOL时,则设置forbidden为false,Constants.EMPTY_PROTOCOL的值是empty。

refreshInvoker方法什么时候被调用呢?当某个服务的provider有变化时就会被调用,例如zookeeper上某个服务的provider目录里的内容发生变化,则zk监听器会被触发,由于provider的数量会发生变化,例如有一个新的provider启动了,有一个provider下线了,所以必须刷新本地的对provider的连接,具体逻辑就在refreshInvoker方法里,这个方法的调用栈如下:

可以确定的是,zookeeper推送的URL的protocol部分不可能无缘无故变成了empty,肯定是由某个地方更改了,于是看一下Constants.EMPTY_PROTOCOL到底有哪些地方调用了,如下:

见图中红色圈圈部分,当zookeeper初次订阅或者订阅的信息有变更时,都会触发toUrlsChanged方法,看看这个方法内部都做了什么,完整代码如下:

  private List<URL> toUrlsWithEmpty(URL consumer, String path, List<String> providers) {List<URL> urls = toUrlsWithoutEmpty(consumer, providers);if (urls == null || urls.isEmpty()) {int i = path.lastIndexOf(‘/’ );String category = i < 0 ? path : path.substring(i + 1);URL empty = consumer.setProtocol(Constants.EMPTY_PROTOCOL ).addParameter(Constants. CATEGORY_KEY, category);urls.add(empty);}return urls;}

可见如果toUrlsWithoutEmpty的结果是空或者size为0,则强制返回一个protocol为empty的url,看来源头就在这里了。传入的List providers实际上就是最新的服务提供者信息,当某个服务没有任何provider时,providers就变为一个size为o的List了,导致返回一个协议头为empty的url,进而导致forbidden为true,屏蔽了consumer调用。
Category: 中间件 标签:dubbo

解决dubbo问题:forbid consumer相关推荐

  1. 解决dubbo问题:forbid consumer(2)

    解决dubbo问题:forbid consumer(2) 参考文章: (1)解决dubbo问题:forbid consumer(2) (2)https://www.cnblogs.com/austin ...

  2. Forbid consumer 10.100.8.14 access service com.alibaba.dubbo.monitor.MonitorService解决办法

    网上有很多文章分析这个错误的原因,甚至贴出源码,结论是缺少服务提供者.我这里也复现了这样的问题. 2018-04-28 11:03:58,806 (186601 ms) ERROR [DubboMon ...

  3. com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.168.184.1 access service com.foreveross.syst

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 报错如下: com.alibaba.dubbo.rpc.RpcException: Forbid c ...

  4. dubbo问题:forbid consumer报错

    forbid consumer报错 今天在写项目时遇到一个问题,记录一下: com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.169.10 ...

  5. dubbo报错Forbid consumer xxxx access service xxx from registryxxx

    使用Springboot+dubbo构建的项目.在启动过程中没有报错.浏览器进行访问时,controller报错: com.alibaba.dubbo.rpc.RpcException: Forbid ...

  6. DUBBO报错 Forbid consumer

    Forbid consumer  access service com.xxx.xxx from registry xxx.xxx.xxx.xxx:2181 use dubbo version 2.5 ...

  7. 搭建dubbo项目解决dubbo.xml标签报错的问题

    搭建dubbo项目解决dubbo.xml标签报错的问题 参考文章: (1)搭建dubbo项目解决dubbo.xml标签报错的问题 (2)https://www.cnblogs.com/ajax-li/ ...

  8. 解决 dubbo问题:Forbid consumer 192.xx.xx.1 access service com.xx.xx.xx.rpc.api.xx from registry 116.xx1

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 我的情况是: 原本我把服务放在A工程中,后来改到B工程中了,所以原来的服务不存在了,查不到服务了,故 ...

  9. Forbid consumer 192.168.85.1 access service com.sharearn.dubbo.romote.TestService from registry

    为什么80%的码农都做不了架构师?>>>    com.alibaba.dubbo.rpc.RpcException:Forbid    consumer192.168.85.1 a ...

最新文章

  1. EM算法(Expectation Maximization)期望最大化算法
  2. Hacker(六)----黑客藏匿之地--系统进程
  3. Git使用方法——原创
  4. python2.7配置tensorflow1.5.0和keras2.1.6
  5. 怎么查看端口占用情况?
  6. 巧用句柄函数:闪烁窗体,做提示功能时很有用哦
  7. Linux 下shell中exec解析
  8. python中 是什么运算符_Python 运算符
  9. 判断 Java 中的空字符串
  10. jdk1.8配置(自我速成)
  11. JVM的方法区和永久带是什么关系?
  12. jquery 控制frameset frame节点内容(在子窗口中把该窗口中的焦点处的text内容填
  13. python int函数 向上取整_【Python小课】 print()函数
  14. 初二生态系统思维导图_鑫讲堂:初二年级十一月微讲座汇报(二)
  15. Django访问静态资源
  16. python随机森林回归_机器学习:Python实现随机森林回归
  17. macos 软件清单
  18. 如何通俗易懂地理解什么叫泛型?
  19. 九峰影业创始人_以终为始 逐梦青春——九峰实验学校2020届高三毕业典礼
  20. python reserve函数_Python reversed函数及用法

热门文章

  1. [hive 报错]:FAILED:SemanticException [Error 10025] Expression not in GROUP BY key
  2. html游戏手柄,纯CSS3实现的游戏控制手柄
  3. 用devc++表白_「你表白,我宠你」520—实验猿的表白日,小析姐的“宠粉”节
  4. CANoe隐藏属性——Multi CANoe
  5. Kubernetes1.4新特性前瞻:设置JOB执行计划
  6. 工作中jQuery常用实例-主要功能总结整理
  7. Opencv使用imread函数时,读到的数据为空
  8. Hive权限管理,增加用户,授权
  9. C#框架设计之浅谈SOA与钝化模式
  10. c#取消word修订痕迹_法律人必备的WORD技能,从1.0到2.0丨星瀚技术派