前言
nacos 在微服务体系中有两大个功能, 作为配置中心 和 服务发现
最近碰到了一些 nacos 的相关问题, 整理了一下 这方面的东西
nacos client 的配置读取
这一系列主要是在 NacosManager 这个 bean 的相关业务流程的过程中处理的
NacosManager 初始化的时候, 会向 nacos 登录, 如果配置的有 用户名密码信息, 才会发送 登录请求, 否则 不会
NacosManager 组合了一个 NacosConfigService, NacosConfigService 组合了一个 ServerHttpAgent
ServerHttpAgent 组合了一个 securityProxy, 由这个 securityProxy 来进行登录, 然后保存 token
ServerHttpAgent 会定时请求登录接口, 以更新 token 信息, 主要是请求的服务 “/nacos/v1/auth/users/login”
登录成功之后, 保存 token 等等相关信息
NacosConfigService 组合了一个 ClientWorker, ClientWorker 组合了上面的 ServerHttpAgent
然后由这个 ServerHttpAgent 来代理发送和 nacos 交互的相关请求
然后 加载具体的业务配置这边, 是由框架驱动的, 比如这里的 NacosPropertySourceLocator, 主要是请求的服务 ”/nacos/v1/cs/configs”
ClientWoker 中增加了配置信息的长轮训处理, 请求的服务是 “/nacos/v1/cs/configs/listener” 然后 如果有服务配置发生了改变, 会自动重新拉取配置, 更新配置
ClientWorker$ LongPollingRunnable 是一直在执行
服务器这边 长轮训处理如下, 客户端这边传过来的默认的超时时间为 30s
所以可以理解为 ClientWorker$ LongPollingRunnable 小于 30s 会调用一次
nacos client 的服务发现
初始化 NacosServiceManager 的过程中, 初始化的这一系列组件
NacosNamingService 组合了 NamingProxy
NamingProxy 组合了一个 SecurityProxy
在 NamingProxy 的构造方法中处理的 登录相关处理, 和上面一样 是基于 SecurityProxy
登录之后 SecurityProxy 保存 accessToken, 然后 下一次的请求发送 携带上 accessToken
其他业务请求, 比如这里 访问了 “/nacos/v1/ns/instance/list” 来更新维护当前服务相关的实例的元数据
HostReactor 初始化的时候增加了一个 更新当前服务的 定时任务, 调用的是 HostReactor$UpdateTask, 里面会调用 “/nacos/v1/ns/instance/list” 来更新服务信息
默认是 1秒, 不超过 60 秒, 会随着失败次数 调用频率降低, 具体的逻辑在 HostReactor$UpdateTask.run 中
在当前 上下文初始化完成之后, 会向 nacos 注册当前机器
然后 服务启动了之后 BeatReactor 添加了心跳的任务
心跳的处理中, 如果发现 服务已经下线了, 会自动注册当前服务
默认的周期是 5s, 然后 可通过 “preserved.heart.beat.interval”配置
如果发现 服务已经下线了, 会自动注册当前服务
完