ข้ามไปยังเนื้อหา

Implementing a Server

codegen ให้ server interface ที่มี method หนึ่งตัวต่อ rpc มาแล้ว การ implement server มี 3 ขั้นตอนเหมือนเดิมเสมอ:

  1. Implement handler — เขียน body ของ GetUser: รับ request คืน response (หรือ error)
  2. Register implementation ของคุณเข้ากับ gRPC server object
  3. Serve — bind กับ port แล้วเริ่มรับ HTTP/2 connection
flowchart LR
  client["client stub"] -->|GetUserRequest| server["gRPC server
(listening on :50051)"]
  server -->|dispatch by method| handler["your GetUser handler"]
  handler -->|User| server
  server -->|response| client
request ไปถึง handler ของคุณอย่างไร

gRPC server จัดการเรื่อง HTTP/2, การ decode protobuf และการ dispatch method ให้ทั้งหมด handler ของคุณเห็นแค่ typed request แล้วคืน typed response

นี่คือทั้งหมด — handler, registration และ serve — สำหรับ UserService.GetUser:

type server struct {
userv1.UnimplementedUserServiceServer // forward-compat embedding
}
// GetUser is the handler: request in, response out.
func (s *server) GetUser(ctx context.Context, req *userv1.GetUserRequest) (*userv1.User, error) {
// (normally you'd look this up in a database)
return &userv1.User{
Id: req.Id,
Name: "Ada Lovelace",
}, nil
}
func main() {
lis, _ := net.Listen("tcp", ":50051")
s := grpc.NewServer()
userv1.RegisterUserServiceServer(s, &server{}) // register
log.Println("listening on :50051")
s.Serve(lis) // serve
}

เมื่อมีอะไรผิดพลาด คุณจะไม่ throw exception มั่ว ๆ — แต่คืน gRPC status user ที่หาไม่เจอคือ NOT_FOUND, input ที่ผิดคือ INVALID_ARGUMENT error model มีบทเรียนของตัวเองในโมดูล Service Definition นิสัยสำคัญที่ควรเริ่มตอนนี้คือ map ความล้มเหลวไปเป็น status code อย่างตั้งใจ เพราะ status นั้นคือสิ่งที่ err ฝั่ง client จะได้รับ

เพราะ server ทำงานบน HTTP/2 multiplexing หลาย call จึงวิ่งเข้า handler ของคุณพร้อมกันบน connection เดียวกัน ใน Go แต่ละ call รันใน goroutine ของตัวเอง; ใน Python มี thread pool คอย serve; ใน Node event loop สลับกันจัดการ นั่นแปลว่า handler ของคุณต้องรันพร้อมกันได้อย่างปลอดภัย — ห้ามมี shared mutable state ที่ไม่ได้ป้องกันด้วย synchronization

implement gRPC server มี 3 ขั้นตอนอะไรบ้าง?
handler ของคุณรับและคืนอะไร?
handler ควรบอกว่าหา user ไม่เจออย่างไร?
ทำไม gRPC handler ต้องปลอดภัยต่อ concurrency?