一个 Dubbo 服务启动要两个小时

前几天在测试环境碰到一个非常奇怪的与 dubbo 相关的问题,事后我在网上搜索了一圈并没有发现类似的帖子或文章,于是便有了这篇。

希望对还未碰到或正在碰到的朋友有所帮助。

现象

现象是这样的,有一天测试在测试环境重新部署一个 dubbo 应用的时候发现应用“启动不起来”。

但过几个小时候之后又能自己慢慢恢复,并能够对外提供 dubbo 服务。

What?一个 Dubbo 服务启动要两个小时
但其实经过我后续排查发现刚开始其实并不是启动不起来,而是启动速度非常缓慢,所以当应用长时间启动后才会对外提供服务。而这个速度慢到居然要花费 2 个小时。

导致的一个结果是测试完全不敢在测试环境发版验证了,每验证一个功能修复一个 bug 就得等上两个小时,这谁受得了。

而且经过多次观察,确实每次都是花费两小时左右应用才能启动起来。

尝试解决

最后测试顶不住了,只能让我这个“事故报告撰写专家”来看看。

当我得知这个问题的现象时其实完全没当一回事:

都不用想,这不就是主线程阻塞了嘛,先看看是否在初始化的时候数据库、Zookeeper 之类的连不上导致阻塞了-------来之多次事故处理的经验告诉我。

于是我把这事打回给测试让他先找运维排查下,不到万不得已不要影响我 Touch fish。

第二天一早看到测试同学的微信头像跳动时我都已经准备接受又一句 “膜拜大佬” 的回复时,却收到 “网络一切正常,没人动过,再不解决就要罢工了”。

好吧,忽悠不过去了。

首先这类问题的排查方向应该不会错,就是主线程阻塞了,至于是啥导致的阻塞就不能像之前那样瞎猜了。

我将应用重启后用 jstack pid 将线程快照打印到终端,直接拉到最后看看 main 线程到底在干啥。

前几次的快照都是很正常:

加载 Spring ---->连接 Zookeeper ---> 连接 Redis,都是依次执行下来没有阻塞。

隔了一段后应用确实还没起来,我再次 jstack 后得到如下信息:

What?一个 Dubbo 服务启动要两个小时

翻源码

我一直等了十几分钟再多次 jstack 得到的快照得到的信息都是一样的。

What?一个 Dubbo 服务启动要两个小时

如图所示可见主线程是卡在了 dubbo 的某个方法 ServiceConfig.java 的 303 行中。

于是我找到此处的源码:

What?一个 Dubbo 服务启动要两个小时

简单来说这里的逻辑就是要获取本机的 IP 将其注册到 Zookeeper 中用于其他服务调用。

What?一个 Dubbo 服务启动要两个小时

再往下跟就如堆栈中一样是卡在了 Inet4AddressImpl.getLocalHostName 处。

但这是一个 native 方法,我们应用也根本干涉不了,最终的现象就是调用这个本地方法非常耗时。

于是这问题貌似也阻塞在这儿了,没有太多办法。

最终解决

既然这是一个 native 方法,那说明和应用本身没有啥关系(确实也是这样,这个问题是突然间出现的。)

那是否是服务器本身的问题呢,想到在 native 方法里是获取本机的 hostname,那是否和这个 hostname 有关系呢。

What?一个 Dubbo 服务启动要两个小时

这是在我自己的阿里云服务器上测试,真正的测试环境不是这个名字。

拿到服务器 hostname 后再尝试 ping 这个 hostname,奇怪的现象发生了:

命令刚开始会卡住一段时间(大概几十秒),然后才会输出 hostname 对应的 ip 以及对应的延迟。

而当我直接 ping 这个 ip 时却能快速响应后面的输出。

最后我尝试在 /etc/hosts 配置文件中加入了对应的 host 配置:

xx.xx.xx.xx(ip) hostname

再次 ping hostname 的效果就和直接 ping ip 一样了。

于是我再次重启应用,一切都正常了。

总结

最后根据我调整的内容尝试分析下本次问题的原因:

  • 当 Dubbo 在启动获取本地 ip 时,是通过服务器 hostname 从 dns 服务器返回当前的 ip 地址。
  • 由于 dns 服务器或者是本地服务器与 dns 服务器之间存在网络问题,导致这个过程的时间被拉长(猜测)。
  • 我在本地的 host 文件中配置后,就相当于本地有一个缓存,优先取本地配置的 ip ,避免了和 dns 服务器交互的过程,所以速度提升了。

虽然问题得到解决了,但还是有几个疑问:

第一个是为什么和 DNS 服务器的交互会这么慢,即便是慢也没有像应用那样需要 2 个小时才能返回,这里我也没搞得太清楚,有相关经验的朋友可以留言讨论。

第二就是 Dubbo 在这个依赖外部获取资源时健壮性是否可以做的更好,虽说我这问题估计也几人碰到。

对于这种长时间没有启动成功的问题是否可以加上提示,比如直接抛出异常退出程序,将问题可能的原因告诉开发者,方便排查问题。

转载于:https://www.cnblogs.com/CQqf2019/p/11155487.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

表单提交enctype参数详解之:application/x-www-form-urlencode和multipart/form-data

application/x-www-form-urlencode 我们在提交表单的时候,form表单参数中会有一个enctype的参数。enctype指定了HTTP请求的Content-Type。 默认情况下,HTML的form表单的enctypeapplication/x-www-form-urlencoded。 application/x-www-form-urlencoded是…

内网端口映射工具

由于开发微信需要一个公网域名,需要将本地端口映射到外网域名,最热的工具是ngrok,但被微信屏蔽了,这里使用的是natapp,环境是mac,windows下可使用nat123、花生壳等工具实现同样功能。 简单记录一下过程。 …

iOS----------iPhone导出手机所有短信

第一步:手机连接到itunes 选择本电脑备份 备份的时候不要加密 然后立即备份 第二步:前往文件夹,找到itunes的备份路径~/Library/Application Support/MobileSync/Backup 在这目录下搜索 3d0d开头的文件,这就是 iPhone 短信的…

跨站点脚本(XSS)

1. 简介 跨站点脚本(XSS)是当前web应用中最危险和最普遍的漏洞之一。安全研究人员在大部分最受欢迎的网站,包括Google, Facebook, Amazon, PayPal等网站都发现这个漏洞。如果你密切关注bug赏金计划,会发现报道最多的问题属于XSS。为了避免跨站脚本,浏览器也有自己的过滤器,但安…

spring webscoket服务端使用记录

记录spring4中websocket的使用方式 pom jar包配置 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>${spring.version}</version> </dependency> <depen…

MVC是什么?(转载)

MVC (Modal View Controler)本来是存在于Desktop程序中的&#xff0c;M是指数据模型&#xff0c;V是指用户界面&#xff0c;C则是控制器。使用MVC的目的是将M和V的实现代码分离&#xff0c;从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来…

CSRF攻击原理及防御

CSRF攻击原理及防御 一、CSRF攻击原理 CSRF是什么呢&#xff1f;CSRF全名是Cross-site request forgery&#xff0c;是一种对网站的恶意利用&#xff0c;CSRF比XSS更具危险性。想要深入理解CSRF的攻击特性我们有必要了解一下网站session的工作原理。   session我想大家都不…

H3C FTP配置示例

转载于:https://www.cnblogs.com/fanweisheng/p/11156596.html

用dotnet自带的mail类发邮件出现的问题

在使用dotnet自带的mail类发送邮件的时候&#xff0c;因为默认的smtp端口是25&#xff0c;如果更改了smtp的端口号&#xff0c;则需加上MailMessage msg &#xff1d; new MailMessage();msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport&…

Angular CLI ng 指令指南

Angular CLI 使用教程指南参考 Angular CLI 现在虽然可以正常使用但仍然处于测试阶段. Angular CLI 依赖 Node 4 和 NPM 3 或更高版本. 安装

spring源码阅读(1/4) - Bean生成

上午去缴了上次没带驾驶证的扣分罚款&#xff0c;最近在图书馆没事就看曾国藩家书&#xff0c;曾国藩说人要明强。光强没有用&#xff0c;你要明强。也就是说要强的有道理。曾国藩又说&#xff0c;做学问不能做死学问&#xff0c;做学问其实很重要的事就是能懂得孝悌&#xff0…

NodeJS解决跨域问题:Access-Control-Allow-Origin

今天在玩vue-resource时&#xff0c;后台使用nodejs来提供数据&#xff0c;由于需要跨域&#xff0c;在网上也找到了解决方法。 vue-resource代码(其实就是ajax技术)&#xff1a; this.$http.get({url:"http://localhost:3000/getdata"}) .then(function (data) {co…

windows10系统下MongoDB的安装及环境配置

windows10系统下MongoDB的安装及环境配置&#xff1a; MongoDB的安装 下载地址&#xff1a; https://www.mongodb.com/download-center (这是windows10环境下的教程&#xff01;请注意&#xff01;) 下载后&#xff0c;我们点击mongodb-win32-x86_64-2008plus-ssl-3.4.3-signed…

Net EF to MySQL生成edmx文件时报错:StrongTypingException:表“TableDetails中列“IsPrimaryKey的值为DBNull...

使用Net写项目&#xff0c;数据库用的MySQL&#xff0c;EF生成edmx文件时&#xff0c;报错&#xff0c;StrongTypingException:表“TableDetails"中列“IsPrimaryKey"的值为DBNull。 解决方法&#xff1a; 1.重启MySQL服务 2.MySQL中运行下以下命令&#xff1a; use …

MongoDB之在mac上设置环境变量

要下班&#xff0c;简介做个笔记。设置环境变量在基于unix/linux的操作系统下进行程序开发&#xff0c;使用环境变量将会方便。通过设置环境变量将可以在任意目录通过输入程序名来执行设定目录下的程序。不需要通过cd将工作目录改变到程序目录再执行程序。而且免去了输入"…

popup a new windows

popup a new windows window.open(url, newwindow, height500, width850, top0, left0, toolbarno, menubarno, scrollbarsno, resizableno,locationno, statusno); 转载于:https://www.cnblogs.com/sandy_liao/archive/2010/06/24/1764533.html

CSS clip:rect矩形剪裁功能

CSS中有一个属性叫做clip&#xff0c;为修剪&#xff0c;剪裁之意。配合其属性关键字rect可以实现元素的矩形裁剪效果。此属性安安稳稳地存在于CSS2.1中&#xff0c;且使用上基本上没有类似于max-height/display:table-cell等浏览器的兼容性问题。 根据Dreamweaver的自动提示&a…

CSS隐藏元素的十四种方法

通过设置width:0或者height:0隐藏一个元素&#xff0c;文字隐藏可以设置color为背景色或transparent&#xff0c;但内容还在&#xff0c;所以用font-size:0&#xff1b; 将元素的opacity设置为0&#xff0c;元素本身还在&#xff0c;只是看不见&#xff1b; 通过绝对定位将元…

jquery.lazyload.js详解

简介lazyload.js用于长页面图片的延迟加载&#xff0c;视口外的图片会在窗口滚动到它的位置时再进行加载&#xff0c;这是与预加载相反的。优点&#xff1a;它可以提高页面加载速度&#xff1b;在某些情况清晰它也可以帮助减少服务器负载。安装bower安装&#xff1a;$ bower in…

Spring Boot Cache使用与整合

参考&#xff1a; 史上最全的Spring Boot Cache使用与整合Spring Cache扩展&#xff1a;注解失效时间主动刷新缓存 项目地址使用本地Caffeine缓存 引入依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starte…