[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-grpc-api-websocket-chat-all--*":3,"academy-blog-translations-bitybyhkfcc4nmj":79},{"data":4,"page":67,"perPage":67,"totalItems":67,"totalPages":67},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":73,"keywords":74,"locale":49,"published_at":75,"scheduled_at":13,"school_blog":71,"short_description":76,"slug":77,"status":69,"title":6,"updated":78,"updated_by":13,"views":72},"EP.69: การใช้ gRPC ในการพัฒนา API สำหรับ WebSocket Chat","sclblg987654321","school_blog_translations","\u003Cp>ใน EP.69 นี้เราจะพูดถึงการใช้ gRPC ในการพัฒนา API สำหรับ WebSocket Chat เพื่อเพิ่มประสิทธิภาพในการสื่อสารระหว่าง WebSocket Server และ Client. gRPC เป็นเฟรมเวิร์กที่พัฒนาโดย Google ซึ่งใช้ Protocol Buffers (protobuf) ในการทำงาน ซึ่งทำให้การสื่อสารมีความเร็วและประสิทธิภาพสูงกว่าการใช้ REST API แบบเดิม.\u003C\u002Fp>\u003Cp>การใช้ gRPC ช่วยให้เราสามารถจัดการกับการส่งข้อมูลในรูปแบบเรียลไทม์ได้อย่างมีประสิทธิภาพ เหมาะสำหรับการใช้งานในแอปพลิเคชันที่ต้องการการสื่อสารที่รวดเร็ว เช่น WebSocket Chat ที่ต้องการการแลกเปลี่ยนข้อความและข้อมูลแบบต่อเนื่อง\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>ทำไมต้องใช้ gRPC ใน WebSocket Chat?\u003C\u002Fh2>\u003Cp>gRPC มีหลายข้อดีที่ช่วยให้การพัฒนา WebSocket Chat ทำได้ง่ายขึ้นและมีประสิทธิภาพสูงขึ้น:\u003C\u002Fp>\u003Col>\u003Cli>ประสิทธิภาพสูง: เนื่องจาก gRPC ใช้ Protocol Buffers ซึ่งเป็นรูปแบบบันทึกข้อมูลที่มีขนาดเล็กและบีบอัดได้ดีกว่า JSON ที่ใช้ใน REST API\u003C\u002Fli>\u003Cli>การสื่อสารแบบเรียลไทม์: รองรับการส่งข้อมูลแบบ bidirectional streaming ซึ่งเหมาะสำหรับการส่งข้อความแบบเรียลไทม์ใน WebSocket\u003C\u002Fli>\u003Cli>ลดความหน่วง: gRPC ถูกออกแบบมาให้มี latency ต่ำ และ throughput สูง, เหมาะสำหรับแอปพลิเคชันที่ต้องการความเร็วในการสื่อสาร\u003C\u002Fli>\u003Cli>รองรับหลายภาษา: gRPC รองรับหลายภาษา ซึ่งทำให้สามารถพัฒนาเซิร์ฟเวอร์และไคลเอนต์ในหลายภาษาได้อย่างง่ายดาย\u003C\u002Fli>\u003Cli>ความปลอดภัย: gRPC มีการเข้ารหัส SSL\u002FTLS ในตัว, ซึ่งทำให้การสื่อสารมีความปลอดภัยสูง\u003C\u002Fli>\u003C\u002Fol>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>การสร้าง API ด้วย gRPC สำหรับ WebSocket Chat\u003C\u002Fh2>\u003Cp>ในส่วนนี้เราจะสร้าง gRPC API สำหรับ WebSocket Chat เพื่อให้สามารถส่งข้อความและข้อมูลต่างๆ ระหว่าง Server และ Client.\u003C\u002Fp>\u003Ch3>1. สร้างไฟล์ .proto สำหรับกำหนด API\u003C\u002Fh3>\u003Cp>เราจะเริ่มต้นด้วยการสร้างไฟล์ \u003Ccode inline=\"\">.proto\u003C\u002Fcode> ที่จะใช้ในการกำหนด service และ message types ในการสื่อสารระหว่าง Server และ Client.\u003C\u002Fp>\u003Cp>chat.proto:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext language-proto\">syntax = \"proto3\";\n\npackage chat;\n\nservice ChatService {\n    rpc SendMessage (MessageRequest) returns (MessageResponse);\n    rpc ReceiveMessages (MessageRequest) returns (stream MessageResponse);\n}\n\nmessage MessageRequest {\n    string user = 1;\n    string message = 2;\n}\n\nmessage MessageResponse {\n    string user = 1;\n    string message = 2;\n    string timestamp = 3;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>2. การสร้างโค้ด Server ด้วย gRPC\u003C\u002Fh3>\u003Cp>หลังจากที่สร้างไฟล์ \u003Ccode inline=\"\">.proto\u003C\u002Fcode> แล้ว ให้ใช้คำสั่ง \u003Ccode inline=\"\">protoc\u003C\u002Fcode> เพื่อสร้างโค้ด gRPC server:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext language-bash\">protoc --go_out=plugins=grpc:. chat.proto\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>ตอนนี้เราจะสร้าง gRPC Server ที่รองรับการส่งและรับข้อความ:\u003C\u002Fp>\u003Cp>server.go:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport (\n    \"fmt\"\n    \"log\"\n    \"net\"\n    \"google.golang.org\u002Fgrpc\"\n    pb \"path\u002Fto\u002Fgenerated\u002Fproto\"\n    \"context\"\n)\n\ntype server struct{}\n\nfunc (s *server) SendMessage(ctx context.Context, in *pb.MessageRequest) (*pb.MessageResponse, error) {\n    return &amp;pb.MessageResponse{\n        User:     in.User,\n        Message:  in.Message,\n        Timestamp: fmt.Sprintf(\"%v\", time.Now()),\n    }, nil\n}\n\nfunc (s *server) ReceiveMessages(in *pb.MessageRequest, stream pb.ChatService_ReceiveMessagesServer) error {\n    for {\n        time.Sleep(1 * time.Second)\n        err := stream.Send(&amp;pb.MessageResponse{\n            User:    \"Server\",\n            Message: \"Hello, \" + in.User,\n            Timestamp: fmt.Sprintf(\"%v\", time.Now()),\n        })\n        if err != nil {\n            return err\n        }\n    }\n}\n\nfunc main() {\n    lis, err := net.Listen(\"tcp\", \":50051\")\n    if err != nil {\n        log.Fatalf(\"failed to listen: %v\", err)\n    }\n    s := grpc.NewServer()\n    pb.RegisterChatServiceServer(s, &amp;server{})\n    if err := s.Serve(lis); err != nil {\n        log.Fatalf(\"failed to serve: %v\", err)\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>3. การสร้าง WebSocket Client สำหรับ gRPC\u003C\u002Fh3>\u003Cp>ตอนนี้เราจะสร้าง Client ที่เชื่อมต่อกับ gRPC Server เพื่อส่งและรับข้อมูล:\u003C\u002Fp>\u003Cp>client.go:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport (\n    \"fmt\"\n    \"log\"\n    \"google.golang.org\u002Fgrpc\"\n    pb \"path\u002Fto\u002Fgenerated\u002Fproto\"\n    \"context\"\n)\n\nfunc main() {\n    conn, err := grpc.Dial(\":50051\", grpc.WithInsecure())\n    if err != nil {\n        log.Fatalf(\"Did not connect: %v\", err)\n    }\n    defer conn.Close()\n\n    c := pb.NewChatServiceClient(conn)\n\n    \u002F\u002F SendMessage Example\n    resp, err := c.SendMessage(context.Background(), &amp;pb.MessageRequest{User: \"John\", Message: \"Hello!\"})\n    if err != nil {\n        log.Fatalf(\"Could not send message: %v\", err)\n    }\n    fmt.Println(\"Message Response:\", resp.Message)\n\n    \u002F\u002F ReceiveMessages Example\n    stream, err := c.ReceiveMessages(context.Background(), &amp;pb.MessageRequest{User: \"John\"})\n    if err != nil {\n        log.Fatalf(\"Could not receive messages: %v\", err)\n    }\n\n    for {\n        msg, err := stream.Recv()\n        if err != nil {\n            log.Fatalf(\"Error receiving message: %v\", err)\n        }\n        fmt.Println(\"Received Message:\", msg.Message)\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>การทดสอบ gRPC API\u003C\u002Fh2>\u003Cp>หลังจากการพัฒนาแล้ว การทดสอบ gRPC API เป็นสิ่งสำคัญที่ต้องทำ:\u003C\u002Fp>\u003Col>\u003Cli>ทดสอบการส่งข้อความ: ทดสอบว่า Client สามารถส่งข้อความไปยัง Server ได้และได้รับการตอบกลับอย่างถูกต้อง\u003C\u002Fli>\u003Cli>ทดสอบการรับข้อความ: ทดสอบว่า Server สามารถส่งข้อมูลไปยัง Client ได้อย่างต่อเนื่องและไม่มีข้อผิดพลาด\u003C\u002Fli>\u003Cli>ทดสอบประสิทธิภาพ: ทดสอบเวลาในการส่งและรับข้อมูลโดยใช้ gRPC และเปรียบเทียบกับการใช้ REST API แบบเดิม\u003C\u002Fli>\u003C\u002Fol>\u003Cp>&nbsp;\u003C\u002Fp>\u003Chr>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>ท้าให้ลอง!\u003C\u002Fh3>\u003Cp>ลองเพิ่ม \u003Cstrong>Authentication ด้วย JWT\u003C\u002Fstrong> ในการเชื่อมต่อ gRPC เพื่อเพิ่มความปลอดภัยให้กับระบบ \u003Cstrong>WebSocket Chat\u003C\u002Fstrong> ของคุณ!\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong data-start=\"255\" data-end=\"268\">EP ถัดไป:\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp data-start=\"269\" data-end=\"447\" data-is-last-node=\"\" data-is-only-node=\"\">ใน \u003Cstrong data-start=\"272\" data-end=\"281\">EP.70\u003C\u002Fstrong> เราจะมาดู \u003Cstrong data-start=\"292\" data-end=\"360\">การปรับปรุงประสิทธิภาพ WebSocket Server ด้วยการใช้ Load Balancer\u003C\u002Fstrong> เพื่อเพิ่มความสามารถในการรองรับการเชื่อมต่อจำนวนมากและกระจายโหลดได้อย่างมีประสิทธิภาพ!\u003C\u002Fp>","109_11zon_kclg4irkdb.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fdybkvw9fcyi4r0d\u002F109_11zon_kclg4irkdb.webp","2026-03-04 08:48:07.930Z","",{"keywords":15,"locale":43,"school_blog":53},[16,23,28,33,38],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:48:05.933Z","u3p6qwqfjlbecdp","gRPC WebSocket","2026-04-10 16:13:40.266Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:48:07.088Z","brfbypclggbbkcx","WebSocket API","2026-04-10 16:13:40.594Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:48:07.292Z","ydqrw1or02rlp64","gRPC Go","2026-04-10 16:13:40.693Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:47:27.531Z","8i5bikzi4dzlpgq","WebSocket real-time communication","2026-04-10 16:13:28.896Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:48:07.610Z","4fbrfoz17xzj40y","Protocol Buffers","2026-04-10 16:13:40.798Z",{"code":44,"collectionId":45,"collectionName":46,"created":47,"flag":48,"id":49,"is_default":50,"label":51,"updated":52},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":54,"collectionId":55,"collectionName":56,"expand":57,"id":71,"views":72},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs",{"category":58},{"blogIds":59,"collectionId":60,"collectionName":61,"created":62,"created_by":13,"id":54,"image":63,"image_alt":13,"image_path":64,"label":65,"name":66,"priority":67,"publish_at":68,"scheduled_at":13,"status":69,"updated":70,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:33:53.210Z","59ty92ns80w_15oc1implw.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fwqxt7ag2gn7xcmk\u002F59ty92ns80w_15oc1implw.png",{"en":66,"th":66},"Golang The Series",1,"2026-03-16 04:39:38.440Z","published","2026-04-25 02:32:15.470Z","bitybyhkfcc4nmj",259,"dybkvw9fcyi4r0d",[20,25,30,35,40],"2025-07-28 10:12:29.825Z","เรียนรู้วิธีการใช้ gRPC เพื่อพัฒนา API สำหรับ WebSocket Chat โดยเน้นการส่งข้อมูลอย่างมีประสิทธิภาพและการสื่อสารที่เร็วขึ้นระหว่างเซิร์ฟเวอร์และลูกค้า!","grpc-api-websocket-chat","2026-04-22 07:10:08.538Z",{"th":77}]