解决dubbo问题:forbid consumer
线下环境经常出现类似这种异常:
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相关推荐
- 解决dubbo问题:forbid consumer(2)
解决dubbo问题:forbid consumer(2) 参考文章: (1)解决dubbo问题:forbid consumer(2) (2)https://www.cnblogs.com/austin ...
- Forbid consumer 10.100.8.14 access service com.alibaba.dubbo.monitor.MonitorService解决办法
网上有很多文章分析这个错误的原因,甚至贴出源码,结论是缺少服务提供者.我这里也复现了这样的问题. 2018-04-28 11:03:58,806 (186601 ms) ERROR [DubboMon ...
- com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.168.184.1 access service com.foreveross.syst
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 报错如下: com.alibaba.dubbo.rpc.RpcException: Forbid c ...
- dubbo问题:forbid consumer报错
forbid consumer报错 今天在写项目时遇到一个问题,记录一下: com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.169.10 ...
- dubbo报错Forbid consumer xxxx access service xxx from registryxxx
使用Springboot+dubbo构建的项目.在启动过程中没有报错.浏览器进行访问时,controller报错: com.alibaba.dubbo.rpc.RpcException: Forbid ...
- DUBBO报错 Forbid consumer
Forbid consumer access service com.xxx.xxx from registry xxx.xxx.xxx.xxx:2181 use dubbo version 2.5 ...
- 搭建dubbo项目解决dubbo.xml标签报错的问题
搭建dubbo项目解决dubbo.xml标签报错的问题 参考文章: (1)搭建dubbo项目解决dubbo.xml标签报错的问题 (2)https://www.cnblogs.com/ajax-li/ ...
- 解决 dubbo问题:Forbid consumer 192.xx.xx.1 access service com.xx.xx.xx.rpc.api.xx from registry 116.xx1
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 我的情况是: 原本我把服务放在A工程中,后来改到B工程中了,所以原来的服务不存在了,查不到服务了,故 ...
- 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 ...
最新文章
- EM算法(Expectation Maximization)期望最大化算法
- Hacker(六)----黑客藏匿之地--系统进程
- Git使用方法——原创
- python2.7配置tensorflow1.5.0和keras2.1.6
- 怎么查看端口占用情况?
- 巧用句柄函数:闪烁窗体,做提示功能时很有用哦
- Linux 下shell中exec解析
- python中 是什么运算符_Python 运算符
- 判断 Java 中的空字符串
- jdk1.8配置(自我速成)
- JVM的方法区和永久带是什么关系?
- jquery 控制frameset frame节点内容(在子窗口中把该窗口中的焦点处的text内容填
- python int函数 向上取整_【Python小课】 print()函数
- 初二生态系统思维导图_鑫讲堂:初二年级十一月微讲座汇报(二)
- Django访问静态资源
- python随机森林回归_机器学习:Python实现随机森林回归
- macos 软件清单
- 如何通俗易懂地理解什么叫泛型?
- 九峰影业创始人_以终为始 逐梦青春——九峰实验学校2020届高三毕业典礼
- python reserve函数_Python reversed函数及用法
热门文章
- [hive 报错]:FAILED:SemanticException [Error 10025] Expression not in GROUP BY key
- html游戏手柄,纯CSS3实现的游戏控制手柄
- 用devc++表白_「你表白,我宠你」520—实验猿的表白日,小析姐的“宠粉”节
- CANoe隐藏属性——Multi CANoe
- Kubernetes1.4新特性前瞻:设置JOB执行计划
- 工作中jQuery常用实例-主要功能总结整理
- Opencv使用imread函数时,读到的数据为空
- Hive权限管理,增加用户,授权
- C#框架设计之浅谈SOA与钝化模式
- c#取消word修订痕迹_法律人必备的WORD技能,从1.0到2.0丨星瀚技术派