Dubbo: Please check registry access list (whitelist/blacklist)

Created on 12 Sep 2017  ·  13Comments  ·  Source: apache/dubbo

应用环境:
Server version: Apache Tomcat/7.0.55
OS Name: Linux
OS Version: 2.6.32-431.el6.x86_64
Architecture: amd64
JVM Version: 1.8.0_112-b15

zk环境:zookeeper-3.4.6

com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.168.1.29 access service jyd.info.service.product.IProductDictService from registry 192.168.1.27:2181 use dubbo version 2.5.3, Please check registry access list (whitelist/blacklist)

一直报此错误,其他consumer不会报,请各位指点

typquestion & discussion

Most helpful comment

@goal578 建议问题确认和解决回复后及时关闭issue,降低维护人员工作.

同时也建议大家提issue的时候先搜一下,避免提重复问题,在同一个问题加追加comment,我们可以看下200多个issue包括之前已经关闭的,其实很多都是重复的。这样给项目维护者带来麻烦,而且问题不好跟踪.

All 13 comments

各位同仁,又碰到过的吗?源码就是这段,不知道是干嘛的

public synchronized void notify(List<URL> urls) {
        List<URL> invokerUrls = new ArrayList<URL>();
        List<URL> routerUrls = new ArrayList<URL>();
        List<URL> configuratorUrls = new ArrayList<URL>();
        for (URL url : urls) {
            String protocol = url.getProtocol();
            String category = url.getParameter(Constants.CATEGORY_KEY, Constants.DEFAULT_CATEGORY);
            if (Constants.ROUTERS_CATEGORY.equals(category) 
                    || Constants.ROUTE_PROTOCOL.equals(protocol)) {
                routerUrls.add(url);
            } else if (Constants.CONFIGURATORS_CATEGORY.equals(category) 
                    || Constants.OVERRIDE_PROTOCOL.equals(protocol)) {
                configuratorUrls.add(url);
            } 

# **else if (Constants.PROVIDERS_CATEGORY.equals(category)) {
                invokerUrls.add(url);**

            } else {
                logger.warn("Unsupported category " + category + " in notified url: " + url + " from registry " + getUrl().getAddress() + " to consumer " + NetUtils.getLocalHost());
            }
        }

ZK通知消费者会有三种类型:路由信息,配置信息,服务提供者信息。这个invokerUrls是服务提供方服务暴露地址。

从报错看是服务消费者连不上服务提供者,检查网络看看?

你好,我从消费者主机 telnet dubbo主机和端口,是可以通的

是啊,我贴出来的源码就是forbidden的赋值,但是不知道通过什么规则来给它赋值

看了一下代码,在RegistryDirectory中有一个属性forbidden是用来控制是否抛出这个异常的。

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).");
}

这个属性默认是false的,当服务提供者返回的信息是empty的时候会改成true。

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
}

你检查一下这个消费者连的zk,看看数据。看节点provider下面注册的服务是不是empty协议的。

image

这种情况是consumer端找不到提供者,检查注册中心环境,consumer、provider分组、版本等是否一致

这些源码我也看了,但是不清楚怎么解决?客户端我能debug到,看不到你截图的这些东东?
default

@chickenlj consumer、provider分组 ?没理解,版本的话多个服务器都是一样,其他consumer都能调到,唯独今天昨天新加的一台consumer调不到

@chickenlj 你们说的版本是自己定义的接口版本 还是 dubbo版本。自己的接口版本我是随便定义的,dubbo版本都是2.5.3

你有搭建的ops平台吗?建议先到平台上查询consumer provider注册是否正常

@chickenlj 你好,我这边也遇到这样的问题。 我查看了网络,是正常的。 别的系统是能正常消费这个服务的。 我也看了zk上的provider,这个服务的provider的协议也是正常的。 同时别的系统也能正常使用这个服务。

@chickenlj @lixinyou @hellofqs 我的问题已经解决,是一场悲剧,我的是网络问题,我和运维商量的端口没统一,沟通不到位,多谢各位协助

@goal578 建议问题确认和解决回复后及时关闭issue,降低维护人员工作.

同时也建议大家提issue的时候先搜一下,避免提重复问题,在同一个问题加追加comment,我们可以看下200多个issue包括之前已经关闭的,其实很多都是重复的。这样给项目维护者带来麻烦,而且问题不好跟踪.

Was this page helpful?
0 / 5 - 0 ratings