这两年捉过的虫原创
hello,大家好,我是小楼。
1. 《记一次spring注解@Value不生效的深度排查》
时间拨回到2020年4月6日
,周末,天晴,准备将上周工作中遇到的一个问题解决并记录下来。
是一个Spring和Dubbo结合起来无法入属性的问题。
不过时间过去实在太久,现在让我准确地描述出来,有点困难,但我知道问题大概出在bean的初始化顺序上。
文章写完后,不知放哪里,于是匆匆注册了个公众号,取啥名呢?就叫「捉虫大师」吧。
当时匆忙地甚至忘了我还有个带留言功能的公众号,后来想想,将错就错吧,没有留言也挺好,省的招来骂声,影响写作心情。
那时没有排版,没有任何技巧,朴实无华。
这便是我写公众号的初衷:记录工作、学习中遇到的问题和解决过程,以及一些思考
。
2. 《Sentinel在docker中获取CPU利用率的一个BUG》
接下来的几天疯狂输出,将之前工作中遇到的问题都一一回忆,记录下来。
在搭建公司的Sentinel(限流熔断系统)时发现,Sentinel的自适应限流会根据CPU负载信息进行限流,在Docker中获取的CPU利用率是宿主机的,显然这不合适。
当时我还去github上提了issue,得到的回复是升级JDK,大家懂得,JDK万年都是8,所以这条建议基本没啥用。
不过后来,有位大佬用代码解决了这个问题,我也把这段代码Merge到了公司的系统上去。
这篇文章后来有好多小伙伴加我微信和我交流,这让我发现,写这类问题排查问题其实是有价值的。
3. 《以为是青铜,没想到是王者的dubbo标签路由》
当时在公司用Dubbo标签路由搭建了一套泳道测试环境,刚开始怎么都调不通,于是去看代码,发现每次调用完了Dubbo都会把上下文清理掉,导致第二次调用丢失了标签。
于是又去github上问这算不算标签路由的BUG,得到回复否,但可以用filter的方式去把标签继续带下去,于是就通过这个思路解决问题。
有不少小伙伴来咨询这个问题,聊过不少,还有直接要代码的。
后来我发现大家有两种方式解决这个问题,一个是像我这样利用标签路由,另一个是自己再扩展一个路由。
4. 《当dubbo多注册中心碰上标签路由》
还是标签路由,当时在做一个迁移注册中心的事,注册中心迁移的中间态是多个注册中心并存,当时测试反馈,明明有Provider为什么调用不通。
查了半天,发现存在标签和多注册中心时,不仅调用会走标签路由,甚至找注册中心的逻辑也复用了RPC调用逻辑,也会走一遍标签路由,找不到合适的注册中心时,就直接报错。
显然这是Dubbo的BUG,但2.7之后就没这个问题了。
5. 《一次漫长的dubbo网关内存泄露排查经历》
在搞注册中心之前,还搞了一段时间的Dubbo网关。
这个问题非常的棘手,网关运行地好好的,突然就内存泄露了,不定时,可能几周,可能几个月。
当时真的是绞尽脑汁,能用的方法都用上了,也查不出个所以然。刚好当时看了「闪电侠」的《Netty堆外内存排查盛宴》文章,文中通过植入一段监听代码来发现问题。
这个启发了我,于是我也在网关中植入了监控代码,终于让我抓到了到底哪里泄露。
后来在网络上看,其实有一些人的博客记录了这个问题,但当时很难从网上准确找到,只有经历过,才知道问题是不是同一个。
6. 《skywalking内存泄露排查》
虽然标题是SkyWalking,其实是SkyWalking和Sentinel共同作用的结果,这个问题当时直接导致了线上故障。
事后复盘,主要原因是测试环境与线上环境不一致导致。
所以说,灰度上线很重要。
至于问题排查,这篇可以算的上是比较典型的内存泄露问题。
7. 《从nacos客户端的TIME_WAIT说起》
再说回注册中心迁移,当时是往Nacos迁移,测试阶段遇到了Nacos客户端会出现大量TIME_WAIT的问题,还好测试充分,这要是上线了,也是个大故障。
但这要写篇文章似乎也太短了,于是就带大家复习了一下TCP的3次握手。
8. 《几个你不知道的dubbo注册中心细节》
这篇关于Dubbo注册中心配置的文章算是一个小小的问题汇总,包括如何配置backup地址,如何配置多注册中心的一些细节,都是从实际的生产中发现的。
9. 《升级dubbo,小心default.version!》
本文也是一次线上问题记录,是Dubbo2.6和2.7的一个关于version/group的兼容性问题,很容易出问题。
本文当时被一个大佬转载了,他换了个标题《升级Dubbo,竟然搞出线上P0故障》,果然标题党比较容易吸引人点击。
10. 《排查dubbo接口重复注销问题,我发现了一个巧妙的设计》
写这篇文章时,我已经开始负责自研的注册中心了,当时用户经常反馈Dubbo在停止时会报错,我查了下发现有些版本的Dubbo会重复注销。
当时还查了不少资料,也找到了徐妈(Kirito的技术分享)关于Dubbo优雅停机的文章,至今印象深刻。
11. 《rocketmq优雅停机往事》
这是一篇旧文,我还在做业务时发现的问题,并尝试了各种方法解决,虽然问题不大,但解决起来还是蕴藏着很多技术点,后来也看到了官方在rocketmq的spring-boot-starter是如何解决的。
这篇文章最早写的比较朴素,发布在博客上,当时我想试验下在文章中插入表情包,会不会读者反响很好,但结果是并没有多好。
我想并不是表情包不好,而是要合乎时宜、适度地使用。
12. 《给dubbo贡献源码,做梦都在修bug》
本文是当时看Dubbo的Redis注册中心源码时发现的一个问题,并且提交源码解决了。
当时很神奇的一个事情是一个单元测试运行时间稍微久了一点,然后当天晚上竟然在梦里发现了白天提交的代码有BUG,第二天早上起来看,果然有问题,而且梦里精准到了出问题的代码行数,简直不可思议。
故事绝对真实。
13. 《Dubbo No provider问题排查思路》
这也是篇总结性质文章,对于工作中有人问我Dubbo为什么调用时报No Provider错时,我就把这篇文章甩给他,让他先自查。
后来发现Dubbo的新版本在日志中透出了更详细的信息,让排查变得非常简单,如果当时更近一步,应该也能想到这个方法。
14. 《案例分享 | dubbo 2.7.12 bug导致线上故障》
这篇文章算是个分水岭,在这之前,我都是闷头写文,在这之后,开启了投稿之旅。
当时这篇文章被歪歪(why技术)转发了下,于是很多大佬纷纷前来转载。
虽然对我来说,本质上没有变化,但读者变得更多了。
15. 《dubbo 配置 loadbalance 不生效?撸一把源码》
也是一篇非常偏细节的文章,但写文我也在想,关于Dubbo的文章,本身受众就不算多,而且如此细节,有没有写的必要?
于是后面有意减少了关于Dubbo的文章,但实在碰到有意思的我还是会写下来。
16. 《Java 问题排查技术分享》
这是在前公司的一次分享,分享主题是如何排查Java问题,当时只是分享了一点点想法和案例。
后来我还有个写一本问题排查方**+案例的电子书,但始终没有下手。
可能是太懒了吧。
17. 《我好像发现了一个Go的Bug?》
再后来,开始写Go,一次用Go做Benchmark时,发现竟然超时了。
不得不说问题排查久了,是有一种感觉的,这个超时感觉就有问题。
于是花了2天时间,把Benchmark的源码看了一遍,发现确实有问题,于是给Go提了BUG,官方也承认有BUG。
而且也提交了修复代码,但直到现在也没合并。
不过也水了2篇文章,不亏。
18. 《踩了个DNS解析的坑,但我还是没想通》
遇到了这么多问题,有没有没查出原因的?还真有。
这次就是,用Go的httpClient遇到了DNS的问题,虽然解决了,但没查出根因。
由于时间比较紧张,于是不再纠结,遂记录下此文,趁着这个机会把Go的DNS解析流程撸了一遍,后来也看了Java的实现,大差不差。
19. 《眼见不一定为实:调用链HBase倾斜修复》
这是一位朋友的投稿,其实跟HBase关系不大,但大家看到HBase就不想点开。
于是这篇文章的阅读率很低。
20. 《太极限了,JDK的这个BUG都能被我踩到》
其实是个很简单的BUG,不错的地方是结合了实践。
这篇文章也是写了很久没写完,当时一个劲地钻牛角尖,想从JVM实现的角度看看为什么会出这种BUG,后来发现没啥好写的。
直到某一天想到是否可以换个角度写,没想到写出来效果还挺好。
21. 《这不会又是一个Go的BUG吧?》
这篇文章记录了一个线上Go读写锁使用不当导致的问题。
写Java出身的我,感觉Go的实现很奇怪,于是和很多小伙伴讨论,写Java的小伙伴说Go的读写锁有问题,写Go的小伙伴认为Java的锁实现不合理。
究竟谁有问题?
Go没有问题,Java也没有问题,有问题的是我们不够了解他们,所以学习一门编程语言,还是得脚踏实地,系统地学习一遍。
22. 《抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会》
这篇文章来源一个技术群,群里讨论了大半天基本把结论说了出来,我只是事后又验证了一遍,用有趣的文字记录下来。
好久没用Arthas的我,又复习了一下它的用法,感觉很爽。
这22个问题只是开端,未完待续~