本地运行Dubbo经常出现以下情况:

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).

一、问题分析:

其实线下环境根本没有对服务做白名单和黑名单机制。通过阅读源码,分析如下:

根据异常栈,抛出这个异常的代码在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的连接,具体逻辑就在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<String> providers实际上就是最新的服务提供者信息,当某个服务没有任何provider时,providers就变为一个size为0的List了,导致返回一个协议头为empty的url,进而导致forbidden为true,屏蔽了consumer调用。

转载于:https://www.cnblogs.com/eyesmoon/p/10064486.html

Dobbo问题及解决方案:forbid-consumer相关推荐

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

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

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

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

  3. 解决dubbo问题:forbid consumer

    线下环境经常出现类似这种异常: com.alibaba.dubbo.rpc.RpcException: Forbid consumer 10.0.53.69 access service com.ku ...

  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. Forbid consumer 10.100.8.14 access service com.alibaba.dubbo.monitor.MonitorService解决办法

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

  7. DUBBO报错 Forbid consumer

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

  8. 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 ...

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

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

最新文章

  1. SQL Server 任务监控脚本
  2. 谈行业数字化转型,先要搞明白ICT生态的共赢共生
  3. linux complete函数,Linux驱动中completion接口浅析(wait_for_complete例子,很好)
  4. 自定义导航页_带你回归“真”的导航页
  5. php 126怎么设置发送邮箱验证码,phpmailer发送网易126邮箱的例子
  6. 给GridView设置行高
  7. HTML/CSS常用标签属性及样式
  8. 电视剧《赘婿》宁毅与乌家的岁布战没怎么看懂,可以细致分析一下吗?
  9. 【优化算法】改进型的LMS算法【含Matlab源码 630期】
  10. 【Vegas原创】IPAD忘记密码重置恢复出厂设置
  11. 装了Restorator,打开应用程序,提示不支持此接口的解决方法
  12. Python 把蓝底照片转化为白底照片
  13. java项目前有红色叉号_eclipse导入项目后出现红色叉号的解决方案
  14. fatal: unable to access ‘https://github.com/NEGVS/the-economist-ebooks.git/‘: schannel: failed to re
  15. 【iOS开发】——MRC(手动内存管理)的一些补充
  16. Unit Test Harness(用具)应该具备什么功能?
  17. Germaine的安装
  18. Swift 开发之 Vapor
  19. 【迪大学院】X64X86游戏安全逆向分析相关所有视频链接
  20. 大数据技术和云计算之间,主要有什么关系?

热门文章

  1. 2022-01-26 Android app java 获取设备制造商的方法:Build.MANUFACTURER,实际上是读ro.product.manufacturer的值。
  2. Prim之 公路村村通
  3. 警惕黑客通过注入iFrame分离器以窃取支付数据
  4. 东区机房浏览器问题记录排查
  5. 值得推荐的五个源码网站
  6. 载着 AI 梦想向前奔跑!2022 Amazon DeepRacer 自动驾驶联赛未完待续!
  7. 大专生学Java好找工作
  8. 案例 | 从RISC到 x86,飞机维修业翘楚Ameco 转型记
  9. 【微信抢红包】红包助手-修改版
  10. 学校网站建设制作:学校站群系统需要哪些栏目规划设计?