Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan konteks untuk melaksanakan pengesanan permintaan yang diedarkan dalam Go

Cara menggunakan konteks untuk melaksanakan pengesanan permintaan yang diedarkan dalam Go

王林
王林asal
2023-07-21 16:34:491187semak imbas

Cara menggunakan konteks untuk melaksanakan pengesanan permintaan yang diedarkan dalam Go

Dengan pembangunan Internet, sistem yang diedarkan telah menjadi bahagian yang amat diperlukan dalam pembangunan aplikasi moden. Dalam sistem teragih, terdapat banyak perkhidmatan yang memanggil satu sama lain pada masa yang sama Untuk memudahkan penyelesaian masalah dan menjejaki masalah, adalah penting untuk melaksanakan pengesanan permintaan yang diedarkan. Dalam bahasa Go, anda boleh menggunakan pakej konteks untuk melaksanakan penjejakan permintaan Artikel ini akan memperkenalkan cara menggunakan konteks untuk melaksanakan pengesanan teragih dan menggunakan kod sampel.

Apakah konteks

Dalam bahasa Go, Konteks ialah objek yang mengandungi maklumat terperinci dalam skop permintaan. Ia menyediakan cara untuk menghantar nilai berkaitan permintaan merentas berbilang goroutin, seperti ID penjejakan, tamat masa, isyarat pembatalan, dsb. Dalam sistem yang diedarkan, dengan menggunakan objek konteks, maklumat penjejakan dan permintaan boleh diikat bersama, dan ID penjejakan boleh dihantar antara berbilang perkhidmatan untuk memudahkan penyelesaian masalah dan penjejakan ralat berikutnya.

Gunakan konteks untuk menjejaki permintaan

Dalam Go, anda boleh menggunakan pakej context untuk mencipta objek dengan konteks tertentu. Pada permulaan permintaan, cipta objek konteks dan hantar ke fungsi atau goroutin berikutnya. Dengan cara ini, anda boleh mendapatkan, mengubah suai atau membatalkan objek context ini dengan mudah dalam fungsi seterusnya. context包创建一个带有特定的context对象。在一个请求开始的地方,创建一个context对象,并将它传递给后续的函数或goroutine。这样,在后续的函数中就可以方便地去获取、修改或取消这个context对象。

使用context对象设定超时时间的示例代码如下:

package main

import (
    "context"
    "fmt"
    "time"
)

func request(ctx context.Context) {
    select {
    case <-time.After(time.Second * 2):
        fmt.Println("请求成功")
    case <-ctx.Done():
        fmt.Println("请求超时")
    }
}

func main() {
    parentCtx := context.Background()
    ctx, cancel := context.WithTimeout(parentCtx, time.Second)

    go request(ctx)

    <-time.After(time.Second * 2)
    cancel()

    <-time.After(time.Second)
}

在上面的代码中,首先创建了一个context.Background()对象作为父context。然后,使用context.WithTimeout方法创建一个带有2秒超时时间的子context。接着,使用go关键字启动一个goroutine,在goroutine中执行请求逻辑,如果超时则输出"请求超时",如果请求成功则输出"请求成功"。最后,使用<-time.After函数的方式模拟耗时2秒的请求处理,然后调用cancel函数主动取消请求。

分布式追踪的应用

在分布式系统中,通过使用context对象进行追踪可以非常方便地实现请求的分布式追踪。在一个请求开始的地方,为其创建一个context对象,并生成一个唯一的追踪ID。在后续的函数或goroutine中,将追踪ID作为context的值传递给下一层调用服务,最后在服务的最底层进行追踪ID的记录。

示例代码如下:

package main

import (
    "context"
    "fmt"
    "math/rand"
    "time"
)

type TraceIDKey struct{}

func request(ctx context.Context) {
    traceID := ctx.Value(TraceIDKey{}).(string)
    fmt.Printf("请求追踪ID:%s
", traceID)
}

func callService(ctx context.Context) {
    traceID := ctx.Value(TraceIDKey{}).(string)
    fmt.Printf("调用Service,追踪ID:%s
", traceID)
    request(ctx)
}

func callDAO(ctx context.Context) {
    traceID := ctx.Value(TraceIDKey{}).(string)
    fmt.Printf("调用DAO,追踪ID:%s
", traceID)
    callService(ctx)
}

func main() {
    parentCtx := context.WithValue(context.Background(), TraceIDKey{}, generateTraceID())
    ctx := context.WithValue(parentCtx, TraceIDKey{}, generateTraceID())

    callDAO(ctx)
}

func generateTraceID() string {
    rand.Seed(time.Now().UnixNano())
    return fmt.Sprintf("%d", rand.Intn(1000))
}

在上面的代码中,定义了一个TraceIDKey类型,作为context.Value的key。然后,在main函数中首先创建了一个父context对象,并加入一个随机生成的追踪ID。接着,创建一个子context对象,并同样加入一个随机生成的追踪ID。在callDAO函数和callService函数中,通过ctx.Value(TraceIDKey{})的方式获取追踪ID并进行打印。最后,在main函数中调用callDAO

Kod sampel untuk menggunakan objek context untuk menetapkan tamat masa adalah seperti berikut:

rrreee

Dalam kod di atas, objek context.Background() dicipta buat pertama kali sebagai indukcontext. Kemudian, gunakan kaedah context.WithTimeout untuk mencipta context kanak-kanak dengan tamat masa 2 saat. Kemudian, gunakan kata kunci go untuk memulakan goroutine, laksanakan logik permintaan dalam goroutine dan keluarkan "permintaan tamat masa" jika tamat masa dan "permintaan berjaya" jika permintaan itu berjaya. Akhir sekali, gunakan fungsi <-time.After untuk mensimulasikan pemprosesan permintaan yang mengambil masa 2 saat, dan kemudian panggil fungsi batal untuk membatalkan permintaan secara aktif.

Aplikasi pengesanan teragih

Dalam sistem teragih, pengesanan teragih permintaan boleh dilaksanakan dengan mudah dengan menggunakan objek konteks untuk pengesanan. Pada permulaan permintaan, buat objek konteks untuknya dan jana ID penjejakan yang unik. Dalam fungsi atau goroutin berikutnya, ID penjejakan dihantar sebagai nilai konteks kepada perkhidmatan panggilan lapisan seterusnya, dan akhirnya ID penjejakan direkodkan pada tahap perkhidmatan yang paling rendah. 🎜🎜Kod sampel adalah seperti berikut: 🎜rrreee🎜Dalam kod di atas, jenis TraceIDKey ditakrifkan sebagai kunci konteks.Nilai. Kemudian, dalam fungsi utama, objek konteks induk dibuat terlebih dahulu dan ID penjejakan yang dijana secara rawak ditambahkan. Seterusnya, buat objek konteks kanak-kanak dan tambahkan ID penjejakan yang dijana secara rawak. Dalam fungsi callDAO dan fungsi callService, dapatkan ID penjejakan melalui ctx.Value(TraceIDKey{}) dan cetaknya. Akhir sekali, fungsi callDAO dipanggil dalam fungsi utama dan keseluruhan proses permintaan selesai. 🎜🎜Melalui kod sampel di atas, kami boleh menjejaki permintaan yang diedarkan dengan mudah dan merekodkan ID penjejakan permintaan untuk memudahkan penyelesaian masalah dan penjejakan. 🎜🎜Ringkasan🎜🎜Artikel ini memperkenalkan cara menggunakan konteks untuk melaksanakan pengesanan diedarkan permintaan dalam bahasa Go dan menyediakan kod sampel untuk digunakan. Dengan menggunakan objek konteks, maklumat penjejakan dan permintaan boleh diikat bersama, dan ID penjejakan boleh dihantar antara berbilang perkhidmatan untuk memudahkan penyelesaian masalah dan penjejakan ralat berikutnya. Kaedah pengesanan teragih menggunakan konteks adalah mudah dan cekap, dan merupakan bahagian yang amat diperlukan dalam membangunkan sistem teragih. 🎜

Atas ialah kandungan terperinci Cara menggunakan konteks untuk melaksanakan pengesanan permintaan yang diedarkan dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn