1.基本用法

1.1引入nacos配置中心依赖

直接在父模块services中引入即可

<!--nacos-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

1.2配置文件

在子模块service-order中的application.yml中添加如下配置信息

spring :
  cloud:
  config:
    import: nacos:service-order.yml

1.3创建配置

在浏览器输入localhost:8848/nacos,进入配置管理>配置列表>创建配置,输入Data ID和配置内容后点击发布即可

1.4获取配置信息

在OrderController中添加如下:

//  获取配置信息
@Value("${order.timeout}")
private String orderTimeout;
@Value("${order.auto-confirm}")
private String orderAutoConfirm;

@GetMapping("/config")

public String config(){
    return "order.timeout:" + orderTimeout + "order.auto-confirm:" + orderAutoConfirm;
}

启动MainOrderApplication,可以在控制台中看到[Nacos Config] Load config[dataId=service-order.yml, group=DEFAULT_GROUP] 成功加载了数据集

以及监听该配置[Nacos Config] Listening config: dataId=service-order.yml, group=DEFAULT_GROUP

浏览器访问localhost:8000/config

可以看到数据也从配置中心成功获取,当需要修改配置时,可以在该控制器类中加入@RefreshScope注解,激活自动刷新功能。

1.5 禁用配置检查

在实际业务开发中,并非每个服务都需要导入配置,这个时候直接运行启动类,就会报错,那就需要在配置文件中加入禁用配置的检查的设置了sping.cloud.nacos.config.import-check.enabled=false

spring :
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      # 禁用配置检查
      config:
        import-check:
          enabled: false
  application :
    name: service-product
server:
  port: 9000

加入该项设置后,启动类就可以正确运行,但是因为未导入任何配置,因此控制台中也无法获取到配置信息

2.动态刷新

当导入的配置很多时,这个时候通过@value注解一个一个注入就很繁琐,可以选择通过将这些数据集抽取到一个properties类中,批量导入

2.1创建OrderProperties类

在com.atguigu.order包中连包带类创建properties.OrderProperties类,添加对应注解

package com.atguigu.order.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component //  将当前类对象注入到spring容器中
@ConfigurationProperties(prefix = "order") //  将当前类对象和配置文件中的order.*进行绑定,无需@RefreshScope注解刷新
@Data
public class OrderProperties {
    private String orderTimeout;
    private String orderAutoConfirm;

}

2.2批量导入配置集

删去OrderController中的Value注解和RefreshScope注解

修改OrderContrleer类中config方法的返回语句

调用orderProperties类的getter方法获取(注意通过Autowired注解注入orderProperties对象)

public String config(){
    return "order.timeout:" + orderProperties.getOrderTimeout() + "order.auto-confirm:" + orderProperties.getOrderAutoConfirm();
}

运行启动类,效果和之前是完全相同的,该方式提供了批量快速导入且无需自动刷新功能。

3.配置监听

3.1优化启动类

在OrderMainApplication中添加监听配置方法

@Bean
ApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager) {

    return (ApplicationArguments args) -> {
        ConfigService configService = nacosConfigManager.getConfigService();
        configService.addListener("service-order.yml", "DEFAULT_GROUP", new Listener() {
            @Override
            public Executor getExecutor() {
                return Executors.newFixedThreadPool(5);
            }
            @Override
            public void receiveConfigInfo(String configInfo) {
                System.out.println("变化值:" + configInfo);
                System.out.println("发送邮件");
            }
        });
        System.out.println("项目启动就监听配置文件变化");
    };
}

3.2 测试配置监听

运行启动类

浏览器访问localhost:8848/nacos,进入配置管理>编辑配置

修改完点击发布即可,可以通过控制台看到修改后的配置集

思考: Nacos中的数据集 和 application.properties 有相同的 配置项,哪个优先生效?

配置优先级: 先导入优先/外部优先

当配置中心和application.yml配置文件中都存在配置集时,外部配置(配置中心)中的配置会优先生效

4.数据隔离

需求描述 • 项目有多套环境:dev,test,prod • 每个微服务,同一种配置,在每套环境的值都不一样。 • 如:database.properties • 如:common.properties • 项目可以通过切换环境,加载本环境的配置 • 难点 • 区分多套环境 • 区分多种微服务 • 区分多种配置 • 按需加载配置

4.1 创建命名空间&配置

在nacos控制台中创建命名空间

按此步骤,一共创建是三个命名空间

在配置管理中,创建配置,注意选择dev命名空间

按此步骤创建即可,要分别在三个命名空间创建相同的配集齐,较为繁琐,可以通过克隆来提高效率

重复上述步骤,直到三个命名空间中配置集相同。

4.2优化配置文件

server:
  port: 8000
spring :
  application:
    name: service-order
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      config:
        namespace: dev
  config:
    import:
      - nacos:common.yml?group=order
      - nacos:database.yml?group=order

4.3测试数据隔离

添加dburl

public class OrderProperties {
    private String orderTimeout;
    private String orderAutoConfirm;
    private String dburl;

}

完善OrderController

完善config方法

public String config(){
    return "order.timeout:" + orderProperties.getOrderTimeout() + "order.auto-confirm:" +
            orderProperties.getOrderAutoConfirm()+"order.dburl:" + orderProperties.getDburl();
}

运行OrderMainApplication启动类,可以看到成功监听了[Nacos Config] Listening config: dataId=common.yml, group=order和[Nacos Config] Listening config: dataId=database.yml, group=order

通过浏览器访问localhost: 8000/config,也成功获取了配置集

5.动态切换环境

5.1修改application.yml配置文件

server:
  port: 8000
  # 动态激活环境
spring:
  profiles:
    active: test
  application:
    name: service-order

  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      config:
        #  命名空间
        namespace: test
logging:
  level:
    com.alibaba.nacos.client.config: DEBUG
    org.springframework.cloud.bootstrap: DEBUG

#  开发环境
---
spring:
  config:
    import:
      - nacos:common.yml?group=order
      - nacos:database.yml?group=order
    activate:
      on-profile: dev

#  测试环境
---
spring:
  config:
    import:
      - nacos:common.yml?group=order
      - nacos:database.yml?group=order
    activate:
      on-profile: test

#  生产环境
---
spring:
  config:
    import:
      - nacos:common.yml?group=order
      - nacos:database.yml?group=order
    activate:
      on-profile: prod

运行启动类,可以看到此时环境已然切换到了test测试环境

访问localhost:8000/nacos,可以看到此时获取的数据也均为测试环境的配置集

若需要切换不同的环境只需修改配置文件中的active和namespace即可实现动态环境切换。

6.总结

1. 引入 spring-cloud-starter-alibaba-nacos config 依赖,配置Nacos地址

2. 添加 数据集(data-id),使用 spring.config.import 导入数据集

3. @Value + @RefreshScope 取值 + 自动刷新

4. @ConfigurationProperties批量绑定自动刷新

5. NacosConfigManager 监听配置变化 扩展: 配置优先级;namespace区分环境、group区分 微服务、data-id区分配置 实现 数据隔离+环境切换

更多推荐