【原創】k8s原始碼分析------第三方庫etcd client分析
程式碼為github.com/coreos/go-etcd/etcd 注: 此版本為k8s v1.1.1 中所使用的etcd client。 首先我看下k8s中是如何使用的。位置在k8s.io\kubernetes\cmd\kube-apiserver\app\server.go
程式碼目錄,從這裡來看,程式碼還是非常清晰的
那麼我們就從此處入口,先看client.go 先看結構體
結構體裡面,比較重要的東西 1、cluster,叢集管理 2、httpclient,這個將是最終的入口 我們繼續
這裡面主要是初始化了cluster,httpclient 其中cluster後面再詳細介紹,這裡我們接著看httpclient
很明顯這裡就是構造了一個標準庫net/http中的Client 大致的初始化很簡單。其實還有一個tls的初始化。為NewTLSClient,對應的httpclient初始化為initHTTPSClient 下面我們看看etcd client都提供了那些操作。 Get操作 我們看get.go
很明顯,我們看到Get呼叫了RawGet,而RawGet呼叫了get 我們再跟蹤get 在request.go中
繼續getCancelable 還是在request.go中
主要有NewRawRequest。request.go中 其實就是對request的一些包裝,包含了一些引數
我們繼續看SendRequest。這個才是整個程式碼的核心
在下面我們看到這裡當RawRequest中的Cancel不為nil的時候,會啟動一個協程來接收cancel訊息。 但目前我們分析的Get是沒有設定的
我們繼續這裡有個for迴圈,attempt為嘗試次數統計,當成功則會退出for迴圈,失敗則會繼續嘗試。其中有個變數為httpPath是個關鍵
我們現在跟進去看看 requet.go中
我們看到了cluster,我們繼續跟進去看看
從上面的cluster的程式碼來看其實pick就是返回cluster中的一臺主機,而pick的機器則是一個隨機的主機,在初始化的時候有隨機,在failure的時候,又會重新隨機 我們回到之前的sendrequest
這裡主要的地方就是構造一個標準庫net/http中的Request 再繼續
我們看到我們之前提到的httpclient,接收剛剛構建的Request,然後Do。就是發起了http的請求。
進行校驗頭部,如果是正常的,則退出for迴圈
退出for迴圈之後,返回了一個RawResponse結構體 最後我們返回到
我們看到了結果 其實就是一個解碼的過程
至此Get操作就解析完了 還有一些操作如: AddChildDir 其實跟蹤進去,最後也是到了SendRequest函式中
還有一些其他的操作,就不一一介紹了,其程式碼的流程是基本一致的。 龔浩華 qq 月牙寂 道長 29185807 2016年3月21日 |