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

相关推荐
Marst Code几秒前
(Django)初步使用
后端·python·django
代码之光_19807 分钟前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端
编程老船长20 分钟前
第26章 Java操作Mongodb实现数据持久化
数据库·后端·mongodb
IT果果日记41 分钟前
DataX+Crontab实现多任务顺序定时同步
后端
姜学迁2 小时前
Rust-枚举
开发语言·后端·rust
爱学习的小健2 小时前
MQTT--Java整合EMQX
后端
北极小狐3 小时前
Java vs JavaScript:类型系统的艺术 - 从 Object 到 any,从静态到动态
后端
【D'accumulation】3 小时前
令牌主动失效机制范例(利用redis)注释分析
java·spring boot·redis·后端
2401_854391083 小时前
高效开发:SpringBoot网上租赁系统实现细节
java·spring boot·后端
Cikiss3 小时前
微服务实战——SpringCache 整合 Redis
java·redis·后端·微服务