Spring Cloud 2.2.2 源碼之六十四nacos數據一致性原理之永久結點數據同步二

Spring Cloud 2.2.2 源碼之六十四nacos數據一致性原理之永久結點數據同步二

nacos數據一致性服務執行流程

在這裏插入圖片描述

RaftController的onPublish過半響應

最終響應還是調用了RaftConsistencyServiceImplonPut。然後返回ok

     @PostMapping("/datum/commit")
    public String onPublish(HttpServletRequest request, HttpServletResponse response) throws Exception {

        response.setHeader("Content-Type", "application/json; charset=" + getAcceptEncoding(request));
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Content-Encode", "gzip");

        String entity = IoUtils.toString(request.getInputStream(), "UTF-8");
        String value = URLDecoder.decode(entity, "UTF-8");
        JSONObject jsonObject = JSON.parseObject(value);
        String key = "key";

        RaftPeer source = JSON.parseObject(jsonObject.getString("source"), RaftPeer.class);
        JSONObject datumJson = jsonObject.getJSONObject("datum");

        Datum datum = null;
        if (KeyBuilder.matchInstanceListKey(datumJson.getString(key))) {
            datum = JSON.parseObject(jsonObject.getString("datum"), new TypeReference<Datum<Instances>>() {
            });
        } else if (KeyBuilder.matchSwitchKey(datumJson.getString(key))) {
            datum = JSON.parseObject(jsonObject.getString("datum"), new TypeReference<Datum<SwitchDomain>>() {
            });
        } else if (KeyBuilder.matchServiceMetaKey(datumJson.getString(key))) {
            datum = JSON.parseObject(jsonObject.getString("datum"), new TypeReference<Datum<Service>>() {
            });
        }

        raftConsistencyService.onPut(datum, source);
        return "ok";
    }

RaftConsistencyServiceImpl的onPut

調用了RaftCoreonPublish,用來同步服務數據。

    public void onPut(Datum datum, RaftPeer source) throws NacosException {
        try {
            raftCore.onPublish(datum, source);
        } catch (Exception e) {
            Loggers.RAFT.error("Raft onPut failed.", e);
            throw new NacosException(NacosException.SERVER_ERROR, "Raft onPut failed, datum:" + datum + ", source: " + source, e);
        }
    }

至此強一致性的數據同步也說完了,其實就是過半機制,所以nacos的數據同步是可以APCP混用的。

一些問題

出現了兩個一樣的類,但是邏輯基本是一樣的,挺奇怪,不過仔細一看,還有不一樣的,RaftCore的通知器還有前綴爲com.alibaba.nacos.naming.domains.meta.的監聽器,不止是Service,還有ServiceManager
在這裏插入圖片描述
在這裏插入圖片描述
其他的細節只能有時間慢慢看了,接下去說下CP的選舉問題。

好了,今天就到這裏了,希望對學習理解有幫助,大神看見勿噴,僅爲自己的學習理解,能力有限,請多包涵。

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