nacos配置中心帮助我们很好的管理各服务中的配置文件,同时动态刷新机制很好的解决了配置文件变更后需要重启的问题。所以本文从客户端起点开始窥探具体实现原理。
1. 什么是长轮询
要搞懂Nacos注册中心原理,最重要的是搞清楚什么是长轮询,注册中心就是用长轮询的机制去获取最新配置信息,而长轮询和长连接有什么区别呢?
原理 | 优点 | 缺点 | |
---|---|---|---|
轮询 | 客户端定时向服务端请求,响应后立刻返回关闭连接 | 服务端编写简单,单一请求响应 | 浪费带宽和服务器资源 |
长轮询 | 客户端向服务端请求,服务端会在有新数据时候响应,否则会在一定时间后返回 | 避免频繁无效请求 | 无法保证数据顺序 |
长连接 | 一直保持连接不断开 | 消息通讯及时 | 维护长连接增加开销 |
Nacos长轮询
从上图可以得知几个关键:
- nacos长轮询超时时间是30s,实际是客户端每隔30s会发送一次请求,而服务端若无数据变更会在29.5s时候响应。
- nacos管理后台通过推送配置方式将最新变更发送到服务端。
具体细节
- 客户端发起长轮询
客户端发起一个 HTTP 请求,请求信息包含配置中心的地址,以及监听的 dataId(本文出于简化说明的考虑,认为 dataId 是定位配置的唯一键)。若配置没有发生变化,客户端与服务端之间一直处于连接状态。 - 服务端监听数据变化
服务端会维护 dataId 和长轮询的映射关系,如果配置发生变化,服务端会找到对应的连接,为响应写入更新后的配置内容。如果超时内配置未发生变化,服务端找到对应的超时长轮询连接,写入 304 响应。
304 在 HTTP 响应码中代表“未改变”,并不代表错误。比较契合长轮询时,配置未发生变更的场景。 - 客户端接收长轮询响应
首先查看响应码是 200 还是 304,以判断配置是否变更,做出相应的回调。之后再次发起下一次长轮询。 - 服务端设置配置写入的接入点
主要用配置控制台和 client 发布配置,触发配置变更
2.SpringCloud配置中心原理
1.PropertySourceBootstrapConfiguration
该类是配置入口类,用于解析配置文件,我们先观察该类的继承关系。
可以发现该类是一种ApplicationContextInitializer,而initializer是在prepareContext中进行初始化调用的。
可以观察到在initialize的时候会用PropertySourceLocator进行配置获取。
2.PropertySourceLocator
上文得知PropertySourceLocator就是Spring Cloud获取配置的类,那我们看一下Nacos是如何注入的。
这个时候我们可以去nacos config自动配置文件里找一下。
果然,我们可以看到在NacosConfigBootstrapConfiguration配置了我们需要的nacos实现类NacosPropertySourceLocator。接着我们继续往其实现方法locate中看。
3.NacosConfigService
从locate往里进入最后定位到ConfigFactory::createConfigService,顾名思义该方法用于创建配置中心。