nacos源碼-怎麼更新配置

界面操作更新nacos配置,然後使用charles抓包工具,抓到請求

http://ip:port/nacos/v1/cs/configs?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTYwNTE2Nzc5N30.NNcnIivPaMxj3me9FfKY2VHaWnJNVA6GganyWenR6NU

下載源碼

  
  
  
https://github.com/alibaba/nacos

找到請求:nacos/v1/cs/configs

Constants.java類中找到

public static final String BASE_PATH = "/v1/cs";
public static final String CONFIG_CONTROLLER_PATH = BASE_PATH + "/configs";

找到使用CONFIG_CONTROLLER_PATH的controller請求

/** * Special controller for soft load client to publish data. * * @author leiwen */@RestController@RequestMapping(Constants.CONFIG_CONTROLLER_PATH)public class ConfigController {

根據請求地址以及參數,定位到請求的方法爲publishConfig

    @PostMapping    @Secured(action = ActionTypes.WRITE, parser = ConfigResourceParser.class)    public Boolean publishConfig(HttpServletRequest request, HttpServletResponse response,            @RequestParam(value = "dataId") String dataId, @RequestParam(value = "group") String group,            @RequestParam(value = "tenant", required = false, defaultValue = StringUtils.EMPTY) String tenant,            @RequestParam(value = "content") String content, @RequestParam(value = "tag", required = false) String tag,            @RequestParam(value = "appName", required = false) String appName,            @RequestParam(value = "src_user", required = false) String srcUser,            @RequestParam(value = "config_tags", required = false) String configTags,            @RequestParam(value = "desc", required = false) String desc,            @RequestParam(value = "use", required = false) String use,            @RequestParam(value = "effect", required = false) String effect,            @RequestParam(value = "type", required = false) String type,            @RequestParam(value = "schema", required = false) String schema) throws NacosException {                final String srcIp = RequestUtil.getRemoteIp(request);        final String requestIpApp = RequestUtil.getAppName(request);        srcUser = RequestUtil.getSrcUserName(request);        //check type        if (!ConfigType.isValidType(type)) {            type = ConfigType.getDefaultType().getType();        }        // check tenant        ParamUtils.checkTenant(tenant);        ParamUtils.checkParam(dataId, group, "datumId", content);        ParamUtils.checkParam(tag);        Map<String, Object> configAdvanceInfo = new HashMap<String, Object>(10);        MapUtils.putIfValNoNull(configAdvanceInfo, "config_tags", configTags);        MapUtils.putIfValNoNull(configAdvanceInfo, "desc", desc);        MapUtils.putIfValNoNull(configAdvanceInfo, "use", use);        MapUtils.putIfValNoNull(configAdvanceInfo, "effect", effect);        MapUtils.putIfValNoNull(configAdvanceInfo, "type", type);        MapUtils.putIfValNoNull(configAdvanceInfo, "schema", schema);        ParamUtils.checkParam(configAdvanceInfo);                if (AggrWhitelist.isAggrDataId(dataId)) {            LOGGER.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);        configInfo.setType(type);        if (StringUtils.isBlank(betaIps)) {            if (StringUtils.isBlank(tag)) {                persistService.insertOrUpdate(srcIp, srcUser, configInfo, time, configAdvanceInfo, true);                ConfigChangePublisher                        .notifyConfigChange(new ConfigDataChangeEvent(false, dataId, group, tenant, time.getTime()));            } else {                persistService.insertOrUpdateTag(configInfo, tag, srcIp, srcUser, time, true);                ConfigChangePublisher.notifyConfigChange(                        new ConfigDataChangeEvent(false, dataId, group, tenant, tag, time.getTime()));            }        } else {            // beta publish            persistService.insertOrUpdateBeta(configInfo, betaIps, srcIp, srcUser, time, true);            ConfigChangePublisher                    .notifyConfigChange(new ConfigDataChangeEvent(true, dataId, group, tenant, time.getTime()));        }        ConfigTraceService                .logPersistenceEvent(dataId, group, tenant, requestIpApp, time.getTime(), InetUtils.getSelfIP(),                        ConfigTraceService.PERSISTENCE_EVENT_PUB, content);        return true;    }

邏輯並不複雜,就是判斷是新增配置還是修改配置,然後修改或者新增數據庫響應信息。

之後通過消息隊列通知其他服務,其他服務接收到通知之後,更新配置。

2 源碼值得學習的地方

2.1 構造器注入service

不建議直接使用@Autowired注入,建議使用構造器注入或者getter/setter方法注入。

2.2 判斷對向是否爲空

可以使用 rt.jar 中的Objects對象的 isNull() 方法。

    @Override    public void insertOrUpdate(String srcIp, String srcUser, ConfigInfo configInfo, Timestamp time,            Map<String, Object> configAdvanceInfo, boolean notify) {        if (Objects.isNull(findConfigInfo(configInfo.getDataId(), configInfo.getGroup(), configInfo.getTenant()))) {            addConfigInfo(srcIp, srcUser, configInfo, time, configAdvanceInfo, notify);        } else {            updateConfigInfo(configInfo, srcIp, srcUser, time, configAdvanceInfo, notify);        }    }

2.3 插入數據,主鍵使用雪花算法生成

    private void addConfigInfo(final String srcIp, final String srcUser, final ConfigInfo configInfo,            final Timestamp time, final Map<String, Object> configAdvanceInfo, final boolean notify,            BiConsumer<Boolean, Throwable> consumer) {                try {            final String tenantTmp =                    StringUtils.isBlank(configInfo.getTenant()) ? StringUtils.EMPTY : configInfo.getTenant();            configInfo.setTenant(tenantTmp);                        long configId = idGeneratorManager.nextId(RESOURCE_CONFIG_INFO_ID);            long hisId = idGeneratorManager.nextId(RESOURCE_CONFIG_HISTORY_ID);                        addConfigInfoAtomic(configId, srcIp, srcUser, configInfo, time, configAdvanceInfo);            String configTags = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get("config_tags");                        addConfigTagsRelation(configId, configTags, configInfo.getDataId(), configInfo.getGroup(),                    configInfo.getTenant());            insertConfigHistoryAtomic(hisId, configInfo, srcIp, srcUser, time, "I");            EmbeddedStorageContextUtils.onModifyConfigInfo(configInfo, srcIp, time);            databaseOperate.blockUpdate(consumer);        } finally {            EmbeddedStorageContextUtils.cleanAllContext();        }    }

雪花算法實現類SnowFlowerIdGenerator.java

本文分享自微信公衆號 - 哥妞(gh_d18ec82f19ea)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章