Avec la popularité de l'architecture des microservices, les appels entre services deviennent de plus en plus complexes. Lorsque nous devons résoudre une demande, nous devons être en mesure de retracer l'intégralité du lien d'appel et de voir comment chaque service traite la demande. Afin de répondre à cette exigence, nous devons introduire le mécanisme traceid pour connecter les journaux de chaque service dans l'ensemble du processus d'appel à des fins d'analyse et de dépannage.
Dans Golang, nous pouvons implémenter le mécanisme traceid via un code simple. Tout d'abord, nous devons introduire un contexte de lien global (contexte), qui sera transmis tout au long du processus, et continuera à augmenter et à transmettre le traceid avec la requête. L'implémentation spécifique est la suivante :
import ( "context" "github.com/google/uuid" ) const traceIdKey = "traceid" func WithTraceID(ctx context.Context, traceID string) context.Context { return context.WithValue(ctx, traceIdKey, traceID) } func GetTraceID(ctx context.Context) string { if v, ok := ctx.Value(traceIdKey).(string); ok { return v } else { return "" } } func NewTraceID() string { return uuid.New().String() }
Dans le code ci-dessus, nous introduisons une constante traceid pour stocker le traceid dans le contexte, et fournissons deux fonctions WithTraceID et GetTraceID, qui sont utilisées respectivement pour définir et obtenir le traceid dans le contexte. En même temps, nous fournissons également une fonction NewTraceID qui génère un traceid. Cette fonction générera un uuid unique comme traceid de la requête en cours.
Ensuite, dans notre service, nous devons transmettre le traceid de la requête en cours au service suivant dans chaque fonction qui gère la demande, et imprimer le traceid dans le journal pour un dépannage ultérieur. L'implémentation spécifique est la suivante :
func HandlerFunc(w http.ResponseWriter, r *http.Request) { traceID := "" if traceIDArr := r.Header.Get("X-Trace-ID"); len(traceIDArr) > 0 { traceID = traceIDArr[0] } if traceID == "" { traceID = NewTraceID() } ctx := context.Background() ctx = WithTraceID(ctx, traceID) // 调用下一个服务 resp := CallNextService(ctx) // 打印日志 log.Printf("request traceID=%s\n", traceID) // 返回数据 w.Write(resp) } func CallNextService(ctx context.Context) []byte { traceID := GetTraceID(ctx) // 调用下一个服务 ... // 打印日志 log.Printf("call next service traceID=%s\n", traceID) // 返回数据 return resp }
Comme indiqué ci-dessus, dans la fonction qui traite la requête, nous obtenons d'abord le traceid de la requête en cours à partir de l'en-tête de la requête. S'il n'est pas obtenu, un nouveau traceid est généré. Nous ajoutons ensuite le traceid au contexte et transmettons le contexte au service suivant lorsqu'il est appelé. Dans le service suivant, nous pouvons obtenir le traceid transmis par le service précédent via la fonction GetTraceID et l'imprimer dans le journal.
Avec le code ci-dessus, nous pouvons transmettre le traceid tout au long du lien de demande et imprimer le journal correspondant pour faciliter le dépannage et l'analyse.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!