spring cloud脚手架项目(八)nacos动态配置中心接入以及json配置
前言上一篇我接入了rocketmq和redis,本次要接入的中间件是阿里的nacos,用于当做配置中心。关于nacos的安装可以参考我之前写过的docker 安装naocos的文件介绍nacos是阿里用于spring cloud体系下的一个突破吧,可以用作注册发现和配置中心,支持自动刷新配置,我个人更加喜欢他的自动刷新配置功能,比spring cloud 的config和bus的动态配置有更多用法
前言
上一篇我接入了rocketmq和redis,本次要接入的中间件是阿里的nacos,用于当做配置中心。关于nacos的安装可以参考我之前写过的docker 安装naocos的文件
介绍
nacos是阿里用于spring cloud体系下的一个突破吧,可以用作注册发现和配置中心,支持自动刷新配置,我个人更加喜欢他的自动刷新配置功能,比spring cloud 的config和bus的动态配置有更多用法。常见用法就是用于动态刷新配置。
举例:有一个项目由一个新功能上线。我也不确定这个功能是否好用,我需要及时停止或者关闭,那么动态配置就很好用了,我可以在接口代码第一行就判断开关是否打开或者关闭,开启那接口可用,关闭那接口不可用。甚至可以根据时间动态规划,在每天的8点到20点开启。这个时间也是可控的。
代码
maven
<!-- nacos配置中心 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.4</version>
</dependency>
yml
nacos:
config:
#nacos地址
server-addr: 129.211.71.185:8848
#命名空间
namespace: fe45054d-001d-4317-bb77-abae5a44b1f0
#配置文件类型,目前只支持yaml,yml,properties,目前不需要了
file-extension: yml
#默认提供者,目前不需要了
prefix: SERVICE-A
动态配置
import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import java.util.concurrent.Executor;
/**
* 抽象nacos 监听
*
*/
public abstract class AbstractConfigInfo<T> implements InitializingBean, Listener {
protected final Logger logger = LoggerFactory.getLogger(getClass());
protected final String clazzSimpleName = getClass().getSimpleName();
@NacosInjected
private ConfigService configService;
protected T data;
public T getData() {
return data;
}
/**
* 返回null,使用默认的executor
*
* @return
*/
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
logger.info("{}#receiveConfigInfo receive configInfo. configInfo={}", clazzSimpleName, configInfo);
compile(configInfo);
}
@Override
public void afterPropertiesSet() throws RuntimeException {
try {
String configInfo = configService.getConfig(getDataId(), getGroupId(), getTimeout());
logger.info("{}#afterPropertiesSet init configInfo. configInfo={}", clazzSimpleName, configInfo);
compile(configInfo);
configService.addListener(getDataId(), getGroupId(), this);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 获取nacos dataId
*
* @return nacos dataId
*/
protected abstract String getDataId();
/**
* 获取nacos groupId
* <p>默认NacosConstant.GROUP_ID</p>
*
* @return nacos groupId
*/
protected String getGroupId() {
return "DEFAULT_GROUP";
}
/**
* 获取nacos 超时时间
* <p>默认NacosConstant.TIMEOUT</p>
*
* @return nacos 超时时间
*/
protected long getTimeout() {
return 3000L;
}
/**
* 将输入转为数据
*
* @param dataStr
*/
protected abstract void compile(String dataStr);
}
configinfo
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
*
*/
@Component
@Slf4j
public class ChenConfigInfo extends AbstractConfigInfo<ChenNacos> {
@Override
protected String getDataId() {
return "chen_nacos";
}
@Override
protected void compile(String dataStr) {
data = JSON.parseObject(dataStr, ChenNacos.class);
}
}
具体的配置类
import java.io.Serializable;
public class ChenNacos implements Serializable {
private static final long serialVersionUID = 1784978231968531666L;
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
使用方法
提前在naocs创建好配置,注意这个命名空间,通过命名空间我们可以区分各种环境的配置
方法一,简单配置使用
@Slf4j
@RestController
#dataId和groupId就是我图片中创建的配置文件
@NacosPropertySource(dataId = "CHEN_COMMON_CONFIG2" ,groupId = "DEFAULT_GROUP2", autoRefreshed = true)
public class CommonServiceImpl implements CommonService {
//@NacosValue(value = "${hi:111}",autoRefreshed = true)
//也可以基于注解,当nacos失效的时候会设置默认值
@NacosValue(value = "${hi}",autoRefreshed = true)
private String hello;
@Override
public Result<String> test5(String a) {
return Result.success(hello);
}
}
这样每次请求都可以获得hi这个值了
方法二,配置json使用
@Slf4j
@RestController
public class CommonServiceImpl implements CommonService {
@Resource
ChenConfigInfo chenConfigInfo;
@Override
public Result<String> test6(String a) {
return Result.success(chenConfigInfo.getData().getAge());
}
}
在之前的我的上面的代码中可以看到在getGroupId和getGroupId的时候已经填好了对应的配置地址,这样每次当有变化的时候会动态刷新,也可以用更加灵活的配置文件进行修改。可以直接对json文件做修改,修改的参数也会对应的展示出来,动态刷新,变化
结尾
这样我们的naocs配置中心也接入可以使用了
github地址:https://github.com/alex9567/SpringCloudScaffold
更多推荐
所有评论(0)