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

时间: 2022-03-01

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.内

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

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

目录 前言 为什么升级到2.7.4.1? 为什么迁移注册中心到nacos? 两种升级方案 方案一:魔改官方的starter组件 注解兼容 配置兼容 方案二:直接使用官方的starter组件-最终采用的方案 第一步:引入maven依赖 第二步:改造相关的注解 第三步:修改dubbo的配置 平滑迁移到nacos注册中心 结语 前言 dubbo是一款非常优秀的服务治理型RPC框架,dubbo的优秀在于,庞大的架构体系.精湛的模块设计.灵活的SPI设计.丰富的组件实现,博主做微服务技术选型考察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 总结对比 详解微服务架构及其演进史 微服务全景架构全面瓦解 微服务架构拆分策略详解 微服务的注册与发现 我们前面

redis+php实现微博(一)注册与登录功能详解

本文实例讲述了redis+php实现微博注册与登录功能.分享给大家供大家参考,具体如下: (一).微博功能概况 微博用户账号注册 微博用户登录 微博发布 添加微博好友(粉丝) 微博推送 微博冷数据写入mysql数据库 (二).redis数据结构设计 这节分享微博用户注册与登录: 我们完全采用redis作为数据库来实现注册于登录 先来看一下redis数据结构的设计: 注册用户表:user set global:userid set user:userid:1:username zhangshan

Android判断后台服务是否开启的两种方法实例详解

Android判断后台服务是否开启的两种方法实例详解 最近项目用到后台上传,就开启了一个服务service. 但是刚开始用这种方法,有些机型不支持:酷派不支持.然后又换了第二种判断方法. // public boolean isServiceWork(Context mContext, String serviceName) { // boolean isWork = false; // ActivityManager myAM = (ActivityManager) mContext // .

vue动态注册组件实例代码详解

写本篇文章之前其实也关注过vue中的一个关于加载动态组件is的API,最开始研究它只是用来实现一个tab切换的功能,使用起来也蛮不错的. is 预期:string | Object (组件的选项对象) 用于动态组件且基于 DOM 内模板的限制来工作. 示例: <!-- 当 `currentView` 改变时,组件也跟着改变 --> <component v-bind:is="currentView"></component> 详见vue API中关于

spring cloud alibaba Nacos 注册中心搭建过程详解

这篇文章主要介绍了spring cloud alibaba Nacos 注册中心搭建过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 nacos下载地址 什么是 Nacos? nacos主要起到俩个作用一个是注册中心,另外一个是配置中心. 下面图 是nacos的功能结构图 运行环境 JDK 1.8+: Maven 3.2.x+: 下载 你可以通过源码和发行包两种方式来获取 Nacos. nacos发行包下载地址 选择版本解压 unzip

vue 注册组件的使用详解

一.介绍 组件系统是Vue.js其中一个重要的概念,它提供了一种抽象,让我们可以使用独立可复用的小组件来构建大型应用,任意类型的应用界面都可以抽象为一个组件树 那么什么是组件呢? 组件可以扩展HTML元素,封装可重用的HTML代码,我们可以将组件看作自定义的HTML元素. 二.如何注册组件 Vue.js的组件的使用有3个步骤:创建组件构造器.注册组件和使用组件. 下面用代码演示这三步 <!DOCTYPE html> <html> <body> <div id=&q

用VBScript实现对Windows注册表的修改详解

大名鼎鼎的WSH听说过吗? 它就是Windows Script Host的缩写形式,WSH是Windows平台的脚本指令,它的功能十分强大,并且它还是利用语法结构简单.易学易用且功能强大的JScript和VBScript脚本语言,来实现其卓越的功能的,除了本文介绍的修改注册表之外,它还可以访问Excel文件,也能与网络沟通,当然它最大的优势莫过于它能与操作系统沟通,而修改注册表只是它与操作系统沟通的冰山一角.正是它有如此诸多的优点与实用性,正倍受很多Windows用户的青睐,本文就为大家介绍一二

Asp.Net Core中服务的生命周期选项区别与用法详解

前言 最近在做一个小的Demo中,在一个界面上两次调用视图组件,并且在视图组件中都调用了数据库查询,结果发现,一直报错,将两个视图组件的调用分离,单独进行,却又是正常的,寻找一番,发现是配置依赖注入服务时,对于服务的生命周期没有配置得当导致,特此做一次实验来认识三者之间(甚至是四者之间的用法及区别). 本文demo地址(具体见WebApi控制器中):https://gitee.com/530521314/koInstance.git (本地下载)  一.服务的生命周期 在Asp.Net Core

AngularJS内建服务$location及其功能详解

在学习AngularJS的过程中感觉到,通过一次性从服务端的数据库获取信息,在前端进行分页,这是一种比较可取的方式.因为它节省了前后端的通信负载,把更多的显示方面的任务交给前端处理. 此内容分为两个部分,第一部分给大家简单介绍一下AngularJS的内建服务$location及其功能:第二部分通过一个比较完整的综合实例来实现分页显示数据库信息的效果. 在做angularJS的Mutilpe View & Route 的工作时,感觉到应该更加深入的了解一下angularJS的内建的服务&lo

nodejs实现套接字服务功能详解

本文实例讲述了nodejs实现套接字服务功能.分享给大家供大家参考,具体如下: 一.什么是套接字 1. 套接字允许一个进程他通过一个IP地址和端口与另一个进程通信,当你实现对运行在同一台服务器上的两个不同进程的进程间通信或访问一个完全不同的服务器上运行的服务时,套接字很有用.node提供的net模块,允许你既创建套接字服务器又创建可以连接到套接字服务器的客户端. 2. 套接字位于HTTP层下面并提供服务器之间的点对点通信.套接字使用套接字地址来工作,这是IP地址和端口的组合.在套接字连接中,有两

C#操作注册表的方法详解

本文实例讲述了C#操作注册表的方法.分享给大家供大家参考,具体如下: 下面我们就来用.NET下托管语言C#注册表操作,主要内容包括:注册表项的创建,打开与删除.键值的创建(设置值.修改),读取和删除.判断注册表项是否存在.判断键值是否存在. 准备工作: 1. 要操作注册表,我们必须要引入必要的命名空间: 复制代码 代码如下: using Microsoft.Win32; 在这个命名空间里面包含了许多注册表相关的类,足够我们使用了~~ 2. 命名空间里面提供了一个类:RegistryKey 利用它