nacos常见的使用方法无非就是将获取到的配置文件放入propertise文件中,再从propertise中获取内容。 如果配置过多,每增加一个nacos配置就得加一个propertise文件,文件多了,不便于维护。
像一些需要经常改动的配置,在一个项目中可能有很多个,都用propertise接收有点不现实。
特此使用配置类来接收nacos中的配置比较合适,一个nacos配置对应一个配置类
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.0.1</version>
</dependency>
获取nacos配置中的某条数据
package com.alibaba.nacos;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author wangchen
* @date 2021/08/21 20:23
*/
@RestController
@RequestMapping("/nacos")
public class NacosController {
@Resource
private InformationConfig information;
@GetMapping("/a")
public String getValue(){
String name = information.getName();
System.out.println(name);
return name;
}
}
一个nacos的配置对应一个配置类
package com.alibaba.nacos;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author wangchen
* @date 2021/08/21 16:58
*/
@NacosListener(dataId = "hr-direct")
@Data
public class InformationConfig implements NacosDataCallback {
private static User user;
@Override
public void received(String data) {
user = JSONObject.parseObject(data, User.class);
System.out.println(user.toString());
}
public String getName() {
return user.getName();
}
@Data
private static class User {
private String name;
private String age;
private List<String> cars;
}
}
配置类需实现的接口,在后面监听nacos事件时用到
package com.alibaba.nacos;
/**
* 自定义注解用于标记 nacos
*
* @author wangchen
* @date 2021/08/21 17:55
*/
public interface NacosDataCallback {
/**
* 回调执行函数
* @param data 获取的最新数据
*/
void received(String data);
}
配置类上添加的注解,用于标识nacos信息
package com.alibaba.nacos;
import org.springframework.stereotype.Component;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author wangchen
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface NacosListener {
String dataId();
String groupId() default "DEFAULT_GROUP";
String executor() default "";
boolean executeAfterInit() default false;
}
用于监听nacos的改变事件
package com.alibaba.nacos;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.Executor;
/**
* 所有注入完成后执行一次
*
* @author wangchen
* @date 2021/08/22 12:11
*/
@Component
@Slf4j
public class NacosReceive implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private List<NacosDataCallback> nacosDataCallbackList;
@Autowired
private ConfigService configService;
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
if (contextRefreshedEvent.getApplicationContext().getParent() == null) {
for (NacosDataCallback callback : nacosDataCallbackList) {
Class<? extends NacosDataCallback> clazz = callback.getClass();
// 获取类上标注的注解
NacosListener nacosListener = clazz.getAnnotation(NacosListener.class);
String dataId = nacosListener.dataId();
String groupId = nacosListener.groupId();
try {
// 初始化时运行一次
String config = configService.getConfig(dataId, groupId, 5000);
log.info(config);
callback.received(config);
// 配置发生变化时运行
configService.addListener(dataId, groupId, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
log.info(config);
callback.received(configInfo);
}
@Override
public Executor getExecutor() {
return null;
}
});
} catch (NacosException e) {
e.printStackTrace();
}
}
}
}
}
nacos初始化
package com.alibaba.nacos;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
/**
* 初始化 nacos 连接
*
* @author wangchen
* @date 2021/08/21 17:34
*/
@Configuration
public class NacosConfig {
@Value("${serverAddr}")
private String serverAddr;
@Bean
public ConfigService configService() {
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
ConfigService configService = null;
try {
configService = NacosFactory.createConfigService(properties);
} catch (NacosException e) {
e.printStackTrace();
}
return configService;
}
}