dubbo服务使用redis注册中心的系列异常解决

 更新时间:2022年03月01日 15:45:44   作者:kl  
这篇文章主要为大家介绍了dubbo服务在使用redis注册中心遇到的一系列异常的解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

前言

dubbo支持zookeeper,reids,multicast等注册中心注册服务信息,使用redis作为注册中心时,因为reids作为注册中心使用并不广泛,早期reids由于定位内网访问,使用密码验证也不怎么重视,导致框架本身设计缺陷,会有很多坑,如1.没有考虑到带密码验证的redis,2.集群容错模式判断错误 3.不可以设置redisdbindex等。其中部分问题,博主已经提交给dubbo官方仓库了,但是还没有完全解决掉,其实这些问题无需等官方修复,对源码稍加改造就ok了。

1.不支持带密码,设置indexdb的reids

2.5.6以及以前的会有这个问题,最新的版本已经解决了这个问题了,但是还是存在一个坑,就是必须得设置用户名(大家都知道redis验证不需要用户名),如URL的构造方法有如下判断

这会导致,如果只设置了密码,没有设置用户名,就会抛Invalid url, password without username的异常。

解决方法:

1.打开RedisRegistry.java,设置jedispool时判断下,如果设置密码,使用带密码,indexdb入参的构造方法,具体如下:

            if(StringUtils.isEmpty(url.getPassword())){
                this.jedisPools.put(address, new JedisPool(config, host, port,
                        url.getParameter(Constants.TIMEOUT_KEY, Constants.DEFAULT_TIMEOUT),null,url.getParameter("db.index",0)));
            }else {
                this.jedisPools.put(address, new JedisPool(config, host, port,
                        url.getParameter(Constants.TIMEOUT_KEY, Constants.DEFAULT_TIMEOUT),url.getPassword(),url.getParameter("db.index",0)));
            }

2.配置注册中心的时候得把username加上,如:

二,集群容错模式异常

这个问题,不开启服务监控不会有问题,在开启dubbo服务监控后,就会抛异常:Unsupported redis cluster: Failsafe. The redis cluster only supported failover or replicate,问题是由如下图红框内的if判断造成的,因为监控模块服务默认的集群容错模式为Failsafe,而且写死了,不可通过配置更改,如图:

如下图箭头所指为添加了排除监控中心的if判断逻辑:

三,jedis连接池连接的坑

在修改了dubbo后,由于没有更新到修改后本地打包的dubbo依赖,一度报如下异常:

at java.lang.Thread.run(Thread.java:748)
Caused by: redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool
	at redis.clients.util.Pool.getResource(Pool.java:51)
	at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
	at com.alibaba.dubbo.registry.redis.RedisRegistry.doSubscribe(RedisRegistry.java:342)
	... 43 more
Caused by: java.util.NoSuchElementException: Unable to validate object
	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:506)
	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
	at redis.clients.util.Pool.getResource(Pool.java:49)
	... 45 more

Unable to validate object的问题网上有各种说法,博主也找了好久的问题,最终通过猜想+读jedis源码+本地debug调试才解决的问题。其实网上的说法都正确,原因是jedis内一段代码导致的,dubbo默认设置了连接池的test.on.borrow为true,所有在拿连接前都会验证一遍,验证的逻辑如下:

如上图,前面两个判断100%不会有问题,网上大多是因为redis服务本身出问题了,ping的时候没有返回PONG。博主这边是以为jedis.isConnected()报错了,但是jedis是个坑,虽然返回了false,但是具体的异常信息并没有抛出来,其实这个地方,具体的异常:redis.clients.jedis.exceptions.JedisDataException: NOAUTH Authentication required.。很明显是reids密码验证失败了。因为一开始修改的dubbo密码设置没有依赖到

四,服务超过8个应用启动卡死

这个最终的问题还是jedis导致的,dubbo默认初始化的jedis连接池,最大链接数是8个,然后默认的从连接池里拿连接的超时时间为-1,又因为使用redis作为注册中心时,通过订阅暴露的service 的变更来做服务治理的,而jedis里的服务订阅是阻塞占用连接的,也就是说有多少个服务,就会被占用多少个链接。这就导致了,当暴露的服务数量大于8个时,从连接池中获取不到资源,又永不超时,造成应用启动卡死的现象

解决方案:手动设置jedis的最大连接数,如:

spring.dubbo.registry.parameters.max.total = 200

文末结语

使用开源的产品,还是要多读读开源产品代码,至少架构设计,模块划分要了解,这样遇到啥问题,才不会手足无措,才能举一反三。bug或异常一点都不可怕,遇到异常,解决异常就问两个问题。1.在哪里抛出的异常(找到抛异常的代码),2.为什么抛这个异常(找出抛异常的原因,一般有逻辑,如if判断等,没有的逻辑的异常一般都是系统级别的),然后通读下异常周边代码,基本上问题就搞定了

以上就是dubbo服务使用redis注册中心的系列异常解决的详细内容,更多关于dubbo使用redis注册中心系列异常的资料请关注脚本之家其它相关文章!

相关文章

  • 关于redis可视化工具读取数据乱码问题

    关于redis可视化工具读取数据乱码问题

    大家来聊一聊在日常操作redis时用的是什么工具,redis提供的一些命令你都了解了吗,今天通过本文给大家介绍redis可视化工具读取数据乱码问题,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • Redis5之后版本的高可用集群搭建的实现

    Redis5之后版本的高可用集群搭建的实现

    这篇文章主要介绍了Redis5之后版本的高可用集群搭建的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • muduo源码分析之TcpServer模块详细介绍

    muduo源码分析之TcpServer模块详细介绍

    这篇文章主要介绍了muduo源码分析之TcpServer模块,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 使用Redis实现点赞取消点赞的详细代码

    使用Redis实现点赞取消点赞的详细代码

    这篇文章主要介绍了Redis实现点赞取消点赞的详细代码,通过查询某实体(帖子、评论等)点赞数量,需要用到事务相关知识,结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • 浅析PHP分布式中Redis实现Session的方法

    浅析PHP分布式中Redis实现Session的方法

    这篇文章主要介绍了PHP分布式中Redis实现Session的方法,文中详细介绍了两种方法的使用方法,并给出了测试的示例代码,有需要的朋友可以参考借鉴,下面来一起看看吧,
    2016-12-12
  • 深入解析RedisJSON之如何在Redis中直接处理JSON数据

    深入解析RedisJSON之如何在Redis中直接处理JSON数据

    JSON已经成为现代应用程序之间数据传输的通用格式,然而,传统的关系型数据库在处理JSON数据时可能会遇到性能瓶颈,本文将详细介绍RedisJSON的工作原理、关键操作、性能优势以及使用场景,感兴趣的朋友一起看看吧
    2024-05-05
  • Redis服务器的启动过程分析

    Redis服务器的启动过程分析

    这篇文章主要介绍了Redis服务器的启动过程分析,本文讲解了初始化Redis服务器全局配置、加载配置文件、初始化服务器、加载数据、开始网络监听等内容,需要的朋友可以参考下
    2015-04-04
  • 使用Redis实现延时任务的解决方案

    使用Redis实现延时任务的解决方案

    这篇文章主要介绍了使用Redis实现延时任务的解决方案,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Redis的常见四种部署方案

    Redis的常见四种部署方案

    这篇文章介绍Reids最为常见的四种部署模式,其实Reids和数据库的集群模式差不多,可以分为 Redis单机模式部署、Redis主从模式部署、Redis哨兵模式部署、Cluster集群模式部署,其他的部署方式基本都是围绕以下几种方式在进行调整到适应的生产环境,感兴趣的朋友一起看看吧
    2023-11-11
  • redis配置文件中常用配置详解

    redis配置文件中常用配置详解

    这篇文章主要介绍了redis配置文件中常用配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论