in codegen/template_bundle/template_files.go [1530:1634]
func {{$exportName}}(deps *module.Dependencies) Client {
{{if $sidecarRouter -}}
ip := deps.Default.Config.MustGetString("sidecarRouter.{{$sidecarRouter}}.http.ip")
port := deps.Default.Config.MustGetInt("sidecarRouter.{{$sidecarRouter}}.http.port")
callerHeader := deps.Default.Config.MustGetString("sidecarRouter.{{$sidecarRouter}}.http.callerHeader")
calleeHeader := deps.Default.Config.MustGetString("sidecarRouter.{{$sidecarRouter}}.http.calleeHeader")
callerName := deps.Default.Config.MustGetString("serviceName")
calleeName := deps.Default.Config.MustGetString("clients.{{$clientID}}.serviceName")
var altServiceDetail = config.AlternateServiceDetail{}
if deps.Default.Config.ContainsKey("clients.{{$clientID}}.alternates") {
deps.Default.Config.MustGetStruct("clients.{{$clientID}}.alternates", &altServiceDetail)
}
{{else -}}
ip := deps.Default.Config.MustGetString("clients.{{$clientID}}.ip")
port := deps.Default.Config.MustGetInt("clients.{{$clientID}}.port")
{{end -}}
baseURL := fmt.Sprintf("http://%s:%d", ip, port)
timeoutVal := int(deps.Default.Config.MustGetInt("clients.{{$clientID}}.timeout"))
timeout := time.Millisecond * time.Duration(
timeoutVal,
)
defaultHeaders := make(map[string]string)
if deps.Default.Config.ContainsKey("http.defaultHeaders") {
deps.Default.Config.MustGetStruct("http.defaultHeaders", &defaultHeaders)
}
if deps.Default.Config.ContainsKey("clients.{{$clientID}}.defaultHeaders") {
deps.Default.Config.MustGetStruct("clients.{{$clientID}}.defaultHeaders", &defaultHeaders)
}
var requestUUIDHeaderKey string
if deps.Default.Config.ContainsKey("http.clients.requestUUIDHeaderKey") {
requestUUIDHeaderKey = deps.Default.Config.MustGetString("http.clients.requestUUIDHeaderKey")
}
var requestProcedureHeaderKey string
if deps.Default.Config.ContainsKey("http.clients.requestProcedureHeaderKey"){
requestProcedureHeaderKey = deps.Default.Config.MustGetString("http.clients.requestProcedureHeaderKey")
}
followRedirect := true
if deps.Default.Config.ContainsKey("clients.{{$clientID}}.followRedirect") {
followRedirect = deps.Default.Config.MustGetBoolean("clients.{{$clientID}}.followRedirect")
}
methodNames := map[string]string{
{{range $serviceMethod, $methodName := $exposedMethods -}}
"{{$methodName}}": "{{$serviceMethod}}",
{{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")
}
//get mapping of client method and it's timeout
//if mapping is not provided, use client's timeout for all methods
clientMethodTimeoutMapping := make(map[string]int64)
if deps.Default.Config.ContainsKey("clients.{{$clientID}}.methodTimeoutMapping") {
deps.Default.Config.MustGetStruct("clients.{{$clientID}}.methodTimeoutMapping", &clientMethodTimeoutMapping)
} else {
//override the client overall-timeout with the client's method level timeout
for methodName := range methodNames {
clientMethodTimeoutMapping[methodName] = int64(timeoutVal)
}
}
qpsLevels := map[string]string{
{{range $methodName, $qpsLevel := $QPSLevels -}}
"{{$methodName}}": "{{$qpsLevel}}",
{{end}}
}
if !circuitBreakerDisabled {
for methodName, methodTimeout := range clientMethodTimeoutMapping{
circuitBreakerName := "{{$clientID}}" + "-" + methodName
qpsLevel := "default"
if level, ok := qpsLevels[circuitBreakerName]; ok {
qpsLevel = level
}
configureCircuitBreaker(deps, int(methodTimeout), circuitBreakerName, qpsLevel)
}
}
return &{{$clientName}}{
clientID: "{{$clientID}}",
{{if $sidecarRouter -}}
callerHeader: callerHeader,
calleeHeader: calleeHeader,
callerName: callerName,
calleeName: calleeName,
altRoutingMap: initializeAltRoutingMap(altServiceDetail),
{{end -}}
httpClient: zanzibar.NewHTTPClientContext(
deps.Default.ContextLogger, deps.Default.ContextMetrics, deps.Default.JSONWrapper,
"{{$clientID}}",
methodNames,
baseURL,
defaultHeaders,
timeout,
followRedirect,
),
circuitBreakerDisabled: circuitBreakerDisabled,
requestUUIDHeaderKey: requestUUIDHeaderKey,
requestProcedureHeaderKey: requestProcedureHeaderKey,
}
}