Nacos原始碼分析十四 服務端處理獲取配置請求

2021-10-14 06:15:51 字數 2518 閱讀 9565

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...