nacos 配置中心详解
前言
本文主要学习和使用 nacos 配置中心,从 ncaos 配置中心原理出发,深入到个人项目中的nacos配置中心使用。
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数、启动参数等。应用程序根据配置改变自身的行为,但一般程序不会去修改配置。
对于配置,大家在日常开发中应该很熟悉。配置的加载有多种方式,其中hard code在应用中的方式最不可取的,而配置文件、环境变量、启动参数、甚至数据库的方式,在微服务架构中多机器、多应用、多实例的情况下也有很大不足,会使得配置分散,不易于管理。想象一下,如果你启动了一个服务的多个实例,一旦配置需要更改,在没有配置中心的情况,你得将每个实例的配置信息改一遍,这将是非常繁琐且低效的工作。
配置中心就是一种统一管理各种应用配置的基础服务组件,它将将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
一个合格的配置中心需要满足如下特性:
• 配置项容易读取和修改
• 分布式环境下应用配置的可管理性,即提供远程管理配置的能力
• 支持对配置的修改的检视以把控风险
• 可以查看配置修改的历史记录
不同部署环境下应用配置的隔离性
nacos 基本配置信息
在这里,我们手动实现对 nacos 配置的相关操作,对后续的配置化理解有很大帮助。
首先要了解几个 Nacos 的关键信息:
配置中心使用原理
基础依赖 —— nacos 客户端
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.3</version>
</dependency>
public static void main(String[] args) throws NacosException, InterruptedException, UnsupportedEncodingException {
//使用nacos open api 服务获取相关配置
//namespace 区分命名空间(dev,test...)
String nameSpacePublic = ""; //命名空间区分配置所属环境(或多用户配置)
String nameSpaceDev = "76c8c145-bdc0-4bfc-965d-80337b21cdbf"; //命名空间区分配置所属环境(或多用户配置)
String nameSpaceTest = "766363ce-8b26-4882-b1d9-e12134d5cad7"; //命名空间区分配置所属环境(或多用户配置)
String nameSpaceProd = "d1888d9a-9911-4b6a-84ac-a689cd4c7c66";//命名空间区分配置所属环境(或多用户配置)
String group = "DEFAULT_GROUP"; //组标识可以区分不同的项目
String dataId = "nacos-config-demo.yaml"; //配置文件唯一标识
String nacosIp = "127.0.0.1"; //nacso 服务地址
String nacosPort = "8848"; //nacos 服务端口
Properties properties = new Properties(); // nacos配置信息
properties.put("serverAddr",nacosIp+":"+nacosPort);
properties.put("namespace",nameSpaceDev);
//链接nacos
ConfigService configService = NacosFactory.createConfigService(properties);
//获取配置 5000 超时时间
String config = configService.getConfig(dataId, group, 5000);
System.out.println(config);
//监听,当服务端配置改变时主动推送到客户端
configService.addListener(dataId, group, new Listener() {
@Override
public Executor getExecutor() {
return null;
}
//当配置变化时获取通知
@Override
public void receiveConfigInfo(String s) {
System.out.println("配置变化");
System.out.println(s);
}
});
// 测试让主线程不退出,因为订阅配置是守护线程,主线程退出守护线程就会退出。 正式代码中无需下面代码
while (true){
Thread.sleep(2000);
}
}
测试结果如下

这样,我们就能实现对 nacos 中配置的获取以及实时监听 相关配置的改变。
在 springboot 配置化实现nacos 基本原理如上。
SpringBoot + nacos 配置中心
1. 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
2.关于nacos配置存放位置
注意:nacos 配置需要配置到 bootstrap.yml 或 bootstrap.properties 文件中,而不能是application.yml/properties 文件。
综上所述:Nacos 配置文件必须放入到 bootstrap 文件中,如果放在 application 文件中会出现nacos 连接失败等初始化问题,导致系统无法正常启动。(简单理解为系统已经在加载 Application 配置了,但发现这些配置还没有。)

3. springBoot Nacos 配置
spring:
application:
name: prod-service
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848,127.0.0.1:18848 #配置中心地址(集群)
file-extension: yaml #文件后缀 项目名+文件后缀 -》指定文件
namespace: d31a3f74-e122-41b3-b36e-0de805587fb3 #配置的环境(dev环境)
ext-config[0]: #额外的配置文件
data-id: testExt.properties
group: TEST_GROUP #所在组 不填则默认
refresh: true #是否支持动态刷新
ext-config[1]:
data-id: nacos-demo.yaml
ext-config[2]:
data-id: application.yaml #将相关配置内容放到 nacos 服务器上,读取就行
group: TEST_GROUP
refresh: true
#配置加载的优先级-命名冲突
# 1 基础的和扩展的存在命名冲突 - 以基础的为准
# 2 扩展的之间存在命名冲突 - ext-config[n] n的值越大优先级越高
配置文件解读:
在此配置文件中一共会加载 5 个配置文件,分别是:
| 配置文件 | 来源 | 说明 |
|---|---|---|
| prod-service.yaml | {application.name}.{file-extension} | 绝对会获取的配置 |
| prod-service-dev.yaml | {application.name}-{profiles.active}.{file-extension} | profiles.active 存在时获取 |
| testExt.properties | ext-config[0] | 扩展配置 |
| nacos-demo.yaml | ext-config[1] | 扩展配置 |
| application.yaml | ext-config[2] | 扩展配置 |
说明:profiles.active 在本文中特意赋值为 dev。在这里需要和 namespace 的dev环境做区分,此处的 dev 仅会与服务名生成 prod-service-dev.yaml 配置。而并不能跨 namespace 去 namespace - dev 中获取。
3.ext-config[x] 与 shared-configs[x]
ext-config[x] 与 shared-configs[x] 使用方法相同
都包含:data-id、group(默认为字符串DEFAULT_GROUP)、refresh(默认为true) 三个属性。
-refresh:是动态刷新,在Nacos修改配置后,服务可以动态感知而无需重启项目。
4.配置优先级
在不同配置文件中如果存在相同的配置项,优先级高的匹配文件会覆盖优先级低的。
相关配置优先级如下。
简单记为:定位越明确优先级越高,远程的优先级大于本地,数组编号越大优先级越高
发表评论