อินเตอร์เซปเตอร์และข้อมูลเมทาดาทาของ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Protocol Buffers และไฟล์ .proto
- การใช้งานบริการ gRPC แบบเอกภาคี
- การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์
- อินเตอร์เซปเตอร์และข้อมูลเมทาดาทาของ gRPC