解决dubbo问题:forbid consumer

2023-11-10

原文地址: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%bc%9aforbid-consumer/

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

com.alibaba.dubbo.rpc.RpcException: Forbid consumer access service from registry use dubbo version 2.5.3, Please check registry access list (whitelist/blacklist).

大致意思是当前调用者被禁止访问某个服务,请检查下注册中心访问列表,还有黑名单和白名单。

其实线下环境根本没有对服务做白名单和黑名单机制,因为线下环境给开发人员的账号是guest,没有权限做黑白名单。今天有好几个人问我这个问题,我仔细看了源码,找出了根源所在。

根据异常栈,抛出这个异常的代码在RegistryDirectory的第579行,如下:

public List<Invoker> 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 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方法里,这个方法的调用栈如下:

[这里是图片001]

可以确定的是,zookeeper推送的URL的protocol部分不可能无缘无故变成了empty,肯定是由某个地方更改了,于是看一下 Constants. EMPTY_PROTOCOL到底有哪些地方调用了,如下:

[这里是图片002]

见图中红色圈圈部分,当zookeeper初次订阅或者订阅的信息有变更时,都会触发toUrlsChanged方法,看看这个方法内部都做了什么,完整代码如下:

private List toUrlsWithEmpty(URL consumer, String path, List providers) {

List 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 什么是子系统、模块、功能点,你清楚吗?

    1 子系统 对于所实现系统在功能上做的整体划分 可以是某个子系统 2 功能模块 子系统下的功能点的集合 3 功能点 通过用户交互触发 外部系统触发或后台程序触发来完成的一个完整的动作 搞清楚这些 有助于你书写建设方案 设计文档
  • Java--IDEA中Spring配置错误:class path resource [.xml] cannot be opened because it does not exist

    一 报错 运行 Spring 项目时报错如下 class path resource beans xml cannot be opened because it does not exist 没有找到 beans xml 配置文件 二 报错
  • 爬取旅游网站

    完整代码如下 可直接copy from bs4 import BeautifulSoup import urllib request import sqlite3 import os import time import threading
  • Maven项目里的pom解析和nexus私服

    一 什么是pom POM 即Project Object Model 通过pom xml文件配置Maven2 然后Maven2根据此配置执行 作用类似ant的build xml文件 功能更强大 该文件用于管理 源代码 配置文件 开发者的信息
  • 【C++】类与对象上

    文章目录 1 auto关键字 1 1auto介绍 1 2auto使用规则 1 3auto不能推导的情况 1 4范围for循环 2 指针空值nullptr 3 类与对象 3 1类 3 2类的定义 3 3类的访问限定符和封装 3 4封装 3 4
  • 「信号与系统」语音信号的语谱图、尺度变化、带限处理、基音提取

    信号与系统 语音信号的语谱图 尺度变化 带限处理 基音提取 本文将简单介绍几种语音信号的处理方法 1 语谱图 语谱图是一种描述语音信号频率特征的方法 横轴表示时间 纵轴表示频率 颜色深浅表示能量 基本原理是将语音信号分帧 每帧10 30ms
  • 实现isNum()函数,参数是一个字符串,如果字符串属于整数、浮点数或复数,则返回True否则返回False

    实现isNum 函数 参数是一个字符串 如果字符串属于整数 浮点数或复数 则返回True否则返回False def isNum str1 try a eval str1 if type a type 1 or type a type 1 0
  • MQTT协议-心跳请求和心跳响应

    MQTT协议 心跳请求和心跳响应 心跳请求是客户端发送给服务器的 心跳响应是服务器回应给客户端的 作用是保持客户端与服务器之间的连接 CONNECT报文的可变报头是由协议名 Procotol Name 协议级别 Procotol Level
  • 9月13号魔兽服务器维护,魔兽世界怀旧服9月13日7点再次开放免费转服 11个转服新服务器一览...

    魔兽世界怀旧服官方在9月12日的中午发布公告 表示将会在9月13日 也就是中秋节的上午7点到9月16日的早上7点再次开放免费转服 其中新开放了11组新服务器 具体的内容如下 我们预计于 9 月 13 日07 00 至 9 月 16 日07
  • Qt 5界面修改无效的问题解决QtDesigner修改之后无效的解决办法

    第一篇 关于Qt Ui修改不起作的结局办法 我在网上找到的解决办法 ui源文件到界面显示的原理可以网上搜索 这里不再描述 简单讲就是先要从 ui生成ui h然后再编译 所以界面未更新实际上是因为ui h这个文件没有更新导致的 根治的方法 项
  • Web Spider 常见混淆EVAL、AA、JJ、JSFUCK

    文章目录 一 资源推荐 二 EVAL constructor 三 AA混淆 四 JJ混淆 五 JSFUCK 六 针对混淆的方法 简单hook 总结 混淆的原理 就是把原本清晰的代码故意搞得花里胡哨 让局外人看不懂 混淆的目的 让逆向者很难理
  • Python中使用input()无输入

    Python中使用input 无输入 sublime Text编译器因页面美观 插件众多 功能强大深受编程爱好者的青睐 然而在编程中由于插件忘记安装导致程序运行失败 使人颇为烦恼 问题描述 在sublime Text编译器中使用input
  • Git 如何压缩 commit

    今天同事突然问我 由于在给老大的开源项目提 pr 的时候 自己比较长时间没有 rebase 的老大的项目 master 分支了 而自己提交的 commit 又很多 有些 commit 又是实验性质的 乱七八糟的 其实就是没有用熟 git 还
  • Java工作流框架:探索流程引擎的实现和应用

    目前 市面上有很多基于SpringBoot Vue前后端分离的Java快速开发框架和工作流开发框架可供选择 以下是一些比较流行的框架 1 Spring Cloud Spring Cloud是一套基于Spring Boot的开发工具 用于快速
  • sqli-labs Less18 原理到实现详解

    目录 前期知识储备 一 初始思路 1 思路 2 user agent后加入 发现出现sql错误日志 3 我尝试了之前用的各种闭合方法 都已失败告终 4 新的问题 5 现在想的是如何利用mysql插入语句insert实现注入 前期知识储备 从
  • 【Qt styleSheet样式表】

    一 Qt styleSheet样式表语法 1 属性列表 下表列出了 Qt 样式表支持的所有属性 可以为属性赋予哪些值取决于属性类型 除非另有说明 否则以下属性适用于所有小部件 标有星号 的属性为Qt特定的 在 CSS2 或 CSS3 中没有
  • Python+PySide2:使用多线程处理界面卡死的情况

    本篇主要是梳理一下 在使用 Pyside2 模块的时候 利用多线程处理页面假死 exe未响应 的问题 一 这边举个例子吧 如下图所示 测试代码如下 class Stats def init self 从文件中加载UI定义 super ini
  • 32位 与64位编译

    为了适应现在越来越流行的64位系统 经常需要将代码分别编译为32位版和64位版 其次 除了需要生成debug版用于开发测试外 还需要生成release版用于发布 本文介绍了如何利用makefile条件编译来生成这些版本 而且不仅兼容Linu
  • 1、python调用java的jar包

    在python中调用jar包 最近的项目功能需要调用客户的java接口 在调用接口的时候需要使用配套的jar包生成一些参数 但是公司的项目是用django搭建的 经过无数血与泪的尝试 最终终于找到了合适的方法去调用 jpype包是一个Pyt
  • 解决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 bc 9aforbid consumer 线