Protobuf และนิยามบริการ
อธิบาย API ของคุณด้วย proto
Protobuf และนิยามบริการ เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงใช้ gRPC และโปรโตบัฟ
gRPC คือเฟรมเวิร์ก RPC ประสิทธิภาพสูงที่สร้างบน HTTP/2 และ Protocol Buffers ใน Rust, crate tonic implement gRPC ตั้งแต่ต้นจนจบ
โปรโตบัฟคือภาษานิยามอินเทอร์เฟซ (IDL) คุณอธิบายข้อความและบริการไว้ครั้งเดียวในไฟล์ .proto จากนั้นเครื่องมือสร้างโค้ดจะสร้างสตับไคลเอนต์และเซิร์ฟเวอร์ที่มีชนิดข้อมูลชัดเจน
โครงสร้างของไฟล์ .proto
ไฟล์ proto ทุกไฟล์จะประกาศเวอร์ชันไวยากรณ์และแพ็กเกจ แพ็กเกจจะกำหนดเนมสเปซให้ชนิดข้อมูลที่สร้างขึ้นและช่วยหลีกเลี่ยงชื่อซ้ำ
ใช้ proto3 กับ tonic ชื่อแพ็กเกจจะถูกจับคู่เป็นเส้นทางโมดูล Rust หลังจากสร้างโค้ด
syntax = "proto3";
package greeter.v1;การกำหนดข้อความ
ข้อความคือระเบียนที่มีชนิดข้อมูล ฟิลด์แต่ละรายการมีชนิดข้อมูล ชื่อ และหมายเลขฟิลด์ที่ไม่ซ้ำกันสำหรับใช้เข้ารหัสบนสายส่ง
หมายเลขฟิลด์ต้องคงที่ ห้ามนำหมายเลขกลับมาใช้ใหม่หรือเปลี่ยนหมายเลขหลังจากมีข้อมูลแล้ว มิฉะนั้นจะทำให้ความเข้ากันได้เสียหาย
message HelloRequest {
string name = 1;
int32 age = 2;
}ชนิดข้อมูลสเกลาร์และการจับคู่กับ Rust
ชนิดข้อมูลสเกลาร์ของโปรโตบัฟจะจับคู่กับชนิดข้อมูล Rust ผ่าน prost โดย string กลายเป็น String, int32 กลายเป็น i32, bool กลายเป็น bool และ bytes กลายเป็น Vec<u8>
ใน proto3 สเกลาร์ทุกชนิดมีค่าเริ่มต้น เช่น สตริงว่าง 0 และ false โดยจะไม่เป็นค่าทางเลือกเว้นแต่จะระบุไว้
message Metric {
string label = 1;
double value = 2;
bool active = 3;
}การกำหนดบริการ
service จะจัดกลุ่มเมธอด RPC แต่ละ rpc จะประกาศชื่อเมธอด ข้อความคำขอ และข้อความการตอบกลับ
tonic จะสร้าง trait สำหรับเซิร์ฟเวอร์และสตรักต์ไคลเอนต์จากบล็อกนี้ การ implement trait คือวิธีที่คุณกำหนดพฤติกรรม
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloReply {
string message = 1;
}เมธอด RPC สี่รูปแบบ
gRPC รองรับรูปแบบการสตรีมสี่แบบ ได้แก่ แบบเอกเทศ การสตรีมจากเซิร์ฟเวอร์ การสตรีมจากไคลเอนต์ และการสตรีมสองทิศทาง
คุณระบุการสตรีมด้วยคีย์เวิร์ด stream ที่ด้านคำขอหรือการตอบกลับ หรือทั้งสองด้าน
service Chat {
rpc Unary (Msg) returns (Msg);
rpc ServerStream (Msg) returns (stream Msg);
rpc ClientStream (stream Msg) returns (Msg);
rpc BiDi (stream Msg) returns (stream Msg);
}Enum ในโปรโตบัฟ
Enum จะมีค่าพื้นฐานเป็นจำนวนเต็ม ใน proto3 ค่าตัวแรกต้องมีหมายเลข 0 และทำหน้าที่เป็นค่าเริ่มต้น
prost จะสร้าง enum ของ Rust พร้อมตัวช่วยสำหรับแปลงจาก i32 พื้นฐาน เนื่องจากค่าไม่รู้จักอาจเดินทางเข้ามาบนสายส่งได้
enum Status {
STATUS_UNKNOWN = 0;
STATUS_ACTIVE = 1;
STATUS_BANNED = 2;
}ฟิลด์แบบซ้อนและแบบซ้ำ
ฟิลด์ repeated คือรายการ และจะจับคู่กับ Vec<T> ใน Rust ข้อความสามารถซ้อนกันหรืออ้างอิงด้วยชื่อได้
วิธีนี้ช่วยให้คุณสร้างแบบจำลองคอลเลกชันและข้อมูลประกอบได้โดยไม่ต้องมีขั้นตอนเพิ่มเติมมากมาย
message Order {
string id = 1;
repeated Item items = 2;
}
message Item {
string sku = 1;
int32 qty = 2;
}ชนิดข้อมูลว่างและชนิดข้อมูลที่รู้จักกันดี
สำหรับเมธอดที่รับหรือคืนค่าไม่มีข้อมูล ให้นำเข้า google/protobuf/empty.proto และใช้ Empty
ชนิดข้อมูลที่รู้จักกันดีอื่น ๆ ได้แก่ Timestamp และ Duration โดย tonic มีคำจำกัดความเหล่านี้มาให้ คุณจึงนำเข้าได้ในกระบวนการสร้าง
import "google/protobuf/empty.proto";
service Health {
rpc Ping (google.protobuf.Empty) returns (google.protobuf.Empty);
}การกำหนดเวอร์ชันด้วยแพ็กเกจ
การใส่เวอร์ชันไว้ในแพ็กเกจ เช่น greeter.v1 ช่วยให้คุณพัฒนา API ได้อย่างปลอดภัย การเปลี่ยนแปลงที่ทำให้เข้ากันไม่ได้จะอยู่ใน greeter.v2 ขณะที่ v1 ยังคงให้บริการต่อไป
รูปแบบนี้ช่วยให้โมดูล Rust ที่สร้างขึ้นสะอาดและอยู่ร่วมกันได้ ได้แก่ greeter::v1 และ greeter::v2
package greeter.v1;
// later, a parallel file:
// package greeter.v2;กฎความเข้ากันได้ของฟิลด์
การเพิ่มฟิลด์ใหม่ด้วยหมายเลขใหม่จะเข้ากันได้ย้อนหลัง ไคลเอนต์เก่าจะละเว้นฟิลด์นั้น การลบฟิลด์มีความเสี่ยง เว้นแต่คุณจะ reserve หมายเลขและชื่อของมันไว้
การจองจะป้องกันไม่ให้ใครนำหมายเลขฟิลด์ที่เลิกใช้แล้วกลับมาใช้ใหม่และทำให้การถอดรหัสเสียหาย
message User {
reserved 3, 5;
reserved "legacy_token";
string id = 1;
string email = 2;
}ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับการกำหนดบริการใน proto3
สรุปทบทวน
คุณได้กำหนดบริการและข้อความใน proto3 แล้ว ได้แก่ หมายเลขฟิลด์ที่คงที่ การจับคู่ชนิดข้อมูลสเกลาร์กับ Rust, enum, ฟิลด์แบบซ้ำและแบบซ้อน รูปแบบ RPC ทั้งสี่ ชนิดข้อมูลที่รู้จักกันดี และการกำหนดเวอร์ชันผ่านแพ็กเกจ
ถัดไป คุณจะเปลี่ยนคำจำกัดความเหล่านี้เป็นโค้ด Rust ด้วย tonic-build
เรียนรู้ Rust ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 39
- บทเรียน
- 144
คำถามที่พบบ่อย
บทเรียน “Protobuf และนิยามบริการ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Protobuf และนิยามบริการ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Protobuf และนิยามบริการ”
อธิบาย API ของคุณด้วย proto คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “Protobuf และนิยามบริการ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม
ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Protobuf และนิยามบริการ
- สร้างโค้ดด้วย tonic-build
- สร้างเซิร์ฟเวอร์ gRPC
- เรียกใช้จากไคลเอนต์ gRPC