gRPC para Rust: bibliotecas y ejemplos
gRPC es un framework de alto rendimiento para llamadas a procedimientos remotos (RPC), desarrollado por Google. Utiliza Protocol Buffers (protobuf) para la serialización de datos y HTTP/2 para el transporte. En el ecosistema de Rust, las principales bibliotecas para trabajar con gRPC son tonic y grpc-rs. En este artículo, analizaremos en detalle ambas bibliotecas, sus capacidades y proporcionaremos ejemplos prácticos de código.
¿Por qué gRPC en Rust?
Rust es un lenguaje de programación de sistemas con énfasis en la seguridad de la memoria y el rendimiento. gRPC en Rust permite crear:
- Microservicios de alta carga
- Servicios de streaming en tiempo real
- Aplicaciones cliente-servidor multiplataforma
- Integración con infraestructura gRPC existente
Bibliotecas principales
1. Tonic — la opción moderna y recomendada
Tonic es una biblioteca asíncrona de gRPC construida sobre tokio y hyper. Es mantenida activamente por la comunidad y se considera el estándar para gRPC en Rust.
Ventajas de tonic:
- Soporte completo de gRPC (flujos unarios, de servidor, de cliente y bidireccionales)
- Generación de código a través de
tonic-buildbasado en archivos.proto - Integración con
tokio(runtime asíncrono) - Soporte para TLS, balanceo de carga e interceptores
- Comunidad activa y buena documentación
2. grpc-rs — alternativa de PingCAP
grpc-rs es un envoltorio de Rust sobre la biblioteca C gRPC Core. Se utiliza en el proyecto TiKV. Es adecuado para casos donde se requiere la máxima compatibilidad con la pila C original de gRPC.
Características de grpc-rs:
- Envoltorio sobre gRPC Core (biblioteca C)
- Soporte para todos los tipos de llamadas gRPC
- Menos "magia" — más control
- Requiere instalación de
protocycmake - Menos popular en comparación con tonic
Recomendación: Para la mayoría de los proyectos nuevos, elija tonic. grpc-rs debe usarse si necesita integración con código C existente de gRPC.
Configuración del proyecto con tonic
Cree un nuevo proyecto:
cargo new grpc-examplecd grpc-exampleAgregue las dependencias en Cargo.toml:
[dependencies]tonic = "0.11"prost = "0.12"tokio = { version = "1", features = ["full"] }
[build-dependencies]tonic-build = "0.11"Cree el archivo proto/hello.proto:
syntax = "proto3";
package hello;
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}
message HelloRequest { string name = 1;}
message HelloReply { string message = 1;}Configure la compilación — cree build.rs:
fn main() -> Result<(), Box<dyn std::error::Error>> { tonic_build::compile_protos("proto/hello.proto")?; Ok(())}Ejemplo de servidor con tonic
Cree src/server.rs:
use tonic::{transport::Server, Request, Response, Status};use hello::greeter_server::{Greeter, GreeterServer};use hello::{HelloRequest, HelloReply};
pub mod hello { tonic::include_proto!("hello");}
#[derive(Default)]pub struct MyGreeter;
#[tonic::async_trait]impl Greeter for MyGreeter { async fn say_hello( &self, request: Request<HelloRequest>, ) -> Result<Response<HelloReply>, Status> { let name = request.into_inner().name; let reply = HelloReply { También en la biblioteca
iText 7 para Java: guía completa con ejemplos prácticos
Framework CLI para Swift: creación de utilidades de consola en iOS/macOS
Bean Validation (Jakarta Validation) — Validación de datos en Java
TypeStack/class-validator TypeScript: guía completa con ejemplos