Protobuf y definiciones de servicios
Describa su API en proto
Protobuf y definiciones de servicios es una lección gratuita de Learn Rust Coding en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Learn Rust Coding, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Learn Rust Coding incluye 4 lecciones en total.
Por qué gRPC y Protobuf
gRPC es un framework de RPC de alto rendimiento basado en HTTP/2 y Protocol Buffers. En Rust, el crate tonic implementa gRPC de extremo a extremo.
Protobuf es el lenguaje de definición de interfaces (IDL). Describa los mensajes y servicios una sola vez en un archivo .proto, y los generadores de código producirán stubs de cliente y servidor con tipos estáticos.
Anatomía de un archivo .proto
Cada archivo proto declara una versión de sintaxis y un paquete. El paquete pone los tipos generados en un espacio de nombres y evita colisiones.
Use proto3 con tonic. Tras la generación, el nombre del paquete se asigna a una ruta de módulo de Rust.
syntax = "proto3";
package greeter.v1;Definir mensajes
Un mensaje es un registro tipado. Cada campo tiene un tipo, un nombre y un número de campo único que se utiliza para la codificación en el cable.
Los números de campo deben ser estables: nunca reutilice ni renumere un campo cuando ya existan datos, o romperá la compatibilidad.
message HelloRequest {
string name = 1;
int32 age = 2;
}Tipos escalares y su correspondencia en Rust
Los escalares de Protobuf se asignan a tipos de Rust mediante prost. string se convierte en String, int32 en i32, bool en bool y bytes en Vec<u8>.
En proto3, cada escalar tiene un valor predeterminado (cadena vacía, 0, false); no son opcionales salvo que se marquen como tales.
message Metric {
string label = 1;
double value = 2;
bool active = 3;
}Definir un servicio
Un service agrupa métodos RPC. Cada rpc declara un nombre de método, un mensaje de solicitud y un mensaje de respuesta.
tonic genera un trait de servidor y una estructura de cliente a partir de este bloque. Implementar el trait es la forma de proporcionar el comportamiento.
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloReply {
string message = 1;
}Cuatro tipos de métodos RPC
gRPC admite cuatro formas de streaming: unaria, streaming del servidor, streaming del cliente y streaming bidireccional.
Indique un stream con la palabra clave stream en el lado de la solicitud, en el de la respuesta o en ambos.
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);
}Enumeraciones en Protobuf
Las enumeraciones están respaldadas por enteros. En proto3, el primer valor debe tener el número 0 y actúa como valor predeterminado.
prost genera una enumeración de Rust y funciones auxiliares para convertir desde el i32 subyacente, ya que pueden llegar valores desconocidos a través del cable.
enum Status {
STATUS_UNKNOWN = 0;
STATUS_ACTIVE = 1;
STATUS_BANNED = 2;
}Campos anidados y repetidos
Un campo repeated es una lista y se asigna a Vec<T> en Rust. Los mensajes pueden anidarse o referenciarse por nombre.
Esto permite modelar colecciones y cargas útiles compuestas sin una complejidad adicional.
message Order {
string id = 1;
repeated Item items = 2;
}
message Item {
string sku = 1;
int32 qty = 2;
}Empty y los tipos conocidos
Para los métodos que no reciben ni devuelven nada, importe google/protobuf/empty.proto y use Empty.
Otros tipos conocidos son Timestamp y Duration. tonic incluye estas definiciones para que pueda importarlas en su compilación.
import "google/protobuf/empty.proto";
service Health {
rpc Ping (google.protobuf.Empty) returns (google.protobuf.Empty);
}Control de versiones con paquetes
Incluir una versión en el paquete, como greeter.v1, permite evolucionar una API de forma segura. Un cambio incompatible se incorpora a greeter.v2, mientras v1 sigue atendiendo solicitudes.
Esta convención mantiene limpios los módulos de Rust generados: greeter::v1 y greeter::v2 coexisten.
package greeter.v1;
// later, a parallel file:
// package greeter.v2;Reglas de compatibilidad de campos
Añadir un campo nuevo con un número sin usar es compatible con versiones anteriores; los clientes antiguos lo ignoran. Eliminar un campo es arriesgado, a menos que reserve su número y su nombre.
Reservarlo impide que alguien reutilice el número de un campo retirado y corrompa la decodificación.
message User {
reserved 3, 5;
reserved "legacy_token";
string id = 1;
string email = 2;
}Comprobación rápida
Compruebe su comprensión de las definiciones de servicios de proto3.
Resumen
Ha definido servicios y mensajes en proto3: números de campo estables, correspondencias de escalares con Rust, enumeraciones, campos repetidos y anidados, las cuatro formas de RPC, tipos conocidos y control de versiones mediante paquetes.
A continuación convertirá estas definiciones en código de Rust con tonic-build.
Preguntas frecuentes
¿La lección «Protobuf y definiciones de servicios» es gratis?
Sí — el texto completo de «Protobuf y definiciones de servicios» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Learn Rust Coding, actualiza a CoddyKit PRO. El curso de Learn Rust Coding incluye 4 lecciones en total.
¿Qué aprenderé en «Protobuf y definiciones de servicios»?
Describa su API en proto Practicas Learn Rust Coding con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Learn Rust Coding?
No se requiere experiencia previa. Learn Rust Coding en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Protobuf y definiciones de servicios»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Learn Rust Coding?
Sí. Cada lección de Learn Rust Coding incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Protobuf y definiciones de servicios
- Generar código con tonic-build
- Implementar un servidor gRPC
- Realizar llamadas desde un cliente gRPC