Skip to content

Commit

Permalink
增加属性和配置文件的自动刷新
Browse files Browse the repository at this point in the history
  • Loading branch information
YClimb committed Sep 30, 2020
1 parent 1e31876 commit fa4a87c
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package com.example.demo;

import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.listener.AbstractListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.IOException;
import java.io.StringReader;
import java.util.Properties;

/**
* 自定义
*
* https://start.aliyun.com/article/sca7lesson/outconfig
*
* @author yclimb
* @date 2020/9/30
*/
@RestController
@RefreshScope
@EnableConfigurationProperties(User.class)
public class CustomController {

@Value("${user.name}")
private String userName;

@Value("${user.age}")
private int userAge;

/**
* 5.2 使用 Nacos Config 实现 @ConfigurationPropertiesBean 属性动态刷新
*/
@Autowired
private User user;

/**
* 5.3 使用 Nacos Config 监听实现 Bean 属性动态刷新
*/
@Autowired
private NacosConfigManager nacosConfigManager;

@Bean
public ApplicationRunner runner() {
return args -> {
String dataId = "nacos-config-sample.properties";
String group = "DEFAULT_GROUP";
nacosConfigManager.getConfigService().addListener(dataId, group, new AbstractListener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("[Listener] " + configInfo);
System.out.println("[Before User] " + user);

Properties properties = new Properties();
try {
properties.load(new StringReader(configInfo));
String name = properties.getProperty("user.name");
int age = Integer.parseInt(properties.getProperty("user.age"));
user.setName(name);
user.setAge(age);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("[After User] " + user);
}
});
};
}

@PostConstruct
public void init() {
System.out.printf("[init] user name : %s , age : %d%n", userName, userAge);
}

@PreDestroy
public void destroy() {
System.out.printf("[destroy] user name : %s , age : %d%n", userName, userAge);
}

@RequestMapping("/user")
public String user() {
//return String.format("[HTTP] user name : %s , age : %d", userName, userAge);
return "[HTTP] " + user;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
* @author yclimb
*/
@SpringBootApplication
public class NacosConfigSampleApplication {

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

}
55 changes: 55 additions & 0 deletions nacos-config-sample/src/main/java/com/example/demo/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.example.demo;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;

/**
* user properties
*
* @author yclimb
* @date 2020/9/30
*/
@RefreshScope
@ConfigurationProperties(prefix = "user")
public class User implements InitializingBean, DisposableBean {

private String name;

private int age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}

@Override
public void destroy() throws Exception {
System.out.println("[destroy()] " + toString());
}

@Override
public void afterPropertiesSet() throws Exception {
System.out.println("[afterPropertiesSet()] " + toString());
}
}
2 changes: 2 additions & 0 deletions nacos-config-sample/src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ server.port=8080
# spring 静态资源扫描路径
spring.resources.static_locations=classpath:/static/

# 解决一直打印日志
#logging.level.com.alibaba.nacos.client=error

9 changes: 7 additions & 2 deletions nacos-config-sample/src/main/resources/bootstrap.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 设置配置中心服务端地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# Nacos 配置中心的namespace,默认为 public
spring.cloud.nacos.config.namespace=public
# Nacos 配置中心的namespace,默认为 public,使用的是ID,不是空间名称
# 如果默认使用 public 空间,可能会导致无限刷 ClientWorker 日志(https://github.com/alibaba/nacos/issues/2684)
spring.cloud.nacos.config.namespace=yclimb
# 配置项对应的文件扩展名,目前支持 properties 和 yaml(yml)
#spring.cloud.nacos.config.file-extension=properties
# 配置对应的组,默认 DEFAULT_GROUP
#spring.cloud.nacos.config.group=DEFAULT_GROUP

0 comments on commit fa4a87c

Please sign in to comment.