web前端开发包,html注释标签
Apache Dubbo是Alibaba开源的高性能RPC框架,在国内有非常多的用户。Arthas是Alibaba开源的应用诊断利器,9月份开源以来,Github Star数三个月超过6000。当Dubbo遇上Arthas,会碰撞出什么样的火花呢?下面来分享Arthas排查Dubbo问题的一些经验。dubbo-arthas-demo下面的排查分享基于这个dubbo-arthas-demo,非常简单
Apache Dubbo是Alibaba开源的高性能RPC框架,在国内有非常多的用户。
Arthas是Alibaba开源的应用诊断利器,9月份开源以来,Github Star数三个月超过6000。
当Dubbo遇上Arthas,会碰撞出什么样的火花呢?下面来分享Arthas排查Dubbo问题的一些经验。
dubbo-arthas-demo
下面的排查分享基于这个dubbo-arthas-demo,非常简单的一个应用,浏览器请求从Spring MVC到Dubbo Client,再发送到Dubbo Server。
Demo里有两个spring boot应用,可以先启动server-demo,再启动client-demo。
Client端:
Server端:
Arthas快速开始
启动后,会列出所有的java进程,选择1,然后回车,就会连接上ServerDemoApplication
Dubbo线上服务抛出异常,怎么获取调用参数?
当线上服务抛出异常时,最着急的是什么参数导致了抛异常?
在demo里,
访问http://localhost:8080/user/0,UserServiceImpl就会抛出一个异常,因为user id不合法。
在Arthas里执行 watch com.example.UserService * -e -x 2 ‘{params,throwExp}’ ,然后再次访问,就可以看到watch命令把参数和异常都打印出来了。
怎样线上调试Dubbo服务代码?
在本地开发时,可能会用到热部署工具,直接改代码,不需要重启应用。但是在线上环境,有没有办法直接动态调试代码?比如增加日志。
在Arthas里,可以通过redefine命令来达到线上不重启,动态更新代码的效果。
比如我们修改下UserServiceImpl,用System.out打印出具体的User对象来:
本地编绎后,把
server-demo/target/classes/com/example/UserServiceImpl.class
传到线上服务器,然后用redefine命令来更新代码:
这样子更新成功之后,访问 http://localhost:8080/user/1,在ServerDemoApplication的控制台里就可以看到打印出了user信息。
怎样动态修改Dubbo的logger级别?
在排查问题时,需要查看到更多的信息,如果可以把logger级别修改为DEBUG,就非常有帮助。
ognl是apache开源的一个轻量级表达式引擎。下面通过Arthas里的ognl命令来动态修改logger级别。
首先获取Dubbo里TraceFilter的一个logger对象,看下它的实现类,可以发现是log4j。
再用sc命令来查看具体从哪个jar包里加载的:
可以看到log4j是通过slf4j代理的。
那么通过org.slf4j.LoggerFactory获取root logger,再修改它的level:
可以看到修改之后,root logger的level变为DEBUG。
怎样减少测试小姐姐重复发请求的麻烦?
在平时开发时,可能需要测试小姐姐发请求过来联调,但是我们在debug时,可能不小心直接跳过去了。这样子就尴尬了,需要测试小姐姐再发请求过来。
Arthas里提供了tt命令,可以减少这种麻烦,可以直接重放请求。
上面的tt -t命令捕获到了3个请求。然后通过tt --play可以重放请求:
Dubbo运行时有哪些Filter? 耗时是多少?
Dubbo运行时会加载很多的Filter,那么一个请求会经过哪些Filter处理,Filter里的耗时又是多少呢?
通过Arthas的trace命令,可以很方便地知道Filter的信息,可以看到详细的调用栈和耗时。
Dubbo动态代理是怎样实现的?
- .github.io/arthas/jad.html
- com.alibaba.dubbo.common.bytecode.Wrapper
通过Arthas的jad命令,可以看到Dubbo通过javaassist动态生成的Wrappr类的代码:
获取Spring context
除了上面介绍的一些排查技巧,下面分享一个获取Spring Context,然后“为所欲为”的例子。
在Dubbo里有一个扩展
com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory,把Spring Context保存到了里面。
因此,我们可以通过ognl命令获取到。
- SpringExtensionFactory@contexts.iterator.next 获取到SpringExtensionFactory里保存的spring context对象
- #context.getBean(“userServiceImpl”).findUser(1) 获取到userServiceImpl再执行一次调用
只要充分发挥想像力,组合Arthas里的各种命令,可以发挥出神奇的效果。
最后
分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。
面试经验技巧篇
- 经验技巧1 如何巧妙地回答面试官的问题
- 经验技巧2 如何回答技术性的问题
- 经验技巧3 如何回答非技术性问题
- 经验技巧4 如何回答快速估算类问题
- 经验技巧5 如何回答算法设计问题
- 经验技巧6 如何回答系统设计题
- 经验技巧7 如何解决求职中的时间冲突问题
- 经验技巧8 如果面试问题曾经遇见过,是否要告知面试官
- 经验技巧9 在被企业拒绝后是否可以再申请
- 经验技巧10 如何应对自己不会回答的问题
- 经验技巧11 如何应对面试官的“激将法”语言
- 经验技巧12 如何处理与面试官持不同观点这个问题
- 经验技巧13 什么是职场暗语
面试真题篇
- 真题详解1 某知名互联网下载服务提供商软件工程师笔试题
- 真题详解2 某知名社交平台软件工程师笔试题
- 真题详解3 某知名安全软件服务提供商软件工程师笔试题
- 真题详解4 某知名互联网金融企业软件工程师笔试题
- 真题详解5 某知名搜索引擎提供商软件工程师笔试题
- 真题详解6 某初创公司软件工程师笔试题
- 真题详解7 某知名游戏软件开发公司软件工程师笔试题
- 真题详解8 某知名电子商务公司软件工程师笔试题
- 真题详解9 某顶级生活消费类网站软件工程师笔试题
- 真题详解10 某知名门户网站软件工程师笔试题
- 真题详解11 某知名互联网金融企业软件工程师笔试题
- 真题详解12 国内某知名网络设备提供商软件工程师笔试题
- 真题详解13 国内某顶级手机制造商软件工程师笔试题
- 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
- 真题详解15 某著名社交类上市公司软件工程师笔试题
- 真题详解16 某知名互联网公司软件工程师笔试题
- 真题详解17 某知名网络安全公司校园招聘技术类笔试题
- 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题
解14 某顶级大数据综合服务提供商软件工程师笔试题
- 真题详解15 某著名社交类上市公司软件工程师笔试题
- 真题详解16 某知名互联网公司软件工程师笔试题
- 真题详解17 某知名网络安全公司校园招聘技术类笔试题
- 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题
[外链图片转存中…(img-5gJooGAK-1626925923406)]
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)