Tonic para Rust: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué es Tonic y para qué sirve?

\n\n

Tonic es una biblioteca moderna y de alto rendimiento para implementar servidores y clientes gRPC en el lenguaje Rust. Está construida sobre el runtime asíncrono Tokio y el framework HTTP/2 Hyper, lo que garantiza el máximo rendimiento y la compatibilidad total con el estándar gRPC.

\n\n

Principales ventajas de Tonic:

\n
    \n
  • Asincronía nativa — completamente async/await, sin bloqueos
  • \n
  • Seguridad de tipos — generación de código a partir de archivos proto en tiempo de compilación
  • \n
  • Soporte de todos los patrones gRPC — unary, server streaming, client streaming, bidirectional streaming
  • \n
  • Integración con el ecosistema Rust — funciona con Tokio, Tower, Hyper y otros crates populares
  • \n
  • Rendimiento — uno de los frameworks gRPC más rápidos
  • \n
\n\n

La biblioteca se utiliza en producción por empresas como Discord, Microsoft, Amazon y muchas otras. Tonic es ideal para crear microservicios, puertas de enlace API y cualquier sistema distribuido que requiera una comunicación eficiente entre servicios.

\n\n

Instalación de Tonic

\n\n

Para trabajar con Tonic necesitarás instalar varias dependencias. Agrégalas a tu Cargo.toml:

\n\n
[dependencies]\ntonic = "0.12"\nprost = "0.13"\ntokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }\n\n[build-dependencies]\ntonic-build = "0.12"
\n\n

Explicación de las dependencias:

\n
    \n
  • tonic — biblioteca principal para trabajar con gRPC
  • \n
  • prost — generador de código Protocol Buffers para Rust
  • \n
  • tokio — runtime asíncrono
  • \n
  • tonic-build — se utiliza en la etapa de compilación para compilar archivos .proto
  • \n
\n\n

También necesitarás instalar protoc — el compilador de Protocol Buffers. En Ubuntu/Debian:

\n\n
sudo apt install protobuf-compiler
\n\n

En macOS:

\n\n
brew install protobuf
\n\n

En Windows, descarga el binario desde el repositorio oficial y agrégalo al PATH.

\n\n

Inicio rápido: Hello World en gRPC

\n\n

Creemos un servicio simple que recibe un nombre y devuelve un saludo.

\n\n

Paso 1. Crea el archivo proto/helloworld.proto:

\n\n
syntax = "proto3";\n\npackage helloworld;\n\nservice Greeter {\n    rpc SayHello (HelloRequest) returns (HelloReply);\n}\n\nmessage HelloRequest {\n    string name = 1;\n}\n\nmessage HelloReply {\n    string message = 1;\n}
\n\n

Paso 2. Crea build.rs en la raíz del proyecto:

\n\n
fn main() -> Result<(), Box> {\n    tonic_build::compile_protos("proto/helloworld.proto")?;\n    Ok(())\n}
\n\n

Paso 3. Implementa el servidor (src/server.rs):

\n\n
use tonic::{transport::Server, Request, Response, Status};\nuse hello_world::greeter_server::{Greeter, GreeterServer};\nuse hello_world::{HelloRequest, HelloReply};\n\npub mod hello_world {\n    tonic::include_proto!("helloworld");\n}\n\n#[derive(Default)]\npub struct MyGreeter;\n\n#[tonic::async_trait]\nimpl Greeter for MyGreeter {\n    async fn say_hello(\n        &self,\n        request: Request,\n    ) -> Result, Status> {\n        let name = request.into_inner().name;\n        let reply = HelloReply {\n            message: format!("Hello, {}!", name),\n        };\n        Ok(Response::new(reply))\n    }\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), Box> {\n    let addr = "[::1]:50051".parse()?;\n    let greeter = MyGreeter::default();\n\n    Server::builder()\n        .add_service(GreeterServer::new                    

Recommendations