マイクロサービス アーキテクチャの人気に伴い、サービス間の呼び出しはますます複雑になっています。リクエストのトラブルシューティングが必要な場合は、呼び出しリンク全体をトレースし、各サービスがリクエストをどのように処理するかを確認できる必要があります。この要件を実現するには、呼び出しプロセス全体で各サービスのログを接続し、分析とトラブルシューティングを行うために、Traceid メカニズムを導入する必要があります。
Golang では、簡単なコードを通じて Traceid メカニズムを実装できます。まず、グローバル リンク コンテキスト (コンテキスト) を導入する必要があります。これはプロセス全体に渡され、リクエストとともに増加し続けて Traceid を渡します。具体的な実装は次のとおりです。
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() }
上記のコードでは、コンテキストに TraceID を格納するための TraceID 定数を導入し、TraceID を設定および取得するために使用される 2 つの関数 WithTraceID と GetTraceID を提供します。それぞれコンテキスト。同時に、TraceID を生成する関数 NewTraceID も提供しており、この関数は現在のリクエストの TraceID として一意の uuid を生成します。
次に、このサービスでは、現在のリクエストの TraceID を、リクエストを処理する各関数の次のサービスに渡し、後続のトラブルシューティングのためにログに TraceID を出力する必要があります。
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 }
上に示したように、リクエストを処理する関数では、まずリクエスト ヘッダーから現在のリクエストのトレース ID を取得します。取得できない場合は、新しいトレース ID が取得されます。生成された。次に、traceid をコンテキストに追加し、次のサービスが呼び出されたときにそのコンテキストを次のサービスに渡します。次のサービスでは、GetTraceID 関数を通じて前のサービスから渡された TraceID を取得し、ログに出力できます。
上記のコードを通じて、リクエスト リンク全体に Traceid を渡し、対応するログを出力して、トラブルシューティングと分析を容易にすることができます。
以上がgolangでtraceidを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。