nacos的使用(借鉴淘宝Diamond配置中心)

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;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值