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

目录
  • 前言
  • 1.不支持带密码,设置indexdb的reids
    • 解决方法:
  • 二,集群容错模式异常
  • 三,jedis连接池连接的坑
  • 四,服务超过8个应用启动卡死
  • 文末结语

前言

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注册中心系列异常的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java中dubbo+zookeeper微服务架构简介

    目录 1.Apache Dubbo概述 1.1.Dubbo简介 1.2.Dubbo的服务架构 2.服务注册中心 Zookeeper 2.1.ZooKeeper介绍 2.2.ZooKeeper安装 2.3.启动 ZooKeeper 3.ZooKeeper快速入门 3.1.服务提供方 3.2.服务消费方 3.3.问题思考 4. Dubbo管理控制台 4.1.安装 5. Dubbo相关配置 5.1.包扫描 5.2.Dubbo 协议 5.3.负载均衡 5.4. Dubbo无法发布被事务代理的服务 1.A

  • SpringBoot集成SSM、Dubbo、Redis、JSP的案例小结及思路讲解

    1.思路讲解 这个案例其实就是SpringBoot集成SSM.Dubbo.Redis.JSP,看起来集成了一大堆,感觉挺麻烦的,但实际上并不是很麻烦,下面我来说一下我的思路: 接口工程:存放实体bean和业务接口 服务提供者:它是一个SpringBoot框架web项目,集成MyBatis.Redis 1)pom文件中添加依赖:MyBatis.MySQL驱动.Dubbo.zookeeper.redis.接口工程. 2)配置springboot核心配置文件(连接数据库.连接redis.dubbo.内

  • 微服务架构之服务注册与发现功能详解

    目录 微服务的注册与发现 1.服务注册 2.服务发现 3.注册中心 4.现下的主流注册中心 4.1 Eureka 4.1.1 介绍 4.1.2 整体架构 4.1.3 接入Spring Cloud 4.2 ZooKeeper 4.2.1 介绍 4.2.2 整体架构 4.2.3 接入Dubbo生态 4.3 Consul 4.3.1 介绍 4.3.2 整体架构 4.3.3 生态对接 4.4 总结对比 详解微服务架构及其演进史 微服务全景架构全面瓦解 微服务架构拆分策略详解 微服务的注册与发现 我们前面

  • 升级dubbo2.7.4.1版本平滑迁移到注册中心nacos

    目录 前言 为什么升级到2.7.4.1? 为什么迁移注册中心到nacos? 两种升级方案 方案一:魔改官方的starter组件 注解兼容 配置兼容 方案二:直接使用官方的starter组件-最终采用的方案 第一步:引入maven依赖 第二步:改造相关的注解 第三步:修改dubbo的配置 平滑迁移到nacos注册中心 结语 前言 dubbo是一款非常优秀的服务治理型RPC框架,dubbo的优秀在于,庞大的架构体系.精湛的模块设计.灵活的SPI设计.丰富的组件实现,博主做微服务技术选型考察dubbo

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

    目录 前言 1.不支持带密码,设置indexdb的reids 解决方法: 二,集群容错模式异常 三,jedis连接池连接的坑 四,服务超过8个应用启动卡死 文末结语 前言 dubbo支持zookeeper,reids,multicast等注册中心注册服务信息,使用redis作为注册中心时,因为reids作为注册中心使用并不广泛,早期reids由于定位内网访问,使用密码验证也不怎么重视,导致框架本身设计缺陷,会有很多坑,如1.没有考虑到带密码验证的redis,2.集群容错模式判断错误 3.不可以设

  • SpringBoot实现服务接入nacos注册中心流程详解

    目录 概述 接入nacos注册中心 springboot服务pom文件 application.properties配置 源码分析 小结 源码流程图 概述 某些场景下只需要把springboot微服务化而不想引入springcloud如何实现的呢? 下面我们介绍nacos注册中心方案. 接入nacos注册中心 springboot服务pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="h

  • dubbo服务注册到nacos的过程剖析

    目录 前言 简述过程 源码剖析具体实现 服务注册 服务订阅 结语 前言 前面聊到到了我们的dubbo服务从redis迁移到nacos注册中心,迁移后发现,会时不时的抛一个异常 ERROR com.alibaba.nacos.client.naming - [CLIENT-BEAT] failed to send beat:, 所以有了这个剖析过程,当然最后查明异常是我们的SLB网络映射问题,和nacos没有关系. dubbo版本:2.7.4.1 nacos client版本:1.0.0 naco

  • Spring Cloud 系列之注册中心 Eureka详解

    1.1 简介 1.1.1 概述   Netflix Eureka 是由 Netflix 开源的一款基于 REST 的服务发现组件,包括 Eureka Server 及 Eureka Client.2012 年 9 月在 GitHub 上发布 1.1.2 版本,目前 Netflix 以宣布闭源,所以市面上还是以 1.x 版本为主.Eureka 提供基于 REST 的服务,在集群中主要用于服务管理.Eureka 提供了基于 Java 语言的客户端组件,客户端组件实现了负载均衡的功能,为业务组件的集群

  • SpringCloud Eureka服务注册中心应用入门详解

    目录 1.多节点无缝切换问题 2.服务注册与发现 Eureka 3.Springboot集成Eureka 3.1 父包pom依赖 3.2 eureka服务端 3.3 客户端 pom依赖 yml配置 3.4 控制台 1.多节点无缝切换问题 分布式节点中的服务宕机或者重启不影响客户端使用 分布式节点中的服务宕机重启不影响业务服务内部通信 如果在某个分布式系统中想要解决上述问题,那么这篇文章就是精华之处. 回顾一下以前的常用手段: 单节点运行,其他节点备用,无法无缝连接,内网通信无法保证 多节点运行,

  • springcloud实现注册中心Eureka

    Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组件之一. 背景介绍 服务中心 服务中心又称注册中心,管理各种服务功能包括服务的注册.发现.熔断.负载.降级等,比如dubbo admin后台的各种功能. 有了服务中心调用关系会有什么变化,画几个简图来帮忙理解 项目A调用项目B 正常调用项目A请求项目B 有了服务中心之后,任何一个服务都不能直接去掉用

  • Nacos注册中心的部署与用法示例详解

    目录 一.什么是注册中心: 1.什么是注册中心: 2.注册中心的核心功能: 3.注册中心解决的问题: 4.服务的发现与注册的实现模式: 5.服务注册表: 二.主流服务注册中心的对比: 三.Nacos 注册中心的部署与使用: 1.Nacos 注册中心的搭建: 1.1.Windows 环境: 1.2.Linux 环境: 2.SpringBoot 整合 Nacos 进行服务注册发现: 2.1.创建服务提供者 cloud-producer-server: 2.2.创建服务消费者 cloud-consum

  • 详解Nacos中注册中心和配置中心的实现

    目录 1.Nacos 简介 Nacos 特性介绍 2.注册中心实现 2.1 创建服务提供者 2.2 创建服务消费者 3.配置中心实现 3.1 新建项目并添加依赖 3.2 配置 Nacos Config 信息 3.3 编写代码读取配置文件 3.4 Nacos 控制台添加配置信息 3.5 动态刷新功能 4.项目源码 小结 Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决方案,目前已被 Spring Cloud 官方收录.而 Nacos 作为 Spring Cloud A

  • springboot整合Dubbo与Feign的实现 (无注册中心)

    目录 一,SpringBoot 整合 Dubbo 1.1 服务提供者 1.1.1 核心依赖 1.1.2 核心配置 1.1.3 服务提供者代码结构 1.1.4 服务提供者暴露的API(DubboDemoServiceImpl) 1.1.5 服务提供者端的对象(User) 1.2 服务消费者 1.2.1 核心依赖 1.2.2 核心配置 1.2.3 服务消费者代码结构 1.2.4 服务消费者调用服务提供者 1.3 调用示例 1.3.1 消费者入口(测试是否导通) 1.3.2 消费者入口(测试携带参数与

随机推荐