版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mingyundezuoan/article/details/82795021
Forbid consumer x.x.x.x access service
异常描述
com.alibaba.dubbo.rpc.RpcException: Forbid consumer x.x.x.x access service com.xxx.service.RpcService from registry y.y.y.y:2181 use dubbo version 2.5.3, Please check registry access list (whitelist/blacklist)
异常场景
- 项目架构
- 按照业务划分系统:用户中心、营销中心、交易中心、订单中心、供应链、订单中心
- 每个系统对应一个所属数据库
- 系统间通过 dubbo 接口相互访问
- 用户中心职责:
- 系统:供各个系统调用,每个系统业务处理逻辑均需要调用用户信息,判断用户状态
- 功能:用户注册、登录、签到等功能
- 昨晚刚发布新功能,今早大量用户访问,九点左右客服群反馈系统奔溃奔溃,无法访问
- 由于项目价格体系的限制的,各个中心间不完全是直接调用,部分需要通过中间项目进行中转,于是查看中间项目日志,提示用户中心dubbo 接口调用失败
异常分析
- 从日志分析,调用频率过高,且所有查询均无缓存处理,导致所有查询直接查询数据库,数据库连接数不够,系统出现异常
- 项目中存在大量的定时任务,定时任务批量处理数据时没有做相应的分页处理,直接全表扫描
- 由于 dubbo 接口的注册中心的服务提供方系统奔溃,导致调用方找不到接口,所以抛出上述异常
异常修复
- 增加缓存处理,所有对外RPC接口提供缓存处理机制
- 用户中心接口需要做缓存处理,且缓存不应该由调用方处理,缓存管理放入缓存与缓存取出应该放在同一个方法中便于管理;缓存失效时期,缓存数据更新问题等等
触类旁通
- 如何快速定位问题
- 检查 dubbo 该项目的接口是否有提供者,是否系统奔溃
- 检查 dubbo 的consume 文件,检查服务注册项目的 provider 文件
- 检查 服务调用项目与服务提供项目的ZK地址是否相同
- 检查 dubbo 注册中心地址是否正确,是否是该环境配置的IP地址(团队开发过程中可能被其他人修改)
<dubbo:registry protocol="zookeeper" address="${zookeeper.address}"/>
- 检查 comsume.xml 文件中接口Id 与 provider.xml 中接口 id 是否相同
- 检查不同的项目中的provice.xml 或 comsumer.xml 是否有重名Id
- 检查dubbo 注册中心配置是否正确
- 参考资料
异常原因
- 由于用户中心系统奔溃导致系统对外RPC接口 provider.xml 中的接口在注册中心发生变更,触发 zk 监听器,此时检测对外提供接口的数量为0
- 参考资料