环境:
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