【从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之后再来阅读这系列文章。

相关推荐
Cosolar7 分钟前
大模型应用开发面试 • 第4期|A2A、复杂挑战与具身智能
人工智能·后端·面试
迷渡35 分钟前
聊一聊 Bun 用 Rust 重写这件事
开发语言·后端·rust
王中阳Go38 分钟前
秒杀、分库分表、全链路追踪:一个电商微服务的架构全拆解
后端·go
正儿八经的少年1 小时前
Spring Boot 两种激活配置方式的作用与区别
java·spring boot·后端
回家路上绕了弯1 小时前
AgentScope Java实战博客:从入门到落地,解锁智能代理开发新范式
后端
疯狂成瘾者1 小时前
Spring Boot 项目中的 SMTP 邮件验证码服务技术解析
java·spring boot·后端
阿苟1 小时前
消息队列重点详解
后端·面试
RustCoder1 小时前
MangoFetch:一个用 Rust 写的 CLI/TUI 高性能的下载工具
后端·rust·开源
程序员清风2 小时前
AI开发岗该如何准备面试?
java·后端·面试
折哥的程序人生 · 物流技术专研2 小时前
《Java 100 天进阶之路》第20篇:Java初始化、构造器、对象创建的过程
java·开发语言·后端·面试