目录
@ConfigurationProperties 无感自动刷新
@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
测试
@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
测试
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 --