菜单
本页目录

配置中心的作用

基本用法

自动刷新配置

demo如下

spring.application.name=service-order
server.port=8000
spring.cloud.nacos.server-addr=127.0.0.1:8848
spring.config.import=nacos:service-order.properties

nacos冒号后面跟的实际上就是配置的Data Id 通过控制类demo测试

@RefreshScope//自动刷新
@RestController
public class OrderController {
    @Value("${order.timeout}")
    String timeout;
    @Value("${order.auto-confirm}")
    String autoConfirm;
    @GetMapping("/config")
    public String config() {
        return timeout+","+autoConfirm;
    }
}

访问controller即可,若想配置中心发生变化配置也跟着变化,则需要使用@RefreshScope注解 添加了配置中心的依赖,若没有引入nacos配置,则无法启动,在配置文件中加入以下即可

spring.cloud.nacos.config.import-check.enabled=false

若配置中心配置多,那么书写繁琐。

因此可以使用springboot的批量绑定,使用@ConfigurationProperties并指定前缀,配置批量绑定在nacos下,可以无需@RefreshScope就能实现自动刷新,需要将配置类注册为spring的一个bean才能生效,nacos中的-号则对应驼峰命名法,如autoConfirm即auto-confirm 首先将配置封装为一个类;

package com.atguigu.order.properties;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "order") //配置批量绑定在nacos下,可以无需@RefreshScope就能实现自动刷新
@Data
public class OrderProperties {
    String timeout;
    String autoConfirm;
}

修改demo

 @Autowired
    OrderProperties orderProperties;

    @Autowired
    OrderService orderService;
    @GetMapping("/config")
    public String config() {
        return orderProperties.getTimeout()+","+orderProperties.getAutoConfirm();
    }

仍然正常配置

监听配置变化

NacosConfigManager 监听配置变化

package com.atguigu.order;

import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

@EnableDiscoveryClient
@SpringBootApplication
public class OrderMainApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderMainApplication.class, args);
    }
    //1、项目启动就监听配置文件变化
    //2、发生变化后拿到变化值
    //3、发送邮件
    @Bean
    ApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager){
        return  args -> {
            ConfigService configService = nacosConfigManager.getConfigService();
            configService.addListener("service-order.properties",
                    "DEFAULT_GROUP", new Listener() {
                        @Override
                        public Executor getExecutor() {
                            return Executors.newFixedThreadPool(4);
                        }

                        @Override
                        public void receiveConfigInfo(String configInfo) {
                            System.out.println("变化的配置信息:"+configInfo);
                            System.out.println("邮件通知...");
                        }
                    });
            System.out.println("=========");
        };
    }
}

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

==Nacos数据集生效== springboot可以导入多个nacos数据集,以逗号分隔即可,若这些数据集也冲突,则谁先导入谁生效

数据隔离

区分环境

nacos配置中心通过namespace区分环境,通过分组区分微服务,通过数据集区分配置文件 默认的命名空间是public nacos提供了克隆选项可以快速克隆配置到其他命名空间

激活环境

配置多的情况下,使用yml比较合适

server:
  port: 8000

spring:
  application:
    name: service-order
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      config:
        # 激活的命名空间
        namespace: dev
  config:
    import:
#      导入指定组的数据集
      - nacos:common.properties?group=order
      - nacos:database.properties?group=order

同时可以针对不同的命名空间选择导入不同的数据集

server:
  port: 8000
spring:
  profiles:
#    激活的命名空间
    active: prod
  application:
    name: service-order
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      config:
        #禁用导入检查
        import-check:
          enabled: false
        # 读取spring.profiles.active的值,默认则为public,可以设置为其它
        namespace: ${spring.profiles.active:public}
# 当激活namespace为dev时导入的数据集
---
spring:
  config:
    import:
      - nacos:common.properties?group=order
      - nacos:database.properties?group=order
    activate:
      on-profile: dev
# 当激活namespace为test时导入的数据集
---
spring:
  config:
    import:
      - nacos:common.properties?group=order
      - nacos:database.properties?group=order
      - nacos:haha.properties?group=order
    activate:
      on-profile: test
# 当激活namespace为prod时导入的数据集,不存在的数据集不会导入
---
spring:
  config:
    import:
      - nacos:common.properties?group=order
      - nacos:database.properties?group=order
      - nacos:hehe.properties?group=order
    activate:
      on-profile: prod