天天看點

帶你讀《雲原生應用開發 Operator原理與實踐》第二章 Operator 原理2.2Client-go 原理(十五)

(3)       Transport的使用案例

Client-go源碼 Rest包中通過 RESTClientFor傳回一個 RESTClient對象,RESTClient對 KubernetesAPIServer的 RESTfulAPI 的通路進行了封裝抽象。RESTClientFor的實作見代碼清單 2-53。

funcRESTClientFor(config*Config)(*RESTClient,error){

...

transport,err:=TransportFor(config)

iferr!=nil{

returnnil,err

}

varhttpClient*http.Client

iftransport!=http.DefaultTransport{

httpClient=&http.Client{Transport:transport}

ifconfig.Timeout>0{httpClient.Timeout=config.Timeout

restClient,err:=NewRESTClient(baseURL,versionedAPIPath,clientContent,rateLimiter,httpClient)

iferr==nil&&config.WarningHandler!=nil{restClient.warningHandler=config.WarningHandler

returnrestClient,err

funcTransportFor(config*Config)(http.RoundTripper,error){cfg,err:=config.TransportConfig()

returntransport.New(cfg)

以上代碼是通過函數 RESTClientFor傳入用戶端配置參數 Config來建立 RESTClient的,函數通過調用TransportFor函數建立了一個 Transport,在上述代碼的最後一行,可以看出該函數是通過調用Transport包中的 New函數建立了 http.RoundTripper。TransportFor函數通過将用戶端 Config配置轉化為 Transport包中的 Config類型并調用New函數建立 http.Transport。通過 New函數實作了底層 HTTP不同請求的封裝,實作 了 HTTP用戶端的安全連接配接。

繼續閱讀