怎样读 nacos 源码——服务端处理客户端注册解读

x33g5p2x  于2021-12-12 转载在 其他  
字(0.8k)|赞(0)|评价(0)|浏览(393)

一 nacos 代码结构

二 Controller 入口

三 注册入口

四 继续跟进

读源码方法:

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 ,这是阻塞队列的特性决定的,可以去看看并发编程。

相关文章