spring cloud脚手架项目(八)nacos动态配置中心接入以及json配置

前言

上一篇我接入了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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Cloud Nacos作为配置中心的优势在于它具备统一管理、动态刷新和分布式配置的能力。下面是使用Spring Cloud Nacos作为配置中心的基本步骤: 1. 添加依赖:在项目的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> ``` 2. 配置Nacos服务地址:在项目配置文件(application.yml或application.properties)中添加以下配置: ```yaml spring: cloud: nacos: config: server-addr: ${nacos.server-addr} ``` 其中`${nacos.server-addr}`是Nacos服务的地址,如`localhost:8848`。 3. 创建配置文件:在Nacos控制台创建配置文件,例如创建一个名为`example.properties`的配置文件,并添加一些配置项。 4. 使用配置:在Spring Boot应用程序中,通过使用`@Value`注解来注入配置项,例如: ```java @Value("${example.property}") private String exampleProperty; ``` 这样,`exampleProperty`变量将被自动注入为配置文件中`example.property`对应的值。 5. 动态刷新:当配置发生变化时,可以通过添加`@RefreshScope`注解来实现动态刷新,例如: ```java @RefreshScope @RestController public class ExampleController { // ... } ``` 这样,当配置发生变化时,注入的配置项将自动更新。 以上是使用Spring Cloud Nacos作为配置中心的基本步骤,希望能帮到你!如有更多问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值