Saltar al contenido

¿Qué es gRPC y cómo funciona?

gRPC

gRPC es un framework de código abierto creado por Google que permite la comunicación eficiente entre servicios distribuidos. Utiliza Protocol Buffers como formato de serialización y HTTP/2 como protocolo de transporte. Soporta múltiples lenguajes de programación y ofrece cuatro tipos de comunicación, incluyendo streaming bidireccional. Es especialmente útil en arquitecturas de microservicios donde el rendimiento resulta crítico.

gRPC

Definición de gRPC y origen del framework de Google

gRPC es un framework de comunicación remota que permite que dos programas hablen entre sí como si estuvieran en la misma máquina. En lugar de intercambiar textos largos, envía mensajes binarios muy compactos, lo que reduce el tamaño de los datos y mejora el rendimiento de las aplicaciones distribuidas.

Su objetivo principal es facilitar la creación de servicios backend que necesiten responder rápido y de forma confiable, incluso bajo alta carga. gRPC se diseñó pensando en arquitecturas modernas de microservicios, donde decenas o cientos de servicios se comunican constantemente. Esta orientación lo ha convertido en una pieza clave en entornos empresariales.

Historia y evolución desde Google hacia código abierto

Antes de gRPC, Google ya usaba un sistema interno llamado Stubby para conectar servicios dentro de su infraestructura. Stubby resolvía problemas de escalabilidad, pero era una tecnología privada. Con el tiempo, se vio la necesidad de ofrecer una alternativa abierta y estándar que cualquier empresa pudiera adoptar.

Así nació gRPC, que se presentó en 2015 como proyecto de código abierto bajo la Fundación Cloud Native Computing. La comunidad comenzó a extender el soporte a múltiples lenguajes y plataformas, lo que aceleró la adopción en empresas de distintos tamaños. Desde entonces, el framework ha evolucionado alineado con Kubernetes y el ecosistema cloud native.

¿Por qué Google creó gRPC para sus servicios internos?

Google opera miles de servicios que deben comunicarse entre sí con la mínima latencia posible. Las soluciones basadas en texto, como JSON sobre HTTP/1.1, no eran lo suficientemente eficientes para su escala. Era necesario un enfoque que ahorrara ancho de banda y procesador manteniendo la fiabilidad.

La respuesta fue un framework que aprovechara HTTP/2 y un formato binario optimizado como Protocol Buffers. El objetivo interno de Google era reducir la sobrecarga en cada llamada entre servicios y mantener contratos bien definidos entre equipos de desarrollo. Ese mismo enfoque disciplinado es el que ahora se ofrece a cualquier organización que adopta gRPC.

Arquitectura y componentes principales de gRPC

La arquitectura de gRPC se basa en unos pocos bloques muy claros: definición de interfaces, generación de código cliente-servidor y transporte eficiente. Entender cómo encajan estos componentes te permite diseñar servicios más ordenados y fáciles de mantener en el tiempo.

Desde la perspectiva de ingeniería en sistemas, gRPC propone una separación fuerte entre contrato, implementación y transporte. Este enfoque encaja muy bien con patrones como Clean Architecture y con equipos que desean reducir errores de integración entre servicios. A continuación se desglosan sus elementos clave.

Protocol Buffers como lenguaje de definición de interfaces

Protocol Buffers, o Protobuf, es el lenguaje usado por gRPC para describir servicios y mensajes. Se escribe en archivos con extensión .proto, donde se definen métodos, tipos de datos y estructuras. Esa definición sirve como contrato estable entre todos los equipos que consumen el servicio.

Después, herramientas oficiales generan código en distintos lenguajes a partir del archivo .proto. El gran beneficio es que se evita escribir estructuras y modelos a mano en cada lenguaje, reduciendo fallos por discrepancias entre cliente y servidor. Además, Protobuf está pensado para ser rápido de serializar y deserializar.

Funcionamiento del modelo cliente-servidor con stubs

En gRPC, tanto el cliente como el servidor usan código generado llamado stubs. El stub del servidor contiene interfaces que se deben implementar, mientras que el stub del cliente ofrece métodos listos para invocar el servicio remoto como si fuera local. Este enfoque simplifica mucho la interacción.

Cuando el cliente llama a un método del stub, gRPC se encarga de empaquetar los datos, enviarlos por la red y recibir la respuesta. La aplicación solo ve una llamada de función normal, pero en realidad se está ejecutando una petición remota sobre HTTP/2. Esto permite abstraer gran parte de la complejidad de red.

HTTP/2 como protocolo de transporte subyacente

gRPC se construye sobre HTTP/2, que ofrece varias mejoras respecto a HTTP/1.1. Entre ellas están la multiplexación de streams, la compresión de cabeceras o el soporte nativo de comunicación bidireccional. Cada llamada RPC se mapea a un stream HTTP/2 independiente.

Gracias a esto, múltiples llamadas pueden viajar al mismo tiempo por una sola conexión TCP. La combinación de HTTP/2 y mensajes binarios hace que gRPC reduzca latencia y consuma menos recursos que otras alternativas basadas en texto. Esto se nota especialmente cuando hay muchas llamadas pequeñas y frecuentes.

Multiplexación de conexiones

La multiplexación permite que varias solicitudes y respuestas compartan la misma conexión física. En lugar de abrir una nueva conexión por cada llamada, se reutiliza una conexión persistente. Cada operación va etiquetada con un identificador de stream independiente.

Este enfoque elimina el bloqueo asociado a HTTP/1.1 cuando una petición lenta retiene la conexión. Con HTTP/2, un solo canal puede gestionar muchas llamadas en paralelo sin interferir unas con otras. Eso reduce el coste de establecer conexiones nuevas y mejora la eficiencia en microservicios.

Compresión de cabeceras

HTTP/2 introduce un mecanismo de compresión de cabeceras basado en tablas dinámicas. Muchas cabeceras se repiten en todas las peticiones, por lo que enviarlas sin compresión genera un coste innecesario. La compresión las reduce a referencias compactas.

En gRPC, esto significa que la sobrecarga de metadatos se mantiene baja incluso cuando hay muchas llamadas. Al disminuir el tamaño total de cada mensaje, se reduce tanto el tiempo de transmisión como el consumo de ancho de banda. Esta característica aporta valor en redes limitadas o servicios con mucho tráfico.

Tipos de comunicación y streaming en gRPC

gRPC no se limita al modelo clásico de petición y respuesta única. Ofrece varios tipos de streaming que permiten construir servicios más interactivos, enfocados en tiempo real o en envío por lotes. Cada estilo se adapta a un tipo de problema diferente dentro de un sistema distribuido.

A continuación se resumen los cuatro modelos de comunicación más usados en gRPC:

  • RPC unario: El cliente envía una petición y recibe una única respuesta, similar a una llamada HTTP clásica.
  • Server streaming: El cliente envía una petición y el servidor responde con múltiples mensajes en un solo stream.
  • Client streaming: El cliente envía varios mensajes y el servidor responde con un único resultado final.
  • Streaming bidireccional: Cliente y servidor envían y reciben mensajes de forma simultánea en el mismo canal.

RPC unario o request-response simple

La llamada unaria es el tipo más sencillo de comunicación en gRPC. El cliente envía un mensaje, espera a que el servidor lo procese y obtiene una respuesta. Es el equivalente directo a una petición HTTP con respuesta única, pero usando Protobuf y HTTP/2.

Este modelo es ideal cuando solo se necesita pedir un dato puntual o ejecutar una operación concreta. Muchas APIs comienzan con métodos unarios y luego evolucionan hacia streaming cuando aparece la necesidad de enviar más datos. Es la puerta de entrada más fácil al ecosistema gRPC.

Server streaming para respuestas múltiples

En server streaming, el cliente envía una sola petición y el servidor le devuelve una secuencia de mensajes. El stream se mantiene abierto hasta que el servidor decide que ya no hay más datos que enviar, y entonces lo cierra de forma ordenada.

Este patrón es útil cuando se debe devolver una lista grande de elementos o un flujo continuo de eventos. En lugar de enviar toda la información en un solo mensaje grande, se va entregando poco a poco, lo que reduce picos de memoria y mejora la experiencia.

Client streaming para envíos múltiples

En client streaming, el cliente puede enviar varios mensajes al servidor dentro de un mismo stream. Cuando termina de enviar datos, cierra la parte de escritura y espera una sola respuesta final que normalmente resume o procesa todo lo recibido.

Este modelo encaja con escenarios donde el cliente agrupa una serie de registros o lecturas y el servidor debe procesarlos en conjunto. Al usar streaming, se evitan límites de tamaño en un solo mensaje y se aprovecha mejor la red. Esto es frecuente en cargas por lotes o agregaciones.

Streaming bidireccional en tiempo real

El streaming bidireccional permite que cliente y servidor envíen y reciban mensajes de manera simultánea en el mismo canal. Cada lado decide cuándo mandar nuevos datos, de forma independiente, siempre que el stream siga abierto.

Este patrón permite construir chats, actualizaciones de estado en tiempo real o sistemas de monitorización continua. La posibilidad de intercambiar mensajes sin bloquear la otra parte convierte a gRPC en una herramienta potente para aplicaciones interactivas.

gRPC vs. REST: Diferencias clave y cuándo usar cada uno

gRPC y REST no compiten siempre; muchas veces se complementan en la misma arquitectura. REST, normalmente basado en JSON sobre HTTP/1.1, es muy accesible y fácil de probar desde un navegador. gRPC, en cambio, se centra en eficiencia y en contratos estrictos.

Elegir entre ambos depende de factores como el público objetivo, las restricciones de red y el tipo de cliente. En sistemas internos y de alto rendimiento, gRPC suele brillar; para integraciones públicas y soporte directo desde navegador, REST sigue siendo la opción más sencilla.

Criterio gRPC REST
Formato de datos Protocol Buffers binario JSON o XML basado en texto
Transporte HTTP/2 por defecto Principalmente HTTP/1.1
Rendimiento Muy alto, baja latencia Bueno, pero menos eficiente.
Legibilidad Mensajes no legibles a simple vista JSON legible y fácil de depurar
Compatibilidad con navegadores Limitada, requiere adaptadores Nativa mediante HTTP estándar
Idoneidad para microservicios Excelente en comunicaciones internas Común para APIs públicas

Comparativa de rendimiento y latencia

En pruebas de rendimiento, gRPC suele ofrecer menor latencia y menor consumo de ancho de banda que REST. El uso de Protobuf reduce el tamaño de cada mensaje y la multiplexación de HTTP/2 evita abrir y cerrar conexiones constantemente.

Esto se nota cuando existen cientos de llamadas por segundo entre servicios internos. En sistemas donde cada milisegundo cuenta, gRPC puede marcar una diferencia significativa en el tiempo de respuesta global. Sin embargo, para casos simples con pocas peticiones, la diferencia puede no ser tan visible.

Protocol Buffers frente a JSON como formato de datos

JSON es fácil de leer, editar y enviar desde casi cualquier cliente, pero ocupa más espacio y requiere más trabajo de parseo. Protocol Buffers genera estructuras binarias compactas que se convierten directamente en objetos del lenguaje.

La desventaja de Protobuf es que requiere compilar los esquemas antes de usarlos. La ventaja es que ofrece tipos fuertemente definidos, evolución controlada de los mensajes y una eficiencia superior en CPU y red. En entornos críticos, este ahorro se acumula rápidamente.

Compatibilidad con navegadores y ecosistema

Los navegadores trabajan de forma natural con HTTP/1.1 y JSON, por lo que consumir una API REST es directo desde JavaScript. En cambio, gRPC depende de HTTP/2 y de Protobuf, lo que complica la integración directa desde el navegador.

Para salvar esta limitación, existen variantes como gRPC-Web que actúan como capa intermedia. No obstante, si el principal cliente de una API es el navegador, REST suele seguir siendo la opción más simple de implementar y mantener. gRPC brilla más en el backend y en servicios internos.

Escenarios ideales para elegir gRPC o REST API

La elección entre gRPC y REST influye en cómo se diseñan los servicios y en la experiencia de quienes los consumen. A continuación se muestran casos donde cada enfoque resulta más natural, teniendo en cuenta rendimiento, compatibilidad y tipo de cliente.

  • Comunicaciones internas de microservicios: gRPC es muy adecuado cuando varios servicios internos se llaman constantemente y se necesita máxima eficiencia.
  • APIs públicas para terceros: REST es más cómodo cuando se quiere ofrecer una interfaz simple que otros desarrolladores puedan probar desde navegadores o herramientas comunes.
  • Aplicaciones móviles sensibles al consumo de datos: gRPC puede ayudar a reducir tráfico y mejorar la duración de la batería gracias a mensajes compactos.
  • Integraciones con sistemas heredados: REST encaja mejor cuando el sistema existente ya habla HTTP clásico y JSON y resulta costoso migrar toda la infraestructura.

Ventajas y desventajas de implementar gRPC

Adoptar gRPC aporta beneficios claros, pero también introduce retos que conviene conocer antes de rediseñar una arquitectura. No se trata de sustituir todas las APIs existentes, sino de elegir la herramienta adecuada para cada problema concreto.

En muchos casos, la solución equilibrada es usar gRPC para comunicaciones internas y REST para integraciones externas. Comprender las fortalezas y limitaciones del framework permite planificar una transición progresiva sin romper servicios actuales.

Aspecto Ventajas de gRPC Desventajas de gRPC
Rendimiento Baja latencia y uso eficiente del ancho de banda Beneficio menor en sistemas con pocas llamadas
Definición de contratos Esquemas fuertes con Protocol Buffers Requiere compilar y mantener archivos .proto
Compatibilidad Soporte amplio en servidores y servicios backend Integración directa limitada con navegadores
Curva de aprendizaje Patrones claros una vez comprendidos Mayor complejidad inicial que una API REST sencilla
Streaming Soporte nativo para múltiples tipos de streaming Mayor complejidad de diseño y depuración
Herramientas Generación automática de código cliente-servidor Menos herramientas visuales que en el ecosistema REST

¿Cómo implementar gRPC en diferentes Lenguajes?

gRPC está diseñado para ser multiplataforma, lo que permite usarlo en distintos lenguajes dentro de la misma arquitectura. En una empresa es habitual que un servicio esté en Go, otro en Java y un tercero en Node.js, todos hablando el mismo protocolo.

El patrón general siempre se repite: se define el contrato en un archivo .proto, se genera el código con el compilador de Protobuf y se implementa la lógica. Dominar ese flujo de trabajo es la clave para integrar gRPC sin importar el lenguaje que se elija.

gRPC en Python con ejemplos básicos

Para usar gRPC en Python, se instala primero el paquete correspondiente con el gestor de dependencias. Después se crea un archivo .proto con los servicios y mensajes necesarios. El compilador genera archivos .py que contienen las clases de cliente y servidor.

En el servidor, se crea una clase que implementa los métodos definidos y se arranca un servidor gRPC escuchando en un puerto. Del lado del cliente, basta con crear un canal al servidor e instanciar el stub para invocar métodos remotos como si fueran funciones locales.

Implementación de gRPC en Java

En Java, gRPC se integra fácilmente con herramientas como Maven o Gradle. Se configura un plugin que ejecuta el compilador de Protobuf durante el proceso de construcción, generando clases Java para mensajes y servicios basados en el archivo .proto.

El servidor implementa una clase que extiende el servicio generado y registra esta implementación en un servidor gRPC. En el cliente, se crea un canal administrado y se usa el stub bloqueante o asíncrono según las necesidades de concurrencia. Este enfoque se adapta bien a entornos empresariales.

gRPC en Go para servicios de alto rendimiento

Go es uno de los lenguajes donde gRPC se siente más natural, por su enfoque en concurrencia y eficiencia. Se instala el compilador de Protobuf para Go y el plugin de gRPC, y después se genera el código a partir del archivo .proto con un simple comando.

El servidor en Go define una estructura que implementa las interfaces generadas y la registra en un servidor gRPC. Gracias a las goroutines, el servicio puede manejar muchas conexiones simultáneas con un uso moderado de recursos. Esto es ideal para microservicios con alto tráfico.

Uso de gRPC en Node.js

En Node.js, gRPC se usa mediante paquetes oficiales que permiten cargar archivos .proto directamente. Es posible generar código o, en algunos casos, cargar la definición en tiempo de ejecución, según la versión de las librerías utilizadas.

El servidor define handlers para cada método del servicio y los registra en un servidor gRPC que escucha en el puerto deseado. El cliente crea un stub a partir de la misma definición .proto y puede hacer llamadas unarias o de streaming usando la sintaxis típica de Node.js.

Casos de uso reales y aplicaciones de gRPC

gRPC se ha convertido en una pieza clave en arquitecturas modernas orientadas a servicios. Su capacidad para reducir la latencia y mantener contratos bien definidos lo hace especialmente atractivo en proyectos que buscan escalar sin perder control.

Desde grandes plataformas de streaming hasta aplicaciones móviles con millones de usuarios, el framework se utiliza como columna vertebral de la comunicación interna. Comprender en qué contextos se aplica ayuda a imaginar cómo integrarlo en cualquier futuro sistema de información.

Comunicación interna entre microservicios

En una arquitectura de microservicios, decenas de componentes deben comunicarse para resolver una sola petición del usuario. gRPC encaja muy bien como protocolo interno, ya que reduce el tamaño de los mensajes y aprovecha la multiplexación de HTTP/2.

Además, los contratos definidos en Protobuf evitan errores clásicos al integrar servicios escritos por equipos distintos. Este enfoque facilita aplicar principios de Clean Architecture en el backend, separando claramente la lógica de negocio del transporte.

Aplicaciones móviles con conexiones de baja latencia

En aplicaciones móviles, cada byte transferido tiene impacto en el consumo de datos y en la batería. gRPC permite enviar mensajes binarios compactos, lo que reduce el tráfico respecto a JSON. Además, las conexiones persistentes de HTTP/2 pueden mejorar la respuesta en redes inestables.

Este enfoque resulta interesante cuando la app debe comunicarse con frecuencia con el servidor, como en chats o actualizaciones en tiempo real. La combinación de menor tamaño de mensajes y uso eficiente de la red mejora la experiencia del usuario final.

Sistemas distribuidos y balanceo de carga

En sistemas distribuidos, el tráfico se reparte entre varias instancias mediante balanceadores. gRPC se integra bien con estas soluciones y con herramientas de observabilidad modernas como Prometheus y Grafana, que ayudan a monitorizar latencias y errores.

Gracias a sus metadatos y a su diseño coherente, es posible aplicar patrones avanzados como retries, circuit breakers o timeouts configurables. Esto facilita construir servicios resilientes capaces de soportar fallos parciales en la infraestructura.

Empresas que utilizan gRPC en producción

gRPC se ha extendido más allá de Google y ahora forma parte de la base tecnológica de muchas organizaciones. A continuación se muestran algunos tipos de empresas que suelen usarlo y qué beneficios obtienen en sus operaciones diarias.

  • Plataformas de streaming de vídeo: Necesitan enviar y recibir metadatos constantemente entre servicios, donde cada milisegundo cuenta, y gRPC ayuda a reducir latencia.
  • Fintech y banca digital: Requieren canales rápidos y seguros entre microservicios para procesar transacciones y consultar datos de forma confiable.
  • Empresas de logística y transporte: Coordinan múltiples sistemas de seguimiento y rutas, donde la comunicación eficiente entre servicios mejora la toma de decisiones.
  • Proveedores de servicios cloud: Ofrecen APIs internas y externas con alto volumen de tráfico, y gRPC se usa para orquestar componentes internos.

Preguntas frecuentes

¿Qué significa exactamente gRPC?

gRPC es un framework de llamadas a procedimientos remotos diseñado para que una aplicación pueda invocar funciones en otra máquina como si fueran locales. Utiliza Protocol Buffers para definir los mensajes y servicios, y HTTP/2 como transporte. De esta forma se logran comunicaciones rápidas, seguras y estructuradas entre diferentes componentes distribuidos.

¿gRPC es mejor que REST para mi proyecto?

gRPC no es mejor ni peor en términos absolutos, sino más adecuado para ciertos escenarios. Si tu proyecto se centra en comunicaciones internas de alto rendimiento entre microservicios, gRPC suele aportar ventajas claras. Sí, en cambio, si necesitas exponer una API pública consumida desde navegadores y clientes muy variados, REST puede ser más práctico.

¿Qué lenguajes de programación soporta gRPC?

gRPC ofrece soporte oficial para varios lenguajes como C++, Java, Go, Python, C#, Ruby, Node.js, entre otros. Además, la comunidad mantiene implementaciones para más plataformas. Esto permite que distintos servicios dentro de una misma arquitectura se desarrollen en lenguajes diferentes, pero sigan comunicándose de forma coherente gracias a los mismos contratos Protobuf.

¿Es necesario aprender Protocol Buffers para usar gRPC?

Para sacar todo el partido a gRPC, es muy recomendable aprender Protocol Buffers, ya que es el lenguaje en el que se definen los servicios y mensajes. Aunque la sintaxis es sencilla, entender bien cómo versionar y evolucionar los esquemas es clave. Sin este conocimiento, sería difícil mantener contratos estables y evitar errores de compatibilidad en el tiempo.

¿Puedo usar gRPC directamente desde un navegador?

Los navegadores no soportan de forma nativa todas las características necesarias para hablar con un servidor gRPC estándar. Sin embargo, existe gRPC-Web, una variante que permite a las aplicaciones web comunicarse con un proxy que traduce las peticiones. Aunque esto añade una capa extra, hace posible integrar gRPC en entornos donde el cliente principal es una aplicación web moderna.

¿Cuándo elegir gRPC en tu Arquitectura?

gRPC encaja muy bien cuando se diseña una arquitectura moderna con múltiples servicios que se comunican con frecuencia y donde el rendimiento es crítico. También es una buena opción si se utilizan varios lenguajes de programación y se necesitan contratos bien definidos. En cambio, si la prioridad es la simplicidad y la compatibilidad con navegadores, probablemente REST resulte más conveniente.

¿gRPC funciona bien con bases de datos SQL y otros almacenes?

gRPC se encarga únicamente de la comunicación entre servicios y no sustituye a la base de datos. Puedes seguir usando sin problema una base de datos relacional basada en SQL u otros almacenes como NoSQL. Lo que hace gRPC es facilitar que los servicios que consultan y actualizan esos datos se comuniquen entre sí de forma más eficiente y estructurada.

¿Es posible migrar una API REST existente a gRPC?

Sí, pero suele ser un proceso gradual. Una opción es mantener la API REST para clientes externos y empezar a usar gRPC solo para las comunicaciones internas entre nuevos microservicios. Con el tiempo, se pueden ir migrando endpoints críticos a gRPC. Es importante planificar bien los contratos Protobuf y evitar cambios bruscos que rompan integraciones ya existentes.

¿gRPC es adecuado para proyectos pequeños o solo para grandes empresas?

gRPC puede aportar valor incluso en proyectos pequeños, sobre todo si se prevé crecer hacia una arquitectura de servicios más compleja. Sin embargo, en aplicaciones muy sencillas puede resultar suficiente una API REST tradicional. Lo importante es valorar si la mejora de rendimiento y la definición estricta de contratos justifican la curva de aprendizaje y la configuración adicional que requiere.

¿Cómo se prueban y depuran servicios gRPC?

Existen herramientas específicas para probar servicios gRPC, como clientes de línea de comandos y extensiones para editores de código. Además, muchos entornos integran ya soporte para inspeccionar llamadas, tiempos de respuesta y errores. Al combinar estas herramientas con soluciones de observabilidad y trazado distribuido, es posible depurar flujos complejos entre servicios de forma bastante precisa.

gRPC

Conclusión

gRPC se ha consolidado como una solución potente para comunicar servicios en arquitecturas distribuidas. Si trabajas con microservicios, necesitas rendimiento y quieres contratos claros entre equipos, este framework te ofrece una base sólida para construir sistemas mantenibles y escalables a largo plazo.

Aunque pueda parecer más complejo que una API basada en HTTP clásico, el esfuerzo inicial se compensa con mejores tiempos de respuesta, menor consumo de recursos y una integración más segura entre componentes. Tú decides hasta qué punto integrarlo, combinándolo si lo necesitas con enfoques tradicionales.

Si te interesa profundizar en temas como diseño de servicios o distintas ramas de la Clean Architecture aplicada a microservicios, puedes seguir explorando otros contenidos relacionados con gRPC y con cada tipo de sistema de información que quieras construir. A continuación encontrarás más recursos para seguir aprendiendo y reforzar tu base técnica.

Sigue aprendiendo:

Autor del Blog
ingeniero jhonatan chambi

Jhonatan Chambi

Soy ingeniero con amplia experiencia en el desarrollo de proyectos y la divulgación de temas de ingeniería.

A lo largo de mi carrera he aprendido que compartir el conocimiento es fundamental para el crecimiento profesional y personal. Por eso, me esfuerzo en crear contenido útil y accesible para quienes desean adentrarse en el mundo de la ingeniería.

¡Haz clic para puntuar esta entrada!
(Votos: 1 Promedio: 5)