解决dubbo问题:forbid consumer

解决dubbo问题:forbid consumer

By admin | 2015/06/09

0 Comment

线下环境经常出现类似这种异常:

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<String> providers实际上就是最新的服务提供者信息,当某个服务没有任何provider时,providers就变为一个size为o的List了,导致返回一个协议头为empty的url,进而导致forbidden为true,屏蔽了consumer调用。

时间: 2024-11-05 11:56:25

解决dubbo问题:forbid consumer的相关文章

com.alibaba.dubbo.rpc.RpcException: Forbid consumer 10.254.7.50 access service com.qingmu.core.service.ContentService from registry 192.168.200.128:2181 use dubbo version 2.8.4

Could not complete request com.alibaba.dubbo.rpc.RpcException: Forbid consumer 10.254.7.50 access service com.qingmu.core.service.ContentService from registry 192.168.200.128:2181 use dubbo version 2.8.4, Please check registry access list (whitelist/

Dubbo之旅--Consumer示例

我们已经对提供者示例进行了详细的阐述,接下来的消费者相对而言比较简单. 1 配置相关pom.xml信息,跟提供者类似,需要相关环境的java包应用. <projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4

解决:dubbo找不到dubbo.xsd报错

构建dubbo项目的时候会遇到: Multiple annotations found at this line: - cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'dubbo:application'.- schema_reference.4: Failed to read schema document 'http://code.ali

Maven多模块、Dubbo分布式服务框架的SpringMVC项目的基础搭建

现互联网公司后端架构常用到Spring+SpringMVC+MyBatis,通过Maven来构建.通过学习,我已经掌握了基本的搭建过程,写下基础文章为而后的深入学习奠定基础. 首先说一下这篇文章的主要内容分为: 1.Maven多模块项目的创建: 2.Maven与SpringMVC的整合: 3.Dubbo的环境配置及与整合: 4.新手在整合过程易犯的错误. 通过一个简单的demo来说明,大家多多指教,分享经验! 一.Maven多模块项目的创建 我们需要建立一个多模块的maven项目,其目录结构为

dubbu 官方参考手册~备案(防止哪天阿里一生气把dubbo给删除了)

首页  ||  下载  ||  用户指南  ||  开发者指南  ||  管理员指南  ||  培训文档  ||  常见问题解答  ||  发布记录  ||  发展路线  ||  社区 English | 中文 用户指南 入门 背景 需求 架构 用法 快速启动 服务提供者 服务消费者 依赖 必需依赖 缺省依赖 可选依赖 成熟度 功能成熟度 策略成熟度 配置 Xml配置 属性配置 注解配置 API配置 示例 启动时检查 集群容错 负载均衡 线程模型 直连提供者 只订阅 只注册 静态服务 多协议 多

dubbo超时的深思

在dubbo的provider和consumer的配置文件中,如果都配置了timeout的超时时间,dubbo默认以consumer中配置的时间为准 provider.xml的配置: <dubbo:service timeout="4000" retries="0" interface="com.dingding.tms.bms.service.BillingZfbCodOrderService" ref="billingZfbC

RPC实践(四)Dubbo实践

Dubbo是一款重要的RPC框架,它是Alibaba开源的分布式服务框架.它主要特点:提供了注册中心来进行服务的管理,支持zookeeper.redis等方式来实现注册中心:Dubbo按照分层的方式来架构,使用这种方式可以使各个层之间解耦合或者最大限度地松耦合:采用的是服务提供者Provider和消费者Consumer这样模型. 一.Dubbo简单介绍 Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. Dubbo有何特

dubbo+zookeeper集群

安装Dubbo,并利用zookeeper作为注册中心 环境准备: 了解dubbo相关信息http://dubbo.io/Home-zh.htm dubbo安装: Zookeeper下载 download zookeeper Install 伪分布式 1.解压下载好的zookeeper,到服务器上,解压并重命名 wget http://www.apache.org/dist/zookeeper/stable/zookeeper-3.4.6.tar.gz tar zxvf zookeeper-3.4

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

我们知道,对于服务治理框架来说,服务通信(RPC)和服务管理两部分必不可少,而服务管理又分为服务注册.服务发现和服务人工介入,我们来看看Dubbo框架的结构图(来源网络): 图中可以看出,服务提供者Provider往服务注册中心Registry注册服务,而的消费者Consumer从服务注册中心订阅它需要的服务,而不是全部服务,当有新的Provider出现,或者现有Provider宕机,注册中心Registry都应该能尽早发现,并将新的Provider列表推送给对应的Consumer,有了这样的机