读源码方法:
1 Debug:生产环境无法 Debug,这个一般用于开发环境。
2 静态看源码:这个更重要,debug 只是配合一下。
3 第一遍看主线。第二遍看次要。第三遍看细节。
4 优先看参数,例如这里的 instance,看代码中的 instance,并区分哪些是关键 instance 的。这里最后一个 instance 是关键。
五 跟踪到 addInstance 方法中 六 继续跟踪到 put看看 consistencyService 定义的地方。
从 @Resource 的 name 看,应该是最上面的那个实现类。
当然也可以通过 debug 来验证,打个断点看看。
另外要注意一下:Instance 实现了 Record,这里体现了面向接口编程的思想。
七 继续往下跟 八 进入 put 方法 九 进入到 onPut 方法 十 进入 addTask 方法到此,注册逻辑结束。但实际还没结束。
十一 线程中 run 函数调用当看到 Runnable 时,就要看线程中的 run 方法。
run 方法会消费阻塞队列 tasks,并对其中的数据进行处理。
十二 再看 handle 方法,关键代码如下 十三 进入 onChange 方法分支代码不看,抓重点 updateIPs。
十四 进入 updateIPs 十五 继续进入 updateIPs找到核心代码。
该结构定义如下:
它就是实例的的注册表。
十六 提问 1 为什么丢到阻塞队列中,然后异步消费?微服务很多,并发量高,如果不异步消费而采用同步,注册会很慢。如果一个微服务有十几个类似 nacos 客户端嵌入,微服务启动时间会很长。
2 如果线程消费阻塞队列过慢会出现消息积压问题吗?延迟注册这个问题不大,并且出现这种问题的场景很少。
3 下面代码会导致 CPU 在升高吗?tasks 中有数据时,正常消费。tasks 中无数据时,会在 tasks.take 处阻塞,让出 CPU ,这是阻塞队列的特性决定的,可以去看看并发编程。



