Nacos | 三种方式的配置中心,整合Springboot3.x + yaml文件完成 0错误 自动刷新(亲测无误)

发布于:2025-05-30 ⋅ 阅读:(20) ⋅ 点赞:(0)

目录

@Value+@RefreshScope

导入配置依赖

启动类 添加 @EnableDiscoveryClient

控制器

编写 yaml 文件

创建 Nacos Data Id

项目启动问题

 测试

@ConfigurationProperties 无感自动刷新

 导入配置依赖

启动类 添加 @EnableDiscoveryClient

控制器

Nacos DataID 模板映射

编写 yaml 文件

创建 Nacos Data Id

测试

NacosConfigManager

配置监听

启动类配置



@Value+@RefreshScope

导入配置依赖

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

启动类 添加 @EnableDiscoveryClient

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

// 开启服务发现
@EnableDiscoveryClient
@SpringBootApplication
public class UserMainApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserMainApplication.class, args);
    }
}

控制器

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
// 添加 @RefreshScope 注解,使得配置能够自动刷新
@RefreshScope
public class UserController {


    // 读取配置
    @Value("${users.timeout}")
    String usersTimeout;

    @Value("${users.auto-confirm}")
    String usersAutoConfirm;

    @GetMapping("/config")
    public String config() {
        return "users.timeout=" + usersTimeout + ",users.auto-confirm=" + usersAutoConfirm;
    }

}

编写 yaml 文件


server:
  port: 8000
spring:
  # 这里是要导入的 Nacos DataId 的配置文件名称
  config:
    import:
      - nacos:service-users.yaml
  # 配置应用名称
  application:
    name: service-users
  # 配置注册中心地址与配置的IP
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        

创建 Nacos Data Id

users: 
    timeout: 30min
    auto-confirm: 7d

项目启动问题

解决方法是添加一个import-check


server:
  port: 8000
spring:
  # 这里是要导入的 Nacos DataId 的配置文件名称
  config:
    import:
      - nacos:service-users.yaml
  # 配置应用名称
  application:
    name: service-users
  # 配置注册中心地址与配置的IP
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
          # 这里添加一个就行了
          import-check:
             enabled: false

 测试

http://localhost:8000/config

@ConfigurationProperties 无感自动刷新

 导入配置依赖

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

启动类 添加 @EnableDiscoveryClient

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

// 开启服务发现
@EnableDiscoveryClient
@SpringBootApplication
public class UserMainApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserMainApplication.class, args);
    }
}

控制器

import com.jkglxt.users.yaml.Users;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {


    private UserServiceImpl userService;
    private Users users;

    @Autowired
    public UserController(UserServiceImpl userService, Users users) {
        this.userService = userService;
        this.users = users;
    }


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

Nacos DataID 模板映射

创建 yaml.Users类

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

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Component // 这里必须使用@Component注解,否则无法自动装配
@ConfigurationProperties(prefix = "users") // 配置批量绑定,这里的 users 则是Date ID 的前缀
public class Users {

    // 读取配置
    String timeout;

    String autoConfirm;

}

编写 yaml 文件


server:
  port: 8000
spring:
  # 这里是要导入的 Nacos DataId 的配置文件名称
  config:
    import:
      - nacos:service-users.yaml
  # 配置应用名称
  application:
    name: service-users
  # 配置注册中心地址与配置的IP
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        

创建 Nacos Data Id

测试

http://localhost:8000/config

NacosConfigManager

配置监听

启动类配置

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 UserMainApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserMainApplication.class, args);
    }

    // 监听Nacos的配置变化
    @Bean
    ApplicationRunner applicationListener(NacosConfigManager nacosConfigManager) {
        return args -> {
            ConfigService configService = nacosConfigManager.getConfigService();
            configService.addListener("service-users.yaml",
                    "DEFAULT_GROUP", new Listener() {
                        @Override
                        public Executor getExecutor() {
                            return Executors.newFixedThreadPool(4);
                        }

                        @Override
                        public void receiveConfigInfo(String configInfo) {
                            System.out.println("Nacos配置变化:" + configInfo);
                        }
                    });
            System.out.println("Nacos配置变化监听");
        };
    };

}
Nacos配置变化监听
2025-05-30T00:38:41.476+08:00  INFO 30312 --- [service-users] [           main] c.a.c.n.refresh.NacosContextRefresher    : [Nacos Config] Listening config: dataId=service-users.yaml, group=DEFAULT_GROUP
2025-05-30T00:38:51.491+08:00  INFO 30312 --- [service-users] [listener.task-0] c.a.c.n.refresh.NacosContextRefresher    : [Nacos Config] Receive Nacos config change: dataId=service-users.yaml, group=DEFAULT_GROUP
Nacos配置变化:users: 
    timeout: 300min
    auto-confirm: 70d
2025-05-30T00:38:51.535+08:00  INFO 30312 --- [service-users] [listener.task-0] c.a.c.n.c.NacosConfigDataLoader          : [Nacos Config] Load config[dataId=service-users.yaml, group=DEFAULT_GROUP] success
2025-05-30T00:38:51.685+08:00  INFO 30312 --- [service-users] [listener.task-0] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [users.auto-confirm, users.timeout]
2025-05-30T00:39:00.870+08:00  INFO 30312 --- [service-users] [listener.task-0] c.a.c.n.refresh.NacosContextRefresher    : [Nacos Config] Receive Nacos config change: dataId=service-users.yaml, group=DEFAULT_GROUP
Nacos配置变化:users: 
    timeout: 30min
    auto-confirm: 7d
2025-05-30T00:39:00.911+08:00  INFO 30312 --- [service-users] [listener.task-0] c.a.c.n.c.NacosConfigDataLoader          : [Nacos Config] Load config[dataId=service-users.yaml, group=DEFAULT_GROUP] success
2025-05-30T00:39:01.048+08:00  INFO 30312 --- [service-users] [listener.task-0] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [users.auto-confirm, users.timeout]


-- Thank you --


网站公告

今日签到

点亮在社区的每一天
去签到