Ich baue einen GRPC-Server mit Go. Derzeit bietet der Server drei Methoden:
Ich verwende Datadog, um einige Kennzahlen wie die Anzahl der Anfragen, die Dauer usw. zu protokollieren. Die Submitjob-Methode sieht folgendermaßen aus:
func (s *myserver) submitjob(ctx context.context, request *submitjobrequest) (*submitjobresponse, error) { s.dd_client.logrequestcount("submitjob") start_time := time.now() defer s.dd_client.logrequestduration("submitjob", time.since(start_time)) resp := somefunc() return resp, nil }
Der Protokollierungscode in diesen drei verschiedenen Servermethoden ist nahezu identisch. Deshalb möchte ich wissen, wie ich diese Doppelarbeit vermeiden kann.
Mir ist aufgefallen, dass Golang Grpc das Konzept von Abfangjägern hat. Grundsätzlich kann ich eine Interceptor-Funktion definieren und sie für die Vor-/Nachbearbeitung von Servermethodenaufrufen verwenden.
Im Anschluss an die Dokumentation habe ich einen Interceptor wie folgt geschrieben:
func unaryInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler, ) (interface{}, error) { dd_client := NewDatadogClient() defer dd_client.Close() dd_client.LogRequestCount(info.FullMethod) start_time := time.Now() resp, err := handler(ctx, req) dd_client.LogRequestDuration(info.FullMethod, time.Since(start_time)) return resp, err }
Das Problem besteht darin, dass jedes Mal, wenn der Interceptor aufgerufen wird, ein neuer Datadog-Client erstellt und zerstört wird. Ich denke, das ist unnötig. Aber da unaryinterceptor nur eine Methode und keine Klasse ist, sehe ich keine Möglichkeit, den Datadog-Client einmal zu erstellen und ihn später wiederzuverwenden? Gibt es eine Möglichkeit, meine Bedürfnisse zu erfüllen?
Ja, erstellen Sie es nicht sofort, sondern verschieben Sie es in eine andere Datei/ein anderes Paket, nennen wir es datadog.go
Sie müssen es als Singleton deklarieren, damit es in allen Verwendungen wie ... nur einen Zeiger hat
(Ich verwende den Typ „datadogtype“, um auf den von der Funktion „newdatadogclient“ zurückgegebenen Datentyp zu verweisen. Bitte geben Sie das Paket und die Version an, um einen genaueren Beispielcode zu erhalten.)
//your package code.... var dataDog DataDogType //access it through a wrapper, the wrapper will init the var the first time, //the remaining times it will be reused func GetDataDog()(*DataDogType) { if dataDog == nil { dataDog = NewDatadogClient() } return dataDog }
Übrigens, können Sie uns mitteilen, welche Datadog-Version und welches spezifische Paket Sie verwenden?
Das obige ist der detaillierte Inhalt vonProtokollierungsclient im Interceptor der Golang-Grpc-Servermethode wiederverwenden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!