0Pricing
Go Academy · บทเรียน

อินเตอร์เซปเตอร์และข้อมูลเมทาดาทาของ gRPC

มิดเดิลแวร์สำหรับการยืนยันตัวตน การบันทึก และเมทาดาทาของ gRPC

อินเตอร์เซปเตอร์และข้อมูลเมทาดาทาของ gRPC เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

อินเตอร์เซปเตอร์คืออะไร

อินเตอร์เซปเตอร์ของ gRPC (มิดเดิลแวร์) ทำงานก่อนหรือหลังตัวจัดการ RPC อินเตอร์เซปเตอร์ช่วยเพิ่มข้อกังวลร่วม เช่น การบันทึกข้อมูล การตรวจสอบโทเค็นยืนยันตัวตน เมตริก การกู้คืนจากแพนิก และการติดตามร่องรอย

อินเตอร์เซปเตอร์ของเซิร์ฟเวอร์แบบเอกภาค

อินเตอร์เซปเตอร์ของเซิร์ฟเวอร์แบบเอกภาคจะครอบตัวจัดการด้วยตรรกะเพิ่มเติม:

func LoggingInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
    log.Printf("RPC: %s", info.FullMethod)
    resp, err := handler(ctx, req)
    log.Printf("done: %v", err)
    return resp, err
}

grpcSrv := grpc.NewServer(grpc.UnaryInterceptor(LoggingInterceptor))

อินเตอร์เซปเตอร์ของเซิร์ฟเวอร์แบบสตรีม

ทำงานคล้ายแบบเอกภาค แต่ครอบตัวจัดการสตรีม:

func StreamLogging(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
    log.Printf("stream: %s", info.FullMethod)
    return handler(srv, ss)
}

การเชื่อมอินเตอร์เซปเตอร์

ใช้ grpc.ChainUnaryInterceptor (Go gRPC รุ่น 1.38 ขึ้นไป) เพื่อใช้อินเตอร์เซปเตอร์หลายตัวตามลำดับ:

grpcSrv := grpc.NewServer(
    grpc.ChainUnaryInterceptor(LoggingInterceptor, AuthInterceptor, MetricsInterceptor),
)

อินเตอร์เซปเตอร์ของไคลเอนต์

อินเตอร์เซปเตอร์แบบเอกภาคฝั่งไคลเอนต์จะครอบการเรียกขาออก ซึ่งมีประโยชน์สำหรับการแทรกโทเค็นยืนยันตัวตน การลองใหม่ หรือส่วนหัวสำหรับการติดตามร่องรอย:

conn, _ := grpc.NewClient(addr,
    grpc.WithUnaryInterceptor(ClientAuthInterceptor),
    grpc.WithTransportCredentials(insecure.NewCredentials()),
)

ข้อมูลเมตาของ gRPC

ข้อมูลเมตาคือคู่คีย์-ค่าที่ส่งไปพร้อมกับ RPC ซึ่งทำหน้าที่คล้ายส่วนหัวของ HTTP ใช้ metadata.New และ metadata.NewOutgoingContext บนไคลเอนต์

md := metadata.New(map[string]string{"authorization": "Bearer " + token})
ctx := metadata.NewOutgoingContext(context.Background(), md)

การอ่านข้อมูลเมตาบนเซิร์ฟเวอร์

ดึงข้อมูลเมตาขาเข้าด้วย metadata.FromIncomingContext:

md, ok := metadata.FromIncomingContext(ctx)
if !ok { return nil, status.Error(codes.Unauthenticated, "no metadata") }
token := md["authorization"]

การส่งข้อมูลเมตาจากเซิร์ฟเวอร์

ส่งส่วนหัวการตอบกลับและส่วนท้ายจากเซิร์ฟเวอร์ด้วย grpc.SetHeader และ grpc.SetTrailer:

grpc.SetHeader(ctx, metadata.Pairs("x-request-id", requestID))

go-grpc-middleware

ไลบรารี github.com/grpc-ecosystem/go-grpc-middleware/v2 มีอินเตอร์เซปเตอร์สำเร็จรูป เช่น การกู้คืน การบันทึกข้อมูล (zap/logrus) การยืนยันตัวตน และอื่น ๆ

รูปแบบอินเตอร์เซปเตอร์สำหรับการยืนยันตัวตน

ดึงและตรวจสอบโทเค็นในอินเตอร์เซปเตอร์ จากนั้นแนบผู้ใช้ไปกับบริบทเพื่อให้ตัวจัดการปลายทางใช้งาน:

func AuthInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
    md, _ := metadata.FromIncomingContext(ctx)
    if !validateToken(md["authorization"]) {
        return nil, status.Error(codes.Unauthenticated, "invalid token")
    }
    return handler(ctx, req)
}

อินเตอร์เซปเตอร์สำหรับกู้คืนจากแพนิก

ครอบตัวจัดการเพื่อกู้คืนจากแพนิกและส่งคืนข้อผิดพลาด Internal แทนการทำงานล้มเหลว:

defer func() {
    if r := recover(); r != nil {
        err = status.Errorf(codes.Internal, "panic: %v", r)
    }
}()

ตรวจสอบความเข้าใจอย่างรวดเร็ว

คุณส่งโทเค็นยืนยันตัวตนระหว่างไคลเอนต์และเซิร์ฟเวอร์ gRPC ได้อย่างไร

สรุป: อินเตอร์เซปเตอร์และข้อมูลเมตาของ gRPC

ประเด็นสำคัญ:

  • อินเตอร์เซปเตอร์แบบเอกภาค: func(ctx, req, info, handler) (resp, error)
  • grpc.ChainUnaryInterceptor สำหรับอินเตอร์เซปเตอร์หลายตัว
  • ข้อมูลเมตาคือคู่คีย์-ค่า ซึ่งทำหน้าที่คล้ายส่วนหัวของ HTTP
  • อินเตอร์เซปเตอร์สำหรับการยืนยันตัวตน: ดึงข้อมูลเมตา → ตรวจสอบ → เพิ่มผู้ใช้ลงในบริบท

คำถามที่พบบ่อย

บทเรียน “อินเตอร์เซปเตอร์และข้อมูลเมทาดาทาของ gRPC” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “อินเตอร์เซปเตอร์และข้อมูลเมทาดาทาของ gRPC” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “อินเตอร์เซปเตอร์และข้อมูลเมทาดาทาของ gRPC”

มิดเดิลแวร์สำหรับการยืนยันตัวตน การบันทึก และเมทาดาทาของ gRPC คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “อินเตอร์เซปเตอร์และข้อมูลเมทาดาทาของ gRPC” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Protocol Buffers และไฟล์ .proto
  2. การใช้งานบริการ gRPC แบบเอกภาคี
  3. การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์
  4. อินเตอร์เซปเตอร์และข้อมูลเมทาดาทาของ gRPC
← กลับไปที่ Go Academy