Dengan populariti seni bina perkhidmatan mikro, panggilan antara perkhidmatan menjadi semakin kompleks. Apabila kami perlu menyelesaikan masalah permintaan, kami perlu dapat mengesan keseluruhan pautan panggilan dan melihat cara setiap perkhidmatan mengendalikan permintaan tersebut. Untuk merealisasikan keperluan ini, kami perlu memperkenalkan mekanisme traceid untuk menyambungkan log setiap perkhidmatan dalam keseluruhan proses panggilan untuk analisis dan penyelesaian masalah.
Di Golang, kami boleh melaksanakan mekanisme traceid melalui kod mudah. Pertama, kita perlu memperkenalkan konteks pautan global (konteks), yang akan diluluskan sepanjang proses, dan akan terus meningkat dan lulus jejak dengan permintaan. Pelaksanaan khusus adalah seperti berikut:
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() }
Dalam kod di atas, kami memperkenalkan pemalar traceid untuk menyimpan traceid dalam konteks dan menyediakan dua fungsi WithTraceID dan GetTraceID, digunakan untuk menetapkan dan mendapatkan konteks masing-masing. dikesan dalam. Pada masa yang sama, kami juga menyediakan fungsi NewTraceID yang menjana traceid Fungsi ini akan menjana uuid unik sebagai traceid permintaan semasa.
Seterusnya, dalam perkhidmatan kami, kami perlu menghantar traceid permintaan semasa kepada perkhidmatan seterusnya dalam setiap fungsi yang mengendalikan permintaan dan mencetak traceid dalam log untuk penyelesaian masalah seterusnya. Pelaksanaan khusus adalah seperti berikut:
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 }
Seperti yang ditunjukkan di atas, dalam fungsi yang mengendalikan permintaan, kami mula-mula mendapatkan jejak permintaan semasa daripada pengepala permintaan traceid dihasilkan. Kami kemudian menambah traceid ke konteks dan lulus konteks ke perkhidmatan seterusnya apabila ia dipanggil. Dalam perkhidmatan seterusnya, kita boleh mendapatkan traceid yang diluluskan oleh perkhidmatan sebelumnya melalui fungsi GetTraceID dan mencetaknya dalam log.
Melalui kod di atas, kami boleh menghantar traceid sepanjang pautan permintaan dan mencetak log yang sepadan untuk memudahkan penyelesaian masalah dan analisis.
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan traceid dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!