Lär dig programmera i Rust · Lektion

Protobuf- och tjänstedefinitioner

Beskriv Ert API i proto.

Lektion 1 av 413 steg

Protobuf- och tjänstedefinitioner är en gratis lektion i Lär dig programmera i Rust på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Lär dig programmera i Rust, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Lär dig programmera i Rust innehåller totalt 4 lektioner.

Varför gRPC och Protobuf

gRPC är ett högpresterande RPC-ramverk som bygger på HTTP/2 och Protocol Buffers. I Rust implementerar cratet tonic gRPC från början till slut.

Protobuf är ett språk för gränssnittsdefinitioner (IDL). Ni beskriver meddelanden och tjänster en gång i en .proto-fil, och kodgeneratorer skapar strikt typade klient- och serverskelett.

En .proto-fils uppbyggnad

Varje proto-fil deklarerar en syntaxversion och ett paket. Paketet namnger de genererade typerna och undviker kollisioner.

Använd proto3 med tonic. Paketnamnet motsvarar en Rust-modulsökväg efter genereringen.

syntax = "proto3";

package greeter.v1;

Definiera meddelanden

Ett meddelande är en typad post. Varje fält har en typ, ett namn och ett unikt fältnummer som används vid kodning på tråden.

Fältnummer måste vara stabila: återanvänd eller numrera aldrig om ett fält när data väl finns, eftersom kompatibiliteten då bryts.

message HelloRequest {
  string name = 1;
  int32 age = 2;
}

Skalära typer och Rust-mappning

Protobufs skalära typer mappas till Rust-typer via prost. string blir String, int32 blir i32, bool blir bool och bytes blir Vec<u8>.

I proto3 har varje skalär typ ett standardvärde (tom sträng, 0, false); de är inte valfria om de inte markeras som sådana.

message Metric {
  string label = 1;
  double value = 2;
  bool active = 3;
}

Definiera en tjänst

En service grupperar RPC-metoder. Varje rpc deklarerar ett metodnamn, ett request-meddelande och ett response-meddelande.

tonic genererar ett servertrait och en klientstruct från detta block. Genom att implementera traitet tillhandahåller ni beteendet.

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloReply {
  string message = 1;
}

Fyra typer av RPC-metoder

gRPC stöder fyra strömningsformer: unary, serverströmning, klientströmning och dubbelriktad strömning.

Ni anger en ström genom nyckelordet stream på request- eller response-sidan, eller på båda.

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);
}

Enumtyper i Protobuf

Enumtyper lagras som heltal. I proto3 måste det första värdet ha numret 0 och fungerar som standardvärde.

prost genererar en Rust-enum samt hjälpmetoder för konvertering från den underliggande i32-typen, eftersom okända värden kan komma över tråden.

enum Status {
  STATUS_UNKNOWN = 0;
  STATUS_ACTIVE = 1;
  STATUS_BANNED = 2;
}

Nästlade och upprepade fält

Ett repeated-fält är en lista och mappas till Vec<T> i Rust. Meddelanden kan vara nästlade eller refereras till med namn.

Detta gör att ni kan modellera samlingar och sammansatta nyttolaster utan extra omständigheter.

message Order {
  string id = 1;
  repeated Item items = 2;
}

message Item {
  string sku = 1;
  int32 qty = 2;
}

Empty och välkända typer

För metoder som inte tar emot eller returnerar något importerar ni google/protobuf/empty.proto och använder Empty.

Andra välkända typer är bland annat Timestamp och Duration. tonic levererar dessa definitioner, så att ni kan importera dem i ert bygge.

import "google/protobuf/empty.proto";

service Health {
  rpc Ping (google.protobuf.Empty) returns (google.protobuf.Empty);
}

Versionshantering med paket

Genom att lägga en version i paketet, till exempel greeter.v1, kan ni vidareutveckla ett API på ett säkert sätt. En inkompatibel ändring läggs i greeter.v2 medan v1 fortsätter att betjäna anrop.

Denna konvention håller de genererade Rust-modulerna rena: greeter::v1 och greeter::v2 kan samexistera.

package greeter.v1;
// later, a parallel file:
// package greeter.v2;

Regler för fältkompatibilitet

Att lägga till ett nytt fält med ett nytt nummer är bakåtkompatibelt; gamla klienter ignorerar det. Att ta bort ett fält är riskabelt om ni inte reserve-markerar dess nummer och namn.

Reserveringen förhindrar att någon återanvänder ett pensionerat fältnummer och förstör avkodningen.

message User {
  reserved 3, 5;
  reserved "legacy_token";
  string id = 1;
  string email = 2;
}

Snabbtest

Testa er förståelse av proto3-tjänstdefinitioner.

Sammanfattning

Ni definierade tjänster och meddelanden i proto3: stabila fältnummer, mappningar från skalära typer till Rust, enumtyper, upprepade och nästlade fält, de fyra RPC-formerna, välkända typer och versionshantering via paket.

Nästa steg är att omvandla dessa definitioner till Rust-kod med tonic-build.

Gratis att börja

Lär dig Rust med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
39
Lektioner
144

Vanliga frågor

Är lektionen ”Protobuf- och tjänstedefinitioner” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Lär dig programmera i Rust, inklusive ”Protobuf- och tjänstedefinitioner”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Lär dig programmera i Rust innehåller totalt 4 lektioner.

Vad lär jag mig i ”Protobuf- och tjänstedefinitioner”?

Beskriv Ert API i proto. Ni övar på Lär dig programmera i Rust med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Lär dig programmera i Rust?

Du behöver inga förkunskaper. Utbildningen i Lär dig programmera i Rust på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.

Hur lång tid tar lektionen ”Protobuf- och tjänstedefinitioner”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Lär dig programmera i Rust-lektionen?

Ja. Varje Lär dig programmera i Rust-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Protobuf- och tjänstedefinitioner
  2. Generera kod med tonic-build
  3. Implementera en gRPC-server
  4. Anropa från en gRPC-klient
← Tillbaka till Lär dig programmera i Rust