九 配置中心 Nacos Config
9.1 服务配置中心介绍
微服务架构关于配置文件的一些问题:
-
配置文件比较分散。在同一个微服务架构下,配置文件会随着微服务的数量越来越多,并且分散在每一个独立的服务中,需要改配置的话需要到每个具体的服务中去改配置文件,不仅配置麻烦且不好管理。
-
工作中涉及到不同环境的配置,例如application-dev.yml(开发环境)、application-test.yml(测试环境)、application-prod.yml(预生产环境)等等,每个环境所使用配置不同,修改的话,也需要各个具体的服务中去修改。(那么假设有4个服务,每个服务有5个环境,那么就有20个配置文件)
-
在不使用NacosConfig的情况下,配置文件时没有办法实时更细的,修改配置后,需要重启服务才能够获取最新的配置文件,这对于正在运行中的服务是非常不友好的。
在开发中可以在配置文件中配置 spring.profile.active=xx 指定扫描哪个环境的配置文件
xx就是环境的标志,例如:dev,test。
对于以上问题NacosConfig配置中心可以进行处理,处理方式如下:
-
项目配置集中管理:将微服务架构中所有服务的配置文件集中到一起,统一进行管理,并提供一套标准的接口,当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
-
动态更新配置文件参数信息:在配置中心修改了正在运行的某个服务配置文件的时候,可以实时通知这个服务来配置中心同步最新的信息,使之动态更新。
-
解决各个服务中配置文件共通部分:在配置中心已经统一管理了各个服务的配置文件,例如配置文件中的Redis配置,只需要在配置中心单独创建一个Redis配置文件,在各个微服务配置文件中引入这个配置文件就可以,这样在修改例如Redis配置这些共通的配置,不需要在各个服务的配置文件上重复修改。
引入NacosConfig后大概架构图如下:
9.2 SpringCloud Config 与 Nacos Config
- SpringColud Config:SpringCloud中的一个组件,使用方便,与Spirng无缝集成,并且配置储存支持Git,但是它没有可视化的界面,配置信息实时更新也不支持,配置信息修改的话需要重启服务。
- Nacos Config:这是SpringCloud Alibaba技术栈中的一个组件 Nacos,可以做注册中心,也继承了服务配置的功能,相比较SpringCloud Config还可动态更新配置。
9.3 使用Nacos Config统一管理配置
使用Nacos作为配置中心,实际上就是将所有使用配置文件的服务当作客户端,将Nacos当作存储配置文件的服务端,各个微服务需要配置文件的时候从Nacos上去拉去对应的配置件。
-
在需要将配置文件交予配置中心统一管理的服务中添加NacosConfig依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
-
在当前服务中添加NacosConfig的配置
-
创建bootstrap.yml
-
spring: application: name: product-service profiles: active: dev # 当前的启动环境 cloud: nacos: config: server-addr: 127.0.0.1:8848 #Nacos中心地址 file-extension: yaml #配置文件格式
SpringBoot启动读取配置文件优先级:
这里创建bootstrap.xml 目的是在加载application.yml之前去加载,通过bootstrap.xml中配置的Nacos地址、需要的配置文件格式、以及当前application的名字去配置中心获取对应的application.properties加载启动。
-
-
在Nacos配置管理中添加配置,然后将原服务中application.yml配置复制到配置内容中(spring.application.name需要在bootstrap.yml中配置)
-
注释本地application.yml并启动程序进行测试。
在Nacos填写配置文件时 尽量不要有注释,不会像Idea一样智能,有时候有注释会读取配置文件失败
9.4 动态刷新
在NacosConfig中,修改了配置文件中的变量,服务是可以实时读取到的,但是需要开启配置的动态刷新功能
-
在NacosConfig中配置文件添加
appConfig: name: product
-
在需要动态刷新变量的类上添加@RefreshScope注解
@RestController @RefreshScope public class NacosConfigController { @Value("${appConfig.name}") private String appConfigName; }
只有标注了@RefreshScope注解的类中所引用的常量才会动态刷新。
9.5 配置共享
当服务越来越多的时候,比如Redis、RabbitMQ这些中间件的配置都是重复的,或者是一个服务下不同环境的配置文件也是会有重复的配置,这时候就需要将配置共享,就可以改一个配置文件多处生效。
-
不同环境下配置共享:
上面图示了加载配置文件顺序,而加载到application时,首先会加载application.yml然后再去加载指定环境(例如profiles.active=dev,则加载application-dev.yml),所以同一个服务下的共通配置可以在新建一个application.yml进行配置
-
不同服务间配置共享:
不同服务间配置共享类似Maven中引入POM文件
例如将redis配置单独在NacosConfig中创建一个redis-config.yaml
在需要引入的服务的配置文件中配置shared-configs
- - data-id:创建的配置文件名字
- refresh:此配置文件修改后是否动态刷新,默认不刷新
- group:默认是DEFAULT_GROUP分组
spring: cloud: nacos: config: shared-configs: - data-id: redis-config.yaml # 配置要引⼊的配置 refresh: true