Protobuf- och tjänstedefinitioner
Beskriv Ert API i proto.
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.
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
- Protobuf- och tjänstedefinitioner
- Generera kod med tonic-build
- Implementera en gRPC-server
- Anropa från en gRPC-klient