微服务 Nacos实现统一配置管理

配置文件想必大家都不陌生在Spring Boot项目中,默认会提供一个application.properties或者application.yml文件,我们可以把一些全局性的配置或者需要动态维护的配置写入该文件,比如数据库连接功能开关、限流闻值、服务器地址等。为了解决不同环境下服务连接配置等信息的差异,Spring Boot还提供了甚于spring.profiles.active=profile)的机制来实现不同环境的切换。
随着单体架构向服务化架构及微服务架构的演进,各个应用自己独立维护本地配置的方式开始显露出它的不足之处:

  • 配置的动态更新:在实际应用中会有动态更新配置的需求,比如修改服务连接地址、限流的配置等。在传统模式下,需要手动修改配置文件并且重启应用才能生效,这种方式效率太低,重启也会导致服务暂时不可用。
  • 配置集中式管理:在微服务架构中,某些核心服务为了保证高性能会部署上百个节点,如果在每个节点中都维护一个配置文件,一旦配置文件中的某个属性需要修改,可想而知,工作量是巨大的。
  • 配置内容的安全性和权限:配置文件随着源代码统一提交到代码库中,容易造成生产环境配置信息的数据泄露。
  • 不同部署环境下配置的管理:前面提到过通过profile机制来管理不同环境下的配置,这种方式对于日常维护来说比较烦琐。

统一配置管理就是弥补上述不足的方法,简单来说,最基本的方法是把各个应用系统中的某些配置放在一个第三方中间件上进行统一维护。然后,对于统一配置中心上的数据的变更需要推送到相应的服务节点实现动态更新。所以在微服务架构中,配置中心也是一个核心组件。

一、Nacos配置中心简介

配置中心的开源解决方案很多,比如ZooKeeper、Disconf、ApolloSpring Cloud Config、QConfNacos等。同样,不管是哪一种解决方案,它的核心功能是不会变的;

Nacos是Alibaba开源的中间件,在第5章中笔者针对Nacos实现服务注册与发现功能进行了详细的分析。我们知道在Nacos的架构图中有两个模块,分别是Config Service和Naming Service。其中Config Service就是Nacos用于实现配置中心的核心模块,它实现了对配置的CRUD、版本管理、灰度管理、监听管理、推送轨迹、聚合数据等功能。我们主要国绕Nacos中的Config Service横块实现配置中心的功能进行深度的分析

二、Nacos集成Spring Boot实现统一配置管理

微服务 Nacos实现统一配置管理_第1张图片
关于Nacos的两个注解说明如下。

  • @NacosPropertySource:用于加载datald为example的配置源,autoRefreshed表示开启自动更新。
  • @NacosValue:设置属性的值,其中info表示key,而Local Helo World代表默认值。也就是说,如果key不存在,则使用默认值。这是一种高可用的策路,在实际应用中,我们需要尽可能考虑到在配置中心不可用的情况下如何保证服务的可用性。
    微服务 Nacos实现统一配置管理_第2张图片
    微服务 Nacos实现统一配置管理_第3张图片

OpenAPI创建方式
微服务 Nacos实现统一配置管理_第4张图片

三、 Spring Cloud Alibaba Nacos Config

用过Spring Cloud的同学应该都知道,Spring Cloud Config是Spring loud生态中的统一配置管理的组件,它为外部化配置提供了服务端和客户端支持,包含Config Server和Config Client两部分。而SpringCloud Alibaba Nacos Config是Config Server和Client的替代方法下面我们演示-下如何基于Spring Cloud生态来集成Nacos实现配置中心。

3.1 Nacos Config的基本应用

在Spring Cloud生态下Nacos Config的使用步颗如下:

  • 创建Spring Boot项目,添加spring-cloud-starter依赖

微服务 Nacos实现统一配置管理_第5张图片
微服务 Nacos实现统一配置管理_第6张图片微服务 Nacos实现统一配置管理_第7张图片

3.2 动态更新配置

微服务 Nacos实现统一配置管理_第8张图片

3.3基于DataID配YAML的文件扩展名

微服务 Nacos实现统一配置管理_第9张图片

3.4不同环境的配切换

微服务 Nacos实现统一配置管理_第10张图片

3.5 Nacos Config自定义Namespace和Group

微服务 Nacos实现统一配置管理_第11张图片
微服务 Nacos实现统一配置管理_第12张图片
微服务 Nacos实现统一配置管理_第13张图片
微服务 Nacos实现统一配置管理_第14张图片
微服务 Nacos实现统一配置管理_第15张图片

四、Nacos Config 实现原理解析

微服务 Nacos实现统一配置管理_第16张图片

4.1 配置的CRUD

微服务 Nacos实现统一配置管理_第17张图片

4.2 动态监听之Pull Or Push

微服务 Nacos实现统一配置管理_第18张图片
微服务 Nacos实现统一配置管理_第19张图片
当Nacos Config Server上的配置发生变化时,需要让相关的应用程序感知配置的变化进而感知应用的变化,这就需要客户端针对感兴趣的配置实现监听。那么Nacos客户端是如何实现配置变更的实时更新的呢?
般来说,客户端和服务端之间的数据交互无非两种方式:Pul和Push。

  • Pull表示客户端从服务端主动拉取数据
  • Push表示服务端主动把数据推送到客户端。
    这两种方式没有什么优劣之分,只是看哪种方式更适合于当前的场景。比如ActiveMQ就支持Push和Pul两种模式,用户可以在特定场景选择不同的模式来实现消费端消息的获取。
    对于Push模式来说,服务端需要维持与客户端的长连接,如果客户端的数量比较多,那么服务端需要耗费大量的内存资源来保存每个连接,并且为了检测连接的有效性,还需要心跳机制来维持每个连接的状态。
    在Pul模式下,客户端需要定时从服务端拉取一次数据,由于定时任务会存在一定的时间间隔,所以不能保证数据的实时性。并且在服务端配置长时间不更新的情况下,客户端的定时任务会做一些无效的Pull
    Nacos采用的是Pul模式,但并不是简单的Pull,而是一种长轮询机制,它结合Push和Pull两者的优势。客户端采用长轮询的方式定时发起Pul请求,去检查服务端配置信息是否发生了变更,如果发生了变更,则客户端会根据变更的数据获得最新的配置。所谓长轮询,是客户端发起轮询请求之后,服务端如果有配置发生变更,就直接返回,如图6-6所示
    微服务 Nacos实现统一配置管理_第20张图片
    如果客户端发起Pull请求后,发现服务端的配置和客户端的配置是保持一致的,那么服务端会先“Hold”住这个请求,也就是服务端拿到这个连接之后在指定的时间段内一直不返回结果,直到这段时间内配置发生变化,服务端会把原来“Hold”住的请求进行返回,如图6-7所示,Nacos服务端收到请求之后,先检查配置是否发生了变更,如果没有,则设置一个定时任务,延期29.5s执行,并且把当前的客户端长轮询连接加入allSubs队列这时候有两种方式触发该连接结果的返回:
  • 第一种是在等待29.5s后触发自动检查机制,这时候不管配置有没有发生变化,都会把结果返回客户端。而29.5s就是这个长连接保持的时间。
  • 第二种是在29.5s内任意一个时刻,通过Nacos Dashboard或者API的方式对配置进行了修改,这会触发一个事件机制,监听到该事件的任务会遍历allSubs队列,找到发生变更的配置项对应的ClientLongPolling任务,将变更的数据通过该任务中的连接进行返回,就完成了一次“推送”操作;

微服务 Nacos实现统一配置管理_第21张图片
这样既能够保证客户端实时感知配置的变化,也降低了服务端的压力。其中,这个长连接的会话超时时间默认是30s。

五 、Spring Cloud如何实现配置的加载

微服务 Nacos实现统一配置管理_第22张图片
微服务 Nacos实现统一配置管理_第23张图片
微服务 Nacos实现统一配置管理_第24张图片

微服务 Nacos实现统一配置管理_第25张图片
微服务 Nacos实现统一配置管理_第26张图片

六 Nacos 核心源码讲解

你可能感兴趣的:(spring,微服务)