一、前言
Nacos除了可以作为服务的注册中心,它还可以作为服务的配置中心使用,类似于Spring Cloud Config。
Nacos配置中心是支持热加载的,如果需要对Bean进行动态刷新,给类添加@RefreshScope或@ConfigurationProperties注解即可,当Nacos监听到服务端配置发生变化时会实时触发org.springframework.cloud.context.refresh.ContextRefresher的refresh方法,将新的配置实时推送到客户端。
二、Nacos的安装
Nacos的安装参考该篇文章《Nacos作为注册中心(一) 使用Spring Cloud开发消费者对提供者的调用》
三、概念
3.1 Profile
Java项目一般都会有多个Profile配置,用于区分开发环境,测试环境,准生产环境,生成环境等,每个环境对应一个properties文件(或是yml/yaml文件),然后通过设置 spring.profiles.active 的值来决定使用哪个配置文件。Nacos Config的作用就把这些文件的内容都移到一个统一的配置中心,即方便维护又支持实时修改后动态刷新应用。
3.2 Data ID
当使用Nacos Config后,Profile的配置就存储到Data ID下,即一个Profile对应一个Data ID
Data ID的拼接格式:${prefix} - ${spring.profiles.active} . ${file-extension}
prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置
spring.profiles.active 取 spring.profiles.active 的值,即为当前环境对应的 profile
file-extension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置
3.3 Group
Group 默认为 DEFAULT_GROUP,可以通过 spring.cloud.nacos.config.group 来配置,当配置项太多或者有重名时,可以通过分组来方便管理
四、配置中心的配置
4.1 创建2个Data ID
打开Nacos配置界面,依次创建2个Data ID
- nacos-provider-dev.yaml 开发环境的配置
- nacos-provider-test.yaml 测试环境的配置
4.1.1 开发环境的配置
4.1.2 测试环境的配置
五、创建IDEA项目
5.1 创建工程
5.2 创建bootstrap.yml
spring:
application:
name: nacos-provider
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 192.168.1.17:8848
prefix: nacos-provider
group: DEFAULT_GROUP
file-extension: yaml
5.3 NacosConfigApplication.java
package com.anron.nacosconfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}
}
5.4 NacosConfigApplication.java
package com.anron.nacosconfig.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: Anron
* @Date: 2020/9/15 17:31
*/
@RestController
@RefreshScope
@RequestMapping("/api")
public class ConfigController {
Logger log = LoggerFactory.getLogger(this.getClass());
@Value("${db.host:127.0.0.1}")
private String dbhost;
@Value("${db.port:80}")
private String dbport;
@RequestMapping("/getConfig")
public String getConfig() {
log.info("call db.host = [{}], db.port=[{}]", dbhost, dbport);
return dbhost + ":" + dbport;
}
}
六、测试
调用URL进行测试
http://localhost:8080/api/getConfig
然后修改Nacos Config中的配置数据
再次调用URL进行测试,可以看到配置数据已更新
七、配置的隔离
在实际的应用中,存在着以下几种环境隔离的要求:
1、开发环境、测试环境、准生产环境和生产环境需要隔离
2、不同项目需要隔离
3、同一项目,不同的模块需要隔离
可以通过Nacos的服务器、namespace命名空间、group分组来进行隔离
- Nacos的服务器 spring.cloud.nacos.config.server-addr
- Nacos的命名空间 spring.cloud.nacos.config.namespace,是命名空间的ID不是名称
- Nacos的分组 spring.cloud.nacos.config.group
在bootstrap.yml文件中可以通过配置Nacos的server-addr、namespace和group来区分不同的配置信息。