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

相关推荐
一只叫煤球的猫2 分钟前
普通程序员,从开发到管理岗,为什么我越升职越痛苦?
前端·后端·全栈
一只鹿鹿鹿7 分钟前
信息化项目验收,软件工程评审和检查表单
大数据·人工智能·后端·智慧城市·软件工程
专注VB编程开发20年36 分钟前
开机自动后台运行,在Windows服务中托管ASP.NET Core
windows·后端·asp.net
程序员岳焱37 分钟前
Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
后端·mysql·性能优化
一只叫煤球的猫1 小时前
手撕@Transactional!别再问事务为什么失效了!Spring-tx源码全面解析!
后端·spring·面试
旷世奇才李先生1 小时前
Ruby 安装使用教程
开发语言·后端·ruby
沃夫上校4 小时前
Feign调Post接口异常:Incomplete output stream
java·后端·微服务
LeeGe4 小时前
SpringAOP中@within和@annotation以及 @within和@target的区别
后端
一个平平无奇的Java小学生4 小时前
Spring Cloud Alibaba 微服务从入门到生产部署完整指南
后端
一个平平无奇的Java小学生4 小时前
Spring Cloud Alibaba 微服务实战指南
后端