func {{$exportName}}()

in codegen/template_bundle/template_files.go [2108:2212]


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,
	}
}