【从0到1实现一个网关】整合Nacos-配置拉取与配置变更信息丁订阅

本文结束之后的效果演示 效果演示链接

编写配置中心接口

在上文中,我们已经大致完成了注册中心的服务注册功能,在这篇文章我们来实现配置中心的配置拉取以及配置变更监听功能。 依旧是首先需要定义一个配置中心接口来初始化配置中心配置以及配置中心信息变更监听事件。

java 复制代码
public interface ConfigCenter {

    /**
     * 初始化配置中心配置
     * @param serverAddr  配置中心地址
     * @param env 环境
     */
    void init(String serverAddr, String env);


    /**
     * 订阅配置中心配置变更
     * @param listener  配置变更监听器
     */
    void subscribeRulesChange(RulesChangeListener listener);
}
c 复制代码
public interface RulesChangeListener {

    /**
     * 规则变更时调用此方法 对规则进行更新
     * @param rules 新规则
     */
    void onRulesChange(List<Rule> rules);
}

配置拉取实现

完成了简单的接口定义,开始思考如何实现具体的配置拉取。 我们依旧需要先引入Nacos的client。

c 复制代码
     <!--引入Nacos的客户端依赖-->
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>2.0.4</version>
        </dependency>

之后,nacos已经为我们提供了configService,这个类能帮助我们快速的拉取Nacos的配置。使用方式如下:

c 复制代码
    private static final String DATA_ID = "api-gateway";


    /**
     * 服务端地址
     */
    private String serverAddr;

    /**
     * 环境
     */
    private String env;

    /**
     * Nacos提供的与配置中心进行交互的接口
     */
    private ConfigService configService;

    @Override
    public void init(String serverAddr, String env) {
        this.serverAddr = serverAddr;
        this.env = env;

        try {
            this.configService = NacosFactory.createConfigService(serverAddr);
        } catch (NacosException e) {
            throw new RuntimeException(e);
        }
    }

上面就已经完成了对配置中心的初始化,那么我们就可以使用配置中心提供的方法来拉取我们的配置了

c 复制代码
   //初始化通知 DATA_ID是自己定义的 返回值就是一个json
            String configJson = configService.getConfig(DATA_ID, env, 5000);
            //configJson : {"rules":[{}, {}]}
            log.info("config from nacos: {}", configJson);
            List<Rule> rules = JSON.parseObject(configJson).getJSONArray("rules").toJavaList(Rule.class);
            

这里可以按照你自己喜欢的方式来解析你的配置。

配置变更事件订阅

还是老样子,我们也需要对配置变更事件进行订阅。方法如下:

c 复制代码
 @Override
    public void subscribeRulesChange(RulesChangeListener listener) {
        try {
            //初始化通知 DATA_ID是自己定义的 返回值就是一个json
            String configJson = configService.getConfig(DATA_ID, env, 5000);
            //configJson : {"rules":[{}, {}]}
            log.info("config from nacos: {}", configJson);
            List<Rule> rules = JSON.parseObject(configJson).getJSONArray("rules").toJavaList(Rule.class);
            //调用我们的监听器 参数就是我们拿到的rules
            listener.onRulesChange(rules);

            //监听变化
            configService.addListener(DATA_ID, env, new Listener() {
                //是否使用额外线程执行
                @Override
                public Executor getExecutor() {
                    return null;
                }
                //这里的用法我在那片线程池动态调参的时候写到过,有兴趣可以查看博客
                @Override
                public void receiveConfigInfo(String configInfo) {
                    log.info("config from nacos: {}", configInfo);
                    List<Rule> rules = JSON.parseObject(configInfo).getJSONArray("rules").toJavaList(Rule.class);
                    listener.onRulesChange(rules);
                }
            });

        } catch (NacosException e) {
            throw new RuntimeException(e);
        }
    }

比较重点的是这一行代码

c 复制代码
 //监听变化
            configService.addListener(DATA_ID, env, new Listener() 

他会帮助我们向Nacos的监听器列表中添加一个我们的监听器,当Nacos的配置发生变更之后,我们就可以监听到这个事件,然后执行我们所希望的处理逻辑。

到此,整合Nacos的部分就已经简单的完成了。 这个模块的完成需要对Nacos的源码以及接口有较深理解,因此推荐先学习完毕Nacos之后再来阅读这系列文章。

相关推荐
哔哩哔哩技术1 小时前
资源合池化后的异构差异问题解析--CPU分层现象和解决思路
后端
爱上语文1 小时前
Redis基础(4):Set类型和SortedSet类型
java·数据库·redis·后端
深栈解码2 小时前
JMM深度解析(三) volatile实现机制详解
java·后端
张家宝68372 小时前
ambari
后端
StephenCurryFans2 小时前
Spring AI vs LangChain4j:Java AI开发框架完整对比指南 🚀
后端·spring
程序员辉哥2 小时前
学会在Cursor中使用Rules生成代码后可以躺平了吗?
前端·后端
Brookty2 小时前
【MySQL】JDBC编程
java·数据库·后端·学习·mysql·jdbc
_代号0072 小时前
MySQL梳理一:整体架构概览
后端·mysql
前端付豪3 小时前
11、打造自己的 CLI 工具:从命令行到桌面效率神器
后端·python
前端付豪3 小时前
12、用类写出更可控、更易扩展的爬虫框架🕷
后端·python