Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。
官方文档: https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
前面已经搭建好 Nacos Server服务了,下面使用 Nacos 做配置中心。
在app-user服务中使用Nacos做配置中心。
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
bootstrap配置文件,一般添加 nacos配置中心的相关信息。项目的信息还是放到 application配置文件中。
注意:
必须使用 bootstrap.properties或者 bootstrap.yaml配置文件来配置 Nacos Server 地址。
# nacos配置中心地址
spring:
cloud:
nacos:
server-addr: 192.168.xxx.xxx:8848
username: nacos
password: nacos
config:
namespace: b4d0832b-a7b0-44c2-8ce5-1abe676a4736 # 使用命名空间id
在 Nacos Spring Cloud 中,DataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
spring.application.name 的值
,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。spring.profiles.active
为空时,对应的连接符 - 也将不存在, dataId 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension}此时,application.yaml文件内容如下:
server:
port: 18081
servlet:
context-path: /app-user
spring:
application:
name: app-user #应用名称
在 Nacos Server管理界面中,新建 DataId为 app-user 的配置列表。
这里在启动类中,获取配置信息。
@SpringBootApplication
public class AppUserApplication {
public static void main(String[] args) throws InterruptedException {
// SpringApplication.run(AppUserApplication.class, args);
ConfigurableApplicationContext applicationContext = SpringApplication.run(AppUserApplication.class, args);
while (true) {
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
启动服务,发现获取的是 app-user.properties,我们把 app-user.properties删除,立刻获取到了 app-user配置信息。
配置文件的优先级为:app-user.properties > app-user。两者都是 Properties格式。
然后,我们再把 app-user改为 yaml格式。发现获取不到 Nacos的配置信息了。
在 bootstrap配置文件中,需要我们显示的声明 dataid 文件扩展名为 yaml。
重启服务,发现获取又到了 app-user(yaml格式)配置信息。
上面针对 spring.cloud.nacos.config.xxx配置,简单使用了 namespace和 file-extension。其他配置下面也使用一下。
启动app-user服务,使用 Spring原生的 @Value(“key”)注解就可以获取取 naocs配置中心的信息。
@RefreshScope注解
:Nacos的注解,可以实现动态感知配置中心修改后的值
。@RestController
@RequestMapping("/UserNacos")
@Slf4j
@RefreshScope // 动态感知配置中心修改后的值
public class UserNacosConfigController {
/**
* 使用 Spring原生的 @Value(“key”)注解获取配置
*/
@Value("${user.name}")
private String userName;
@Value("${user.age}")
private Integer age;
/**
* http://localhost:18081/app-user/UserNacos/getNacosConfig
*
* @return
*/
@GetMapping("getNacosConfig")
public R getNacosConfig() {
String user = "userName:" + userName + ", age:" + age;
log.info("user信息:" + user);
return R.ok().put("user", user);
}
}
访问,然后修改动态获取值,ok。
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,
不仅仅加载了以 dataid为 s p r i n g . a p p l i c a t i o n . n a m e . {spring.application.name}. spring.application.name.{file-extension:properties} 为前缀的基础配置,
还加载了dataid为 s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name−{profile}.${file-extension:properties} 的基础配置。
在日常开发中,如果遇到多套环境下的不同配置,可以通过 Spring 提供的 ${spring.profiles.active} 这个配置项来配置。
1)application.yaml配置文件如下:
server:
port: 18081
servlet:
context-path: /app-user
spring:
application:
name: app-user #应用名称
profiles:
active: dev
2)nacos管理界面,创建DataId为的配置
3)重启app-user服务。发现获取了 app-user-dev.yaml的配置信息
Namespace 用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。
在没有明确指定${spring.cloud.nacos.config.namespace}
配置的情况下, 默认使用的是Nacos 上 Public 这个namespace。
如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring.cloud.nacos.config.namespace=b4d0832b-a7b0-44c2-8ce5-1abe676a4736
Group是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。
在没有明确指定${spring.cloud.nacos.config.group}
配置的情况下,默认是DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:
spring.cloud.nacos.config.group=DEVELOP_GROUP
Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。
Data ID 通常采用类 Java 包(如com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
自定义 Data Id 的配置有两种方式:
# nacos配置中心地址
spring:
cloud:
nacos:
server-addr: 192.168.xxx.xxx:8848
username: nacos
password: nacos
config:
namespace: b4d0832b-a7b0-44c2-8ce5-1abe676a4736 # 使用命名空间id
# group: dev
file-extension: yaml
shared-configs:
- data-id: app.service.common01.yaml
refresh: true
#group: 默认是Default-group
- data-id: app.service.common02.yaml
refresh: true
extension-configs:
- data-id: app.service.common02.yaml
refresh: true
重启 app-user服务。创建 DataId为 app.service.common01.yaml配置。发现服务注册成功。
优先级从高到低:
profile > 带后缀配置文件 > 默认配置文件 > extension-configs(下标越大优先级就越大) >shared-configs(下标越大优先级就越大)
注意:优先级高的会覆盖优先级低的配置项, 并且会形成互补。
– 求知若饥,虚心若愚。