当前位置:首页 > 科技  > 软件

深度剖析:Dubbo使用Nacos注册中心的坑

来源: 责编: 时间:2024-04-11 09:04:05 289观看
导读问题描述前几年我在做微服务部件升级时,将Dubbo的注册中心从Zookeeper切换到Nacos。切换的原因是有2点:Zookeeper保障了CP,面对大量服务上下线时,吞吐量和响应有瓶颈。Nacos保障了AP,目前微服务的场景下,业界建议优先保障AP

6cf28资讯网——每日最新资讯28at.com

问题描述

前几年我在做微服务部件升级时,将Dubbo的注册中心从Zookeeper切换到Nacos。切换的原因是有2点:6cf28资讯网——每日最新资讯28at.com

  • Zookeeper保障了CP,面对大量服务上下线时,吞吐量和响应有瓶颈。Nacos保障了AP,目前微服务的场景下,业界建议优先保障AP,这样有较好的吞吐量和较快的响应。
  • 本着能少用部件就少用,尽量减少故障点的原则。Nacos既可以做注册中心也可以做配置中心,所以二合一,只采用一个部件。

切换完之后,奇怪的事情发生了,出现2个现象:6cf28资讯网——每日最新资讯28at.com

  • 有些微服务启动很慢很慢,甚至长达15分钟的时间都无法成功启动,一直在打印大量的nacos请求日志。但是有些微服务启动又较快。
  • 通过VisualVM查看JVM的线程情况,发现有的微服务居然高达4000左右的线程数。但是没切换之前只有几百的线程数。启动了大量的线程,导致CPU飙升不少,同时服务启动也慢。

通过现象开始排查

出现这种问题时,刚开始有点抓瞎,但是我们只能从常规的手段一点点排查,急不来。通过表面的现象,我们来逐步分析。6cf28资讯网——每日最新资讯28at.com

现象一:微服务启动很慢很慢,一直在打印大量的nacos请求日志。日志如下:6cf28资讯网——每日最新资讯28at.com

6cf28资讯网——每日最新资讯28at.com

现象二:JVM的线程数高达4000左右。线程情况如下:6cf28资讯网——每日最新资讯28at.com

6cf28资讯网——每日最新资讯28at.com

6cf28资讯网——每日最新资讯28at.com

基于以上现象,我们只能初步判断是nacos的问题(当然结论不是nacos的问题)。6cf28资讯网——每日最新资讯28at.com

我们先来猜测:可能由于某种原因,产生了大量的nacos线程,每个线程又在不停的发送http请求。6cf28资讯网——每日最新资讯28at.com

那接下来继续分析Nacos。6cf28资讯网——每日最新资讯28at.com

分析Nacos

1.回顾Nacos原理

我们知道Nacos客户端注册和订阅服务流程大概如下:6cf28资讯网——每日最新资讯28at.com

6cf28资讯网——每日最新资讯28at.com

所以,一般nacos-client有4个重要线程:6cf28资讯网——每日最新资讯28at.com

  • 定时从nacos-server拉取服务的线程
  • 维持心跳的线程
  • 监听服务变更的线程
  • 推送本服务变更信息的线程

2.分析Nacos

根据以上线程的名称和原理流程图,我们可以在nacos源码里找到对应的位置,代码如下:6cf28资讯网——每日最新资讯28at.com

6cf28资讯网——每日最新资讯28at.com

翻看每个线程里执行的任务,确实能找到他们都在向nacos-server发送对应的的http的api请求:6cf28资讯网——每日最新资讯28at.com

6cf28资讯网——每日最新资讯28at.com

既然找到了创建线程和发起http调用的原因,那就继续查看是哪里调用的init方法。6cf28资讯网——每日最新资讯28at.com

此时会自然想到dubbo了,因为dubbo采用nacos作为注册中心,自然要依赖nacos-client创建出nacos注册中心相关的类,然后从nacos注册中心类中获取到微服务的元数据信息。6cf28资讯网——每日最新资讯28at.com

Dubbo登场

在翻看Dubbo源码之前,先回顾下Dubbo是怎样基于 引用配置文件 或者 引用配置注解创建Proxy的,大致流程如下:6cf28资讯网——每日最新资讯28at.com

ReferenceAnnotationBeanPostProcessor#doGetInjectedBean

6cf28资讯网——每日最新资讯28at.com

ReferenceAnnotationBeanPostProcessor#buildReferenceBeanIfAbsent

6cf28资讯网——每日最新资讯28at.com

ReferenceBeanBuilder#build

6cf28资讯网——每日最新资讯28at.com

ReferenceBean#afterPropertiesSet

6cf28资讯网——每日最新资讯28at.com

ReferenceConfig#init

至此完成了referenceProxy的创建。6cf28资讯网——每日最新资讯28at.com

重点看ReferenceConfig#init方法,方法里有一行代码:ref = createProxy(map);,顺着这行代码往里走,如下:6cf28资讯网——每日最新资讯28at.com

RegistryProtocol#refer

6cf28资讯网——每日最新资讯28at.com

AbstractRegistryFactory#getRegistry

重点来了,重点来了,重点来了,核心代码和注释见下图。6cf28资讯网——每日最新资讯28at.com

6cf28资讯网——每日最新资讯28at.com

总之是:因为在上面ReferenceConfig#init方法里引入了timestamp参数,同时又因为NacosRegistryFactory又自己实现了一套createRegistryCacheKey方法,这个方法里没有截掉timestamp参数,所有就会导致从缓存里取不到注册中心信息,所有就会不停的去创建,从而又创建了更多的线程,从而发送了很多http请求。6cf28资讯网——每日最新资讯28at.com

再次查看ReferenceConfig#init方法的源码,确实是加入了timestamp参数:6cf28资讯网——每日最新资讯28at.com

6cf28资讯网——每日最新资讯28at.com

6cf28资讯网——每日最新资讯28at.com

至此问题的原因已经找到了,接下来就是如何解决了。6cf28资讯网——每日最新资讯28at.com

解决方法

解决方法也很简单,就是在Dubbo的NacosRegistryFactory类里面截掉timestamp参数。6cf28资讯网——每日最新资讯28at.com

遗憾的是,我当时发现了这个问题时,打算给Dubbo官方发issue的,发现已经有网友抢先一步发了issue,并且已经合并到2.7.9分支里了。6cf28资讯网——每日最新资讯28at.com

6cf28资讯网——每日最新资讯28at.com

以下是解决方法的代码截图:6cf28资讯网——每日最新资讯28at.com

6cf28资讯网——每日最新资讯28at.com

两个版本处理URL的结果如下:6cf28资讯网——每日最新资讯28at.com

2.7.8版本:nacos://10.20.1.13:8848,10.20.1.14:8848,10.20.1.15:8848/org.apache.dubbo.registry.RegistryService?application=ehome-cloud&application.version=1.0&dubbo=2.0.2&interface=org.apache.dubbo.registry.RegistryService&namespace=dev-jzj&owner=ehome-cloud-owner&pid=21335&qos.enable=false&release=2.7.8×tamp=17125458564892.7.9版本:nacos://10.20.1.13:8848,10.20.1.14:8848,10.20.1.15:8848/org.apache.dubbo.registry.RegistryService?namespace=dev-jzj

这个问题是在dubbo的2.7.8版本出现的,最后通过将2.7.9的修复class替换了2.7.8的NacosRegistryFactoryclass类,然后重新打了dubbo依赖包,问题得以解决。6cf28资讯网——每日最新资讯28at.com

有朋友会问:为啥不是引用2.7.9呢?因为我担心2.7.9有其他问题,所以做个class替换,然后继续用2.7.8是个较好的方式。6cf28资讯网——每日最新资讯28at.com

总结

本文主要梳理了Dubbo使用Nacos注册中心的坑,同时也讲述了,出现问题时,如何一步一步排查。透过现象结合源码,逐步找到问题的真相。6cf28资讯网——每日最新资讯28at.com

当然在排查之前,就需要对Dubbo和Nacos有一定的了解。所以各位朋友,在平时还是要多积累,多深入原理,这样遇到问题才能顺利解决。6cf28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-82749-0.html深度剖析:Dubbo使用Nacos注册中心的坑

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python实现适配器模式、装饰器模式、代理模式

下一篇: 深入理解C/C++指针的算术运算

标签:
  • 热门焦点
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 四年持续更迭坚持探索行业无人之境,HarmonyOS 4带来五大升级多项创新

    除了华为每年新发布的旗舰手机系列,上亿花粉更加期待鸿蒙系统每次的跨版本大更新。8月4日,HarmonyOS 4于HDC 2023正式发布,这也是该系统历经四年的再
  • 三星Galaxy Z Fold5官方渲染图曝光:13.4mm折叠厚度依旧感人

    据官方此前宣布,三星将于7月26日在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • iQOO Neo8 Pro真机谍照曝光:天玑9200+和V1+旗舰双芯加持

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
Top