Learn Rust Coding · บทเรียน

Protobuf และนิยามบริการ

อธิบาย API ของคุณด้วย proto

บทเรียน 1 จาก 413 ขั้นตอน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. Protobuf และนิยามบริการ
  2. สร้างโค้ดด้วย tonic-build
  3. สร้างเซิร์ฟเวอร์ gRPC
  4. เรียกใช้จากไคลเอนต์ gRPC
← กลับไปที่ Learn Rust Coding