(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用戶端的安全連接配接。