nacos-client 获取配置源码分析

上一篇关于nacos-client启动的分析

这一篇文章,是介绍获取配置的实现方式。

查看接口com.alibaba.nacos.api.config.ConfigService

  
    /**
     * Get config.
     *
     * @param dataId    dataId
     * @param group     group
     * @param timeoutMs read timeout
     * @return config value
     * @throws NacosException NacosException
     */
    String getConfig(String dataId, String group, long timeoutMs) throws NacosException;

查看接口的实现NacosConfigService

private String getConfigInner(String tenant, String dataId, String group, long timeoutMs) throws NacosException {
        group = null2defaultGroup(group);
        ParamUtils.checkKeyParam(dataId, group);
        ConfigResponse cr = new ConfigResponse();
        
        cr.setDataId(dataId);
        cr.setTenant(tenant);
        cr.setGroup(group);
        
        // Failover是一个宕机文件目录下的本地缓存。没发现有代码会生成这个目录,怀疑是保留功能
        String content = LocalConfigInfoProcessor.getFailover(agent.getName(), dataId, group, tenant);
        if (content != null) {
            LOGGER.warn("[{}] [get-config] get failover ok, dataId={}, group={}, tenant={}, config={}", agent.getName(),
                    dataId, group, tenant, ContentUtils.truncateContent(content));
            cr.setContent(content);
            configFilterChainManager.doFilter(null, cr);
            content = cr.getContent();
            return content;
        }
        
        try {
            //去服务端查找配置
            String[] ct = worker.getServerConfig(dataId, group, tenant, timeoutMs);
            cr.setContent(ct[0]);
            //通知过滤器,默认代码没有过滤器,是留给用户实现的。这里目的是将content过滤器转换
            configFilterChainManager.doFilter(null, cr);
            content = cr.getContent();
            
            return content;
        } catch (NacosException ioe) {
            if (NacosException.NO_RIGHT == ioe.getErrCode()) {
                throw ioe;
            }
            LOGGER.warn("[{}] [get-config] get from server error, dataId={}, group={}, tenant={}, msg={}",
                    agent.getName(), dataId, group, tenant, ioe.toString());
        }
        
        LOGGER.warn("[{}] [get-config] get snapshot ok, dataId={}, group={}, tenant={}, config={}", agent.getName(),
                dataId, group, tenant, ContentUtils.truncateContent(content));
        //假如服务端链接异常,使用本地缓存数据
        content = LocalConfigInfoProcessor.getSnapshot(agent.getName(), dataId, group, tenant);
        cr.setContent(content);
        configFilterChainManager.doFilter(null, cr);
        content = cr.getContent();
        return content;
    }

重点看下如何从服务端获取配置worker.getServerConfig(dataId, group, tenant, timeoutMs);

HttpRestResult<String> result = null;
        try {
            Map<String, String> params = new HashMap<String, String>(3);
            if (StringUtils.isBlank(tenant)) {
                params.put("dataId", dataId);
                params.put("group", group);
            } else {
                params.put("dataId", dataId);
                params.put("group", group);
                params.put("tenant", tenant);
            }
            //链接是/v1/cs/configs
            result = agent.httpGet(Constants.CONFIG_CONTROLLER_PATH, null, params, agent.getEncode(), readTimeout);
        } catch (Exception ex) {
            String message = String
                    .format("[%s] [sub-server] get server config exception, dataId=%s, group=%s, tenant=%s",
                            agent.getName(), dataId, group, tenant);
            LOGGER.error(message, ex);
            throw new NacosException(NacosException.SERVER_ERROR, ex);
        }

其实就是发了一个GET请求,把三要素做参数,返回结果。

Nacos是阿里巴巴开源的分布式系统架构和服务发现平台。其核心功能包括服务发现、配置管理和动态DNS服务。其中,nacos naming模块是其服务发现的核心组件。 nacos naming模块主要包含三个子模块:naming-core、naming-client和naming-server。其中,naming-core提供了服务注册和服务发现的核心实现;naming-client提供了服务注册和服务发现的客户端;naming-server则是nacos naming的服务端。 在nacos naming的核心实现中,naming-core负责服务注册和服务发现的具体逻辑。首先,naming-core会将注册的服务信息存储到nacos的服务元数据仓库中,并使用心跳机制来保证服务的可用性。其次,naming-core会根据请求的服务名、命名空间和集群名等参数,在服务元数据仓库中查找可用的服务实例,并返回给客户端。 除了核心实现以外,naming-client和naming-server则提供了服务注册和服务发现的客户端和服务端实现。在客户端方面,naming-client会通过心跳连接服务端,获取最新的服务信息,并将注册的服务信息同步到nacos服务元数据仓库中。在服务端方面,naming-server会监听客户端的请求,并处理注册和发现服务的相关逻辑。 总的来说,nacos naming模块的源码分析需要深入了解其服务发现和注册的原理,以及对基于心跳机制的服务保障有深入的理解。在客户端和服务端实现中,还需要了解与naming-core的交互细节,以及如何实现服务注册和发现的高可用保证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值