(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()
iferr!=nil{
returnnil,err
}
returntransport.New(cfg)
}
以上代码是通过函数 RESTClientFor传入客户端配置参数 Config来创建 RESTClient的,函数通过调用TransportFor函数创建了一个 Transport,在上述代码的最后一行,可以看出该函数是通过调用Transport包中的 New函数创建了 http.RoundTripper。TransportFor函数通过将客户端 Config配置转化为 Transport包中的 Config类型并调用New函数创建 http.Transport。通过 New函数实现了底层 HTTP不同请求的封装,实现 了 HTTP客户端的安全连接。