dubbo 异常Please check registry access list (whitelist/blacklist)的分析

原创 2016年09月20日 00:44:39

dubbo 异常Please check registry access list (whitelist/blacklist)的分析

出现这个问题,抛出的异常如下所示。

com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.168.1.101 access service service.DemoService from registry 127.0.0.1:2181 use dubbo version 2.8.4, Please check registry access list (whitelist/blacklist).
    at com.alibaba.dubbo.registry.integration.RegistryDirectory.doList(RegistryDirectory.java:579)
    at com.alibaba.dubbo.rpc.cluster.directory.AbstractDirectory.list(AbstractDirectory.java:73)
    at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.list(AbstractClusterInvoker.java:260)
    at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:219)
    at com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:72)
    at com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:52)
    at com.alibaba.dubbo.common.bytecode.proxy0.sayHello(proxy0.java)
    at service.Client.main(Client.java:15)

根据抛出的异常,很容易定位到抛出异常的位置。

com.alibaba.dubbo.registry.integration.RegistryDirectory.doList(RegistryDirectory.java:579)

进入到源码579行位置处可以看到抛出该异常是因为forbidden变量被设为true导致。

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。

消费端代码如下。

public class Client {
    public static void main(String[] args) throws InterruptedException {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
                "classpath:dubboClient.xml");
        DemoService demoService = (DemoService) ctx.getBean("demoService");
                String ret = demoService.sayHello("Check white list/black list");
                System.out.println(demoService + ":" + ret);
        ctx.close();
    }
}

在上述代码ctx.getBean设置断点,一路跟踪可以得到如下的调用栈。

调用栈

这里写图片描述
这里创建了一个监听器,如果孩子结点状态发生变化改方法会被调用。
而这个调用中toUrlsWithEmpty(url, parentPath, currentChilds)方法中,如果服务提供者列表为空,那么请求协议会被设置为empty。

    private List<URL> toUrlsWithEmpty(URL consumer, String path, List<String> providers) {
        List<URL> urls = toUrlsWithoutEmpty(consumer, providers);
        if (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;
    }

随后上图中notify方法被调用。接着进入notify方法,
AbstractRegistry:notify(URL url, NotifyListener listener, List urls)会被调用。该方法中第449中调用 listener.notify(categoryList);而这个方法中会调用refreshInvoker(invokerUrls);

这里写图片描述

可以看到当协议为empty,且最终在这个方法中变量被设置为true,导致消费者一方调用方法时抛出check registry access list (whitelist/blacklist)。

而监听器的调用路径可以通过IDE查看得到。那么注册的监听器方法什么时候被触发呢?通过名字可以猜测到,对应的Zookeeper上的结点发生变化时触发。这个可通过在消费端运行时将服务端关闭,对应的Zookeeper上的注册信息删除后,触发对应的Zk结点变更事件该方法被触发,从而导致forbidden变量被设置为true,最后抛出whitelist/blacklist异常。

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

DUBBO的com.alibaba.dubbo.rpc.RpcException解决方法

联接超时问题 Caused by: com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method subscribe in the s...
  • doegoo
  • doegoo
  • 2015-11-06 10:41
  • 33896

解决dubbo问题:forbid consumer

原文地:http://www.jameswxx.com/%e4%b8%ad%e9%97%b4%e4%bb%b6/%e8%a7%a3%e5%86%b3dubbo%e9%97%ae%e9%a2%98%ef...

dubbo registry 基本流程

dubbo

Dubbo入门---搭建一个最简单的Demo框架

Dubbo背景和简介Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起。 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本。 ...

给dubbo接口添加白名单——dubbo Filter的使用

在开发中,有时候需要限制访问的权限,白名单就是一种方法。对于Java Web应用,Spring的拦截器可以拦截Web接口的调用;而对于dubbo接口,Spring的拦截器就不管用了。 dubbo提供了...

dubbo 异常Please check registry access list (whitelist/blacklist)的分析与解决

dubbo 异常Please check registry access list (whitelist/blacklist)的分析与解决 工作中遇到了这个异常,当时仅仅是查了解决方法,但问题解...
  • zzm628
  • zzm628
  • 2016-12-07 17:49
  • 3616

Dubbo源代码实现三:注册中心Registry

我们知道,对于服务治理框架来说,服务通信(RPC)和服务管理两部分必不可少,而服务管理又分为服务注册、服务发现和服务人工介入,我们来看看Dubbo框架的结构图(来源网络):   图中可以看出,服务提供...

消息推送系统的设计

一、消息推送系统设计需求 1、高性价比,在有限的硬件资源下,尽可能的提高消息系统的性能和可用性。 2、提高数据的一致性。 二、分析 消息推送,按数据量划分,包括两类...
  • zollty
  • zollty
  • 2016-12-31 21:52
  • 1796

解决dubbo问题:forbid consumer

线下环境经常出现类似这种异常: com.alibaba.dubbo.rpc.RpcException: Forbid consumer 10.0.53.69 access service com...
  • joeyon
  • joeyon
  • 2016-03-22 11:15
  • 13307

解决dubbo问题:forbid-consumer/

线下环境经常出现类似这种异常: com.alibaba.dubbo.rpc.RpcException: Forbid consumer 10.0.53.69 access service com...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)