Nacos-配置中心

配置中心-基本使用

  1. 启动Nacos
    进入Nacos安装目录中的bin
    启动命令: startup.cmd -m standalone
  2. 引入依赖
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
  1. application.properties配置
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
  1. 创建data-id(数据集)
    在这里插入图片描述

在这里插入图片描述
5. 测试

package com.nie.order.controller;

import com.nie.order.bean.Order;
import com.nie.order.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class 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;
    }
}

在这里插入图片描述
这时候我们修改之后我们他并没有更改值
在这里插入图片描述
在这里插入图片描述
我们需要加入@RefreshScope激活配置属性的自动刷新
在这里插入图片描述
这时候我们就不用重启项目就能拿到最新修改的值

提示:假如我们的微服务暂时用不到配置中心,但是我们统一加入了配置中心的依赖,导致了项目启动不起来,我们应该在application.properties中加入

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

加入之后就可以正常启动了 这句话的意思是禁用导入检查

动态刷新

如果我们有很多经常使用的值 我们可以将他抽取到一个类中

package com.nie.order.properties;


import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
//这时候不需要@RefreshScope就可以完成自动刷新
@ConfigurationProperties(prefix = "order")
@Data
public class OrderProperties {
    String timeout;
    String autoConfirm;
}

package com.nie.order.controller;

import com.nie.order.bean.Order;
import com.nie.order.properties.OrderProperties;
import com.nie.order.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {
    
    @Autowired
    private OrderProperties orderProperties;

    @GetMapping("/config")
    public String config(){
        return "order.timeout = " + orderProperties.getTimeout()
                + ", order.auto-confirm = " + orderProperties.getAutoConfirm();
    }

    @GetMapping("/create")
    public Order createOrder(@RequestParam("userId") Long userId,
                             @RequestParam("productId") Long productId){
        Order order = orderService.createOrder(productId,userId);
        return order;
    }
}

在这里插入图片描述

在这里插入图片描述

配置监听

package com.nie.order;

import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.cloud.nacos.annotation.NacosConfig;
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 org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

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

@SpringBootApplication
@EnableDiscoveryClient
public class OrderMainApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderMainApplication.class,args);

    }

    @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("=======");
        };
    }

}

运行后 当我们修改里面的元素时
在这里插入图片描述
收到了所有变换的值
在这里插入图片描述

配置优先级

先导入优先,外部优先

数据隔离

  • 区分多套环境
    用命名空间来区分多套环境
    在这里插入图片描述

  • 区分多种微服务
    用group来区分多种微服务
    在这里插入图片描述

  • 区分多种配置
    用 data-id来区分多种配置
    在这里插入图片描述

  • 按需加载配置
    动态选择指定的名称空间
    配置application.yml

server:
  port: 8000
spring:
  profiles:
#    选择那一套
    active: dev
  application:
    name: service-order

  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      config:
        namespace: ${spring.profiles.active:dev}
        import-check:
          enabled: false

---
spring:
  config:
    import:
      - nacos:common.properties?group=order
      - nacos:database.properties?group=order
    activate:
      on-profile: dev

---
spring:
  config:
    import:
      - nacos:common.properties?group=order
    activate:
      on-profile: test
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐