nacos客戶端的學習已經基本告一段落。從本篇開始我們把關注點放在服務端。
我們知道nacos服務端主要功能就是提供配置中心的功能和命名服務。接下來我們還是按這兩部分討論。
首先是配置中心。我們先看一下服務端如何處理客戶端發起的獲取配置的請求,相應介面是在com.alibaba.nacos.config.server.controller.configcontroller中定義,我們看一下getconfig方法:
先是引數檢查,然後獲取客戶端ip,最後呼叫configservletinner的dogetconfig方法。
dogetconfig方法比較長,先畫乙個流程圖吧:
首先獲取讀取鎖,如果沒有得到鎖則返回失敗。lockresult>0時執行讀取操作
然後是判斷beta、tag、autotag來確定是否帶對應的引數進行資料獲取
再根據propertyutil.isdirectread()方法確定是通過mysql讀取還是本地檔案
response寫對應的內容,最終返回。
我們看一下propertyutil.isdirectread()判斷:
public static boolean isdirectread()
是否是單機模式,並且開啟mysql儲存,預設的embeddedstorage值和是否是單機模式值一致:
persistservice.findconfiginfo4beta是beta的資料庫查詢:
@override
public configinfo4beta findconfiginfo4beta(final string dataid, final string group, final string tenant)
findconfiginfo 不帶tag的:
@override
public configinfo findconfiginfo(final string dataid, final string group, final string tenant) ;
}
findconfiginfo4tag 帶tag的:
@override
public configinfo4tag findconfiginfo4tag(final string dataid, final string group, final string tenant,
final string tag)
然後我們看一下diskutil的獲取file的方法,以帶tag的為例:
public static file targettagfile(string dataid, string group, string tenant, string tag) else
file = new file(file, group);
file = new file(file, dataid);
file = new file(file, tag);
return file;
}
就是分目錄往下new file
最後我們看一下response寫檔案:
fis.getchannel()
.transferto(0l, fis.getchannel().size(), channels.newchannel(response.getoutputstream()));
這個是檔案的輸入流轉response的輸出流。 零拷貝傳輸。
服務端如何處理獲取配置的請求基本分析完了。
讀鎖的獲取
beta、tag、autotag的判斷來確認具體讀什麼配置
propertyutil.isdirectread()判斷是讀mysql還是讀檔案
使用jdk的零拷貝傳輸直接將檔案輸入流轉response輸出流
TeamTalk原始碼分析之服務端描述
ttserver teamtalk伺服器端 主要包含了以下幾種伺服器 teamtalk中用到了其他開源庫,比如google protobuf redis log4cxx等。服務端的啟動沒有嚴格的先後流程,因為各端在啟動後會去主動連線其所依賴的服務端,如果相應的服務端還未啟動,會始終嘗試連線。不過在此...
CMPP2 0 3 0服務端原始碼
cmpp2.0 cmpp3.0服務端,帶資料庫,可以接收第三方cmpp客戶端的簡訊,並存入資料庫,結合我的cmpp客戶端服務程式,將可以實現接收第三方sp的簡訊並 到閘道器實現傳送,並將狀態報告 上行簡訊 給第三方sp,實現了透明閘道器的作用。程式介面如下 原始碼截圖如下 如介面所示,可以直接給下游...
Eureka原始碼手撕分析啟動流程(服務端)
該註解包含了如下內容 其中 import eurekaservermarkerconfiguration.class 現在怎麼下手,上面的 已經結束了。經過查詢資料發現入口 在jar spring cloud netflix eureka server 2.2.2.release.jar的manif...