这里也可以回顾下renew的作用,renew默认每30秒都会像注册中心发送一次心跳操作,注册中心收到心跳请求后会从注册表中拿出这个实例信息,然后更新该实例最后心跳的时间,这个心跳时间是注册中心用来做故障剔除的,如果一个实例在指定周期内没有发送心跳请求,则会被认为出现了故障 从注册中心摘除掉
但是renew操作对于实例的lastUpdateTimeBug的更新是有Bug的,我在之前的文章中也有提到过,看下源码注释:
这里是注册中心故障感知时的一段代码,作者也在注释中说了:"renew()操作是有问题的,这里多加了一个duration的时间,但是我们又不会去修复这个问题,这里仅仅是影响故障被感知的时间而已,而我的系统就是最终一致的,所以我也不会去修复" (PS:每每看到这里我都会忍不住吐槽,他不知道我们为了提升故障的感知效率 做了很多努力 这或许也就是网上很多人说Eureka代码写的烂的原因吧??)
写在最后最近在帮助公司面试一些候选人,我也会问一些 SpringCloud相关的问题,但经常一些候选人的回答:
"这些框架都过时了,我们使用了最新的xxx框架"、"你问的这些东西我只需要会用 我不需要知道原理"...
诸如此类的回答很多,我平时是一个比较喜欢刨根问底的人,坚信一切问题在源码面前都毫无秘密,学东西要知道其然也要知道其所以然。万丈高楼平地起,框架也只不过是辅助我们工作的一种工具,里面的实现还都是依赖于最底层的技术。
借用我老师的一句话:技术不分新旧,技术仅仅是一个载体,通过分析他们的源码去教给你的是架构设计、思想原理、方案机制、内核机制,以及分析源码的方法、技巧和能力。
PS:特别鸣谢及参考
以上是我阅读源码时的一些思考,写出来的内容可能会存在错误,有写的不对的地方还请大家跟我说明,希望能够和大家一同提高成长,欢迎加我微信交流:W510782645
参考以下博文,感谢原作者内容分享:
Eureka 源码解析 —— Eureka源码解析 —— 应用实例注册发现 (九)之岁月是把萌萌的读写锁
什么是读写锁?微服务注册中心是如何进行读写锁优化的?