in protocol/triple/client.go [137:260]
func newClientManager(url *common.URL) (*clientManager, error) {
var cliOpts []tri.ClientOption
// set max send and recv msg size
maxCallRecvMsgSize := constant.DefaultMaxCallRecvMsgSize
if recvMsgSize, err := humanize.ParseBytes(url.GetParam(constant.MaxCallRecvMsgSize, "")); err == nil && recvMsgSize > 0 {
maxCallRecvMsgSize = int(recvMsgSize)
}
cliOpts = append(cliOpts, tri.WithReadMaxBytes(maxCallRecvMsgSize))
maxCallSendMsgSize := constant.DefaultMaxCallSendMsgSize
if sendMsgSize, err := humanize.ParseBytes(url.GetParam(constant.MaxCallSendMsgSize, "")); err == nil && sendMsgSize > 0 {
maxCallSendMsgSize = int(sendMsgSize)
}
cliOpts = append(cliOpts, tri.WithSendMaxBytes(maxCallSendMsgSize))
// set keepalive interval and keepalive timeout
keepAliveInterval := url.GetParamDuration(constant.KeepAliveInterval, constant.DefaultKeepAliveInterval)
keepAliveTimeout := url.GetParamDuration(constant.KeepAliveTimeout, constant.DefaultKeepAliveTimeout)
var isIDL bool
// set serialization
serialization := url.GetParam(constant.SerializationKey, constant.ProtobufSerialization)
switch serialization {
case constant.ProtobufSerialization:
isIDL = true
case constant.JSONSerialization:
isIDL = true
cliOpts = append(cliOpts, tri.WithProtoJSON())
case constant.Hessian2Serialization:
cliOpts = append(cliOpts, tri.WithHessian2())
case constant.MsgpackSerialization:
cliOpts = append(cliOpts, tri.WithMsgPack())
default:
panic(fmt.Sprintf("Unsupported serialization: %s", serialization))
}
// set timeout
timeout := url.GetParamDuration(constant.TimeoutKey, "")
cliOpts = append(cliOpts, tri.WithTimeout(timeout))
// set service group and version
group := url.GetParam(constant.GroupKey, "")
version := url.GetParam(constant.VersionKey, "")
cliOpts = append(cliOpts, tri.WithGroup(group), tri.WithVersion(version))
// todo(DMwangnima): support opentracing
// todo(DMwangnima): support TLS in an ideal way
var cfg *tls.Config
var tlsFlag bool
var err error
// handle tls config
// TODO: think about a more elegant way to configure tls,
// Maybe we can try to create a ClientOptions for unified settings,
// after this function becomes bloated.
// TODO: Once the global replacement of the config is completed,
// replace config with global.
if tlsConfig := config.GetRootConfig().TLSConfig; tlsConfig != nil {
cfg, err = config.GetClientTlsConfig(&config.TLSConfig{
CACertFile: tlsConfig.CACertFile,
TLSCertFile: tlsConfig.TLSCertFile,
TLSKeyFile: tlsConfig.TLSKeyFile,
TLSServerName: tlsConfig.TLSServerName,
})
if err != nil {
return nil, err
}
logger.Infof("TRIPLE clientManager initialized the TLSConfig configuration")
tlsFlag = true
}
var transport http.RoundTripper
callType := url.GetParam(constant.CallHTTPTypeKey, constant.CallHTTP2)
switch callType {
case constant.CallHTTP:
transport = &http.Transport{
TLSClientConfig: cfg,
}
cliOpts = append(cliOpts, tri.WithTriple())
case constant.CallHTTP2:
if tlsFlag {
transport = &http2.Transport{
TLSClientConfig: cfg,
}
} else {
transport = &http2.Transport{
DialTLSContext: func(_ context.Context, network, addr string, _ *tls.Config) (net.Conn, error) {
return net.Dial(network, addr)
},
AllowHTTP: true,
ReadIdleTimeout: keepAliveInterval,
PingTimeout: keepAliveTimeout,
}
}
default:
panic(fmt.Sprintf("Unsupported callType: %s", callType))
}
httpClient := &http.Client{
Transport: transport,
}
var baseTriURL string
baseTriURL = strings.TrimPrefix(url.Location, httpPrefix)
baseTriURL = strings.TrimPrefix(baseTriURL, httpsPrefix)
if tlsFlag {
baseTriURL = httpsPrefix + baseTriURL
} else {
baseTriURL = httpPrefix + baseTriURL
}
triClients := make(map[string]*tri.Client)
for _, method := range url.Methods {
triURL, err := joinPath(baseTriURL, url.Interface(), method)
if err != nil {
return nil, fmt.Errorf("JoinPath failed for base %s, interface %s, method %s", baseTriURL, url.Interface(), method)
}
triClient := tri.NewClient(httpClient, triURL, cliOpts...)
triClients[method] = triClient
}
return &clientManager{
isIDL: isIDL,
triClients: triClients,
}, nil
}