Nacos配置中心的Pull原理,附源码

在单体服务时代,关于配置信息,管理一套配置文件即可 。
而拆分成微服务之后,每一个系统都会有自己的配置,并且都各不相同,有些配置还需要动态改变,以达到动态降级、切流量、扩缩容等目的 。
一、本地配置在Spring Boot开发中,可以把配置项放到config文件中,把配置当代码使用 。比如:
public class AppConfig {public static final String static_SUCCESS_CODE = "0000";public static final String static_ERROR_CODE = "0001";}也可以通过@Value加载yaml配置文件中的配置 。
@Componentpublic class HttpConfig {// 核心线程数public static String config_CORE_POOL_SIZE;@Value("${async.corePoolSize}")public void setSaveUrl(String corePoolSize) {HttpConfig.config_CORE_POOL_SIZE = corePoolSize;}}无论是将配置定义在代码中,还是将配置写在yaml配置文件中,都相当于把配置存在应用程序的本地 。
如果想修改配置,就需要将在linux服务器中部署的程序停止 , 然后手动修改其配置,再进行重启 。
如果修改的配置项较多,这也是一项容易出错,而且繁琐的事情,长期运维的小伙伴应该深有体会 。
当时,我就在想,作为世界上使用人数最多的语言,更新一个配置,需要这么复杂吗?
答案肯定不是的 。
二、配置中心

配置中心(Configuration Center)通常用于集中管理应用程序的配置信息 。这些配置信息可以包括数据库连接信息、外部服务地址、日志级别、超时设置等 。配置中心可以提高应用部署的灵活性和可维护性 。
程序启动时 , 可以自动从配置中心拉取所需要的配置项,配置中心中配置有所改变时,同样可以自动从配置中心拉取最新的配置信息,服务不需要重新发布 。
1、以Nacos为例:
  • 配置中心的信息一般都是放在bootstrap.yml 中 。
  • 初始化的时候 , Bootstrap Context负责从外部源加载配置属性并解析配置 。
  • Bootstrap属性有高优先级,默认情况下 , 它们不会被本地配置覆盖 。
  • 然后再读取application.yml中的配置,进行配置合并,完成项目的启动 。

Nacos配置中心的Pull原理,附源码

文章插图
项目的核心配置,需要热更新的配置才有放到nacos管理的必要 。基本不会变更的一些配置还是保存在微服务本地比较好 。
Nacos配置中心的Pull原理,附源码

文章插图
2、Pull模式Nacos采用的是Pull模式获取服务端数据,客户端采用长轮询的方式定时的发起Pull请求 , 去检查服务端配置信息是否发生了变化 。
  • 客户端发起长轮询请求,监听变更的datAId+group 。
  • 服务端收到客户端的请求,这时会挂起客户端的请求 。
  • 如果在服务端设计的29.5s之内都没有发生变更 , 触发自动检查机制,此时不管是否有变化,服务端都会返回响应到客户端
  • 如果在29.5s之内配置项发生了变更,则会触发一个事件机制,将变更的数据推送的客户端 。

Nacos配置中心的Pull原理,附源码

文章插图
3、也可以通过Nacos实现注册中心
这种是最简单的Nacos注册中心,有若干个服务,都注册到Nacos注册中心 , 调用之前,先到Nacos获取对应接口,然后进行实际的调用 。
服务1和服务2和Nacos之间维护一个心跳关系,每5秒跳一次,频率不能太快或者太慢,否者会嗝屁的 。
  • 如果Nacos在5秒内没有收到心跳,则表示服务挂了,Nacos会下线此服务 。
  • 对于超过15秒没有收到客户端心跳的服务实例,会将它的healthy属性置为false,客户端无法调用healthy为false的服务 。
  • 如果超过30秒没有收到心跳,Nacos会直接将此服务剔除 。
也可以通过服务端主动注销的方式,停止注册 。
服务1调用服务2时,服务1会通过定时任务到Nacos中获取在线的服务,保证所调用的服务一直都是健康在线的状态 。
获取到之后,用缓存将其保存起来,然后通过负载均衡器调用服务2,此时,将不再使用服务端的负载均衡Nginx了 。


推荐阅读