【Nacos源码之配置管理 七】增删改配置数据之后如何通知集群中的其他机器

本文详细介绍了Nacos中配置管理的实现,包括新增配置数据的流程,ConfigController.publishConfig方法,AsyncNotifyService的异步通知服务,以及数据变更通知的整个过程。在配置数据发生变化时,Nacos会通过异步任务AsyncTask通知所有集群节点,更新本地磁盘文件和缓存,并通过DataChangeTask任务通知订阅者。文章最后提出了几个后续将探讨的问题,如客户端订阅机制等。
摘要由CSDN通过智能技术生成

在后台管理界面可以直接增删改查所有的配置数据,那么问题来了

增删改数据这个操作,除了落库,还做了哪些操作?

新增配置数据


打开后台新建一个配置640?wx_fmt=png

  1. 如果是新增先访问Http请求ConfigController.getConfig()检验dataId,group等等是否已经存在,已经存在提示不让新增

  2. 不存在可以新增,则访问 ConfigController.publishConfig方法发布配置数据;

ConfigController.publishConfig 发布数据

    /**	
     * 增加或更新非聚合数据。	
     *	
     * @throws NacosException	
     */	
    @RequestMapping(method = RequestMethod.POST)	
    @ResponseBody	
    public Boolean publishConfig(HttpServletRequest request, HttpServletResponse response)	
        throws NacosException {	
        //部分省略....	
        if (AggrWhitelist.isAggrDataId(dataId)) {	
            log.warn("[aggr-conflict] {} attemp to publish single data, {}, {}",	
                RequestUtil.getRemoteIp(request), dataId, group);	
            throw new NacosException(NacosException.NO_RIGHT, "dataId:" + dataId + " is aggr");	
        }	
        final Timestamp time = TimeUtils.getCurrentTime();	
        String betaIps = request.getHeader("betaIps");	
        ConfigInfo configInfo = new ConfigInfo(dataId, group, tenant, appName, content);	
        if (StringUtils.isBlank(betaIps)) {	
            if (StringUtils.isBlank(tag)) {	
                persistService.insertOrUpdate(srcIp, srcUser, configInfo, time, configAdvanceInfo, false);	
                EventDispatcher.fireEvent(new ConfigDataChangeEvent(false, dataId, group, tenant, time.getTime()));	
            } else {	
                persistService.insertOrUpdateTag(configInfo, tag, srcIp, srcUser, time, false);	
                EventDispatcher.fireEvent(new ConfigDataChangeEvent(false, dataId, group, tenant, tag, time.getTime()));	
            }	
        } else { // beta publish	
            persistService.insertOrUpdateBeta(configInfo, betaIps, srcIp, srcUser, time, false);	
            EventDispatcher.fireEvent(new ConfigDataChangeEvent(true, dataId, group, tenant, time.getTime()));	
        }	
        ConfigTraceService.logPersistenceEvent(dataId, group, tenant, requestIpApp, time.getTime(),	
            LOCAL_IP, ConfigTraceService.PERSISTENCE_EVENT_PUB, content);	
        return true;	
    }
  1. persistService.insertOrUpdate将配置信息持久化到数据库

  2. 发起配置数据有变化事件的通知


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值