Learn Rust Coding · Lezione

Protobuf e definizioni dei servizi

Descriva la Sua API in proto.

Lezione 1 di 413 passaggi

Protobuf e definizioni dei servizi è una lezione Learn Rust Coding gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Learn Rust Coding, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Learn Rust Coding include 4 lezioni in totale.

Perché gRPC e Protobuf

gRPC è un framework RPC ad alte prestazioni basato su HTTP/2 e Protocol Buffers. In Rust, il crate tonic implementa gRPC dall'inizio alla fine.

Protobuf è il linguaggio di definizione delle interfacce (IDL). Si descrivono messaggi e servizi una sola volta in un file .proto, quindi i generatori di codice producono stub client e server fortemente tipizzati.

Anatomia di un file .proto

Ogni file proto dichiara una versione della sintassi e un package. Il package assegna uno spazio dei nomi ai tipi generati ed evita le collisioni.

Usi proto3 con tonic. Dopo la generazione, il nome del package viene mappato su un percorso di modulo Rust.

syntax = "proto3";

package greeter.v1;

Definire i messaggi

Un messaggio è un record tipizzato. Ogni campo ha un tipo, un nome e un numero di campo univoco utilizzato per la codifica sul wire.

I numeri dei campi devono rimanere stabili: non riutilizzi né rinumeri mai un campo dopo che esistono dati, altrimenti interromperebbe la compatibilità.

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

Tipi scalari e mapping in Rust

Gli scalari Protobuf vengono mappati sui tipi Rust tramite prost. string diventa String, int32 diventa i32, bool diventa bool e bytes diventa Vec<u8>.

In proto3 ogni scalare ha un valore predefinito (stringa vuota, 0, false); non è facoltativo se non viene contrassegnato come tale.

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

Definire un servizio

Un service raggruppa i metodi RPC. Ogni rpc dichiara il nome del metodo, un messaggio di richiesta e un messaggio di risposta.

Da questo blocco tonic genera un trait server e una struct client. Implementare il trait è il modo in cui si fornisce il comportamento.

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

message HelloReply {
  string message = 1;
}

Quattro tipi di metodi RPC

gRPC supporta quattro forme di streaming: unaria, streaming dal server, streaming dal client e streaming bidirezionale.

Si indica uno stream con la parola chiave stream sul lato della richiesta o della risposta, oppure su entrambi.

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 in Protobuf

Gli enum sono supportati da interi. In proto3 il primo valore deve avere il numero 0 e funge da valore predefinito.

prost genera un enum Rust e gli helper per convertire dal sottostante i32, poiché sulla rete possono arrivare valori sconosciuti.

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

Campi annidati e ripetuti

Un campo repeated è una lista e viene mappato su Vec<T> in Rust. I messaggi possono essere annidati oppure referenziati per nome.

In questo modo è possibile modellare collezioni e payload compositi senza ulteriore complessità.

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

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

Empty e tipi well-known

Per i metodi che non ricevono né restituiscono nulla, importi google/protobuf/empty.proto e usi Empty.

Altri tipi well-known includono Timestamp e Duration. tonic include queste definizioni, che possono quindi essere importate nella build.

import "google/protobuf/empty.proto";

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

Versionamento con i package

Inserire una versione nel package, ad esempio greeter.v1, consente di evolvere un'API in sicurezza. Una modifica incompatibile viene inserita in greeter.v2, mentre v1 continua a funzionare.

Questa convenzione mantiene ordinati i moduli Rust generati: greeter::v1 e greeter::v2 possono coesistere.

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

Regole di compatibilità dei campi

Aggiungere un nuovo campo con un numero inedito è compatibile a ritroso; i client meno recenti lo ignorano. Rimuovere un campo è rischioso, a meno che non si riservino il relativo numero e nome con reserve.

La riserva impedisce a chiunque di riutilizzare un numero di campo ritirato e corrompere la decodifica.

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

Verifica rapida

Verifichi la propria comprensione delle definizioni dei servizi proto3.

Riepilogo

Ha definito servizi e messaggi in proto3: numeri di campo stabili, mapping da scalari a Rust, enum, campi ripetuti e annidati, le quattro forme RPC, tipi well-known e versionamento tramite package.

Ora trasformerà queste definizioni in codice Rust con tonic-build.

Gratis per iniziare

Impara Rust con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
39
Lezioni
144

Domande Frequenti

La lezione «Protobuf e definizioni dei servizi» è gratuita?

Sì — il testo completo di «Protobuf e definizioni dei servizi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Learn Rust Coding, passa a CoddyKit PRO. Il corso Learn Rust Coding include 4 lezioni in totale.

Cosa imparerò in «Protobuf e definizioni dei servizi»?

Descriva la Sua API in proto. Eserciti Learn Rust Coding con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Learn Rust Coding?

Non è richiesta alcuna esperienza precedente. Learn Rust Coding su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Protobuf e definizioni dei servizi»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Learn Rust Coding?

Sì. Ogni lezione Learn Rust Coding include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Protobuf e definizioni dei servizi
  2. Generare codice con tonic-build
  3. Implementare un server gRPC
  4. Effettuare chiamate da un client gRPC
← Torna a Learn Rust Coding