in codegen/template_bundle/template_files.go [3618:3786]
func {{$exportName}}(deps *module.Dependencies) Client {
{{- /* this is the service discovery service name */}}
serviceName := deps.Default.Config.MustGetString("clients.{{$clientID}}.serviceName")
var routingKey string
if deps.Default.Config.ContainsKey("clients.{{$clientID}}.routingKey") {
routingKey = deps.Default.Config.MustGetString("clients.{{$clientID}}.routingKey")
}
var requestUUIDHeaderKey string
if deps.Default.Config.ContainsKey("tchannel.clients.requestUUIDHeaderKey") {
requestUUIDHeaderKey = deps.Default.Config.MustGetString("tchannel.clients.requestUUIDHeaderKey")
}
{{if $sidecarRouter -}}
ip := deps.Default.Config.MustGetString("sidecarRouter.{{$sidecarRouter}}.tchannel.ip")
port := deps.Default.Config.MustGetInt("sidecarRouter.{{$sidecarRouter}}.tchannel.port")
{{else -}}
ip := deps.Default.Config.MustGetString("clients.{{$clientID}}.ip")
port := deps.Default.Config.MustGetInt("clients.{{$clientID}}.port")
{{end -}}
gateway := deps.Default.Gateway
var channel *tchannel.Channel
// If dedicated.tchannel.client : true, each tchannel client will create a
// dedicated connection with local sidecar, else it will use a shared connection
if deps.Default.Config.ContainsKey("dedicated.tchannel.client") &&
deps.Default.Config.MustGetBoolean("dedicated.tchannel.client") {
channel = gateway.SetupClientTChannel(deps.Default.Config, serviceName)
channel.Peers().Add(ip + ":" + strconv.Itoa(int(port)))
} else {
channel = gateway.ServerTChannel
channel.GetSubChannel(serviceName, tchannel.Isolated).Peers().Add(ip + ":" + strconv.Itoa(int(port)))
}
/*Ex:
{
"clients.rider-presentation.alternates": {
"routingConfigs": [
{
"headerName": "x-test-env",
"headerValue": "*",
"serviceName": "testservice"
},
{
"headerName": "x-container",
"headerValue": "container*",
"serviceName": "relayer"
}
],
"servicesDetail": {
"testservice": {
"ip": "127.0.0.1",
"port": 5000
},
"relayer": {
"ip": "127.0.0.1",
"port": 12000
}
}
}
}*/
var re ruleengine.RuleEngine
var headerPatterns []string
altChannelMap := make(map[string]*tchannel.SubChannel)
headerPatterns, re = initializeDynamicChannel(channel, deps, headerPatterns, altChannelMap, re)
timeoutVal := int(deps.Default.Config.MustGetInt("clients.{{$clientID}}.timeout"))
timeout := time.Millisecond * time.Duration(
timeoutVal,
)
timeoutPerAttempt := time.Millisecond * time.Duration(
deps.Default.Config.MustGetInt("clients.{{$clientID}}.timeoutPerAttempt"),
)
methodNames := map[string]string{
{{range $svc := .Services -}}
{{range .Methods -}}
{{$serviceMethod := printf "%s::%s" $svc.Name .Name -}}
{{$methodName := (title (index $exposedMethods $serviceMethod)) -}}
{{if $methodName -}}
"{{$serviceMethod}}": "{{$methodName}}",
{{end -}}
{{ end -}}
{{ end -}}
}
//get mapping of client method and it's timeout
//if mapping is not provided, use client's timeout for all the methods
clientMethodTimeoutMapping := make(map[string]int64)
if deps.Default.Config.ContainsKey("clients.{{$clientID}}.methodTimeoutMapping") {
deps.Default.Config.MustGetStruct("clients.{{$clientID}}.methodTimeoutMapping", &clientMethodTimeoutMapping)
} else {
for _, methodName := range methodNames {
clientMethodTimeoutMapping[methodName] = int64(timeoutVal)
}
}
qpsLevels := map[string]string{
{{range $methodName, $qpsLevel := $QPSLevels -}}
"{{$methodName}}": "{{$qpsLevel}}",
{{end}}
}
// circuitBreakerDisabled sets whether circuit-breaker should be disabled
circuitBreakerDisabled := false
if deps.Default.Config.ContainsKey("clients.{{$clientID}}.circuitBreakerDisabled") {
circuitBreakerDisabled = deps.Default.Config.MustGetBoolean("clients.{{$clientID}}.circuitBreakerDisabled")
}
if !circuitBreakerDisabled {
for methodName, methodTimeoutVal := range clientMethodTimeoutMapping{
circuitBreakerName := "{{$clientID}}" + "-" + methodName
qpsLevel := "default"
if level, ok := qpsLevels[circuitBreakerName]; ok {
qpsLevel = level
}
configureCircuitBreaker(deps, int(methodTimeoutVal), circuitBreakerName, qpsLevel)
}
}
var client *zanzibar.TChannelClient
if deps.Default.Config.ContainsKey("tchannelclients.retryCount.feature.enabled") && deps.Default.Config.MustGetBoolean("tchannelclients.retryCount.feature.enabled") && deps.Default.Config.ContainsKey("clients.{{$clientID}}.retryCount") && int(deps.Default.Config.MustGetInt("clients.{{$clientID}}.retryCount")) > 0{
maxAttempts := int(deps.Default.Config.MustGetInt("clients.{{$clientID}}.retryCount"))
client = zanzibar.NewTChannelClientContext(
channel,
deps.Default.ContextLogger,
deps.Default.ContextMetrics,
deps.Default.ContextExtractor,
&zanzibar.TChannelClientOption{
ServiceName: serviceName,
ClientID: "{{$clientID}}",
MethodNames: methodNames,
Timeout: timeout,
TimeoutPerAttempt: timeoutPerAttempt,
RoutingKey: &routingKey,
RuleEngine: re,
HeaderPatterns: headerPatterns,
RequestUUIDHeaderKey: requestUUIDHeaderKey,
AltChannelMap: altChannelMap,
MaxAttempts: maxAttempts,
},
)
}else{
client = zanzibar.NewTChannelClientContext(
channel,
deps.Default.ContextLogger,
deps.Default.ContextMetrics,
deps.Default.ContextExtractor,
&zanzibar.TChannelClientOption{
ServiceName: serviceName,
ClientID: "{{$clientID}}",
MethodNames: methodNames,
Timeout: timeout,
TimeoutPerAttempt: timeoutPerAttempt,
RoutingKey: &routingKey,
RuleEngine: re,
HeaderPatterns: headerPatterns,
RequestUUIDHeaderKey: requestUUIDHeaderKey,
AltChannelMap: altChannelMap,
},
)
}
return &{{$clientName}}{
client: client,
circuitBreakerDisabled: circuitBreakerDisabled,
defaultDeps: deps.Default,
}
}