Jorge Serrano
  • Home

gRPC para el programador .NET

  • By jorge
  • Jul-1-2019
  • .NET Core 3.0, ASP.NET Core 3, gRPC, Visual Studio 2019
  • 1 Comment.

Introducción

Ahora que ya sabemos un poco más sobre gRPC y su historia, ¿cómo se presenta este framework de cara al programador de .NET?.

gRPC soporta más de 10 lenguajes de programación entre los que se encuentra C#, por lo que podemos desarrollar nuestros servicios gRPC con C# como lenguaje de programación y .NET como plataforma de desarrollo.

Encontraremos más información sobre gRPC con C# en este enlace.

Sin embargo, aunque parezca que desde hace relativamente poco se ha puesto de moda gRPC para .NET, la realidad es que se podía utilizar hace ya tiempo en .NET.

 

gRPC para .NET Framework y .NET Core

El caso es que podemos utilizar gRPC para entornos Mac OS X y Linux a través de Mono, y también podemos utilizar .NET Framework 4.5.x para entornos Windows.

De igual forma, podemos utilizar .NET Core para desarrollar aplicaciones gRPC.

Toda esta información la encontraremos en este enlace de GitHub.

Respecto al paquete NuGet básico necesario, deberíamos apoyarnos en el paquete gRPC e instalar también Grpc.Tools para poder trabajar con el compilador Protocol Buffer (protobuf).

Como curiosidad, comentar que el compilador de Protocol Buffer (protobuf) lo encontraremos en GitHub en este enlace.
Por su parte, el paquete Nuget Google.Protobuf lo encontraremos aquí.

Si tienes más curiosidad, puedes encontrar un sencillo ejemplo de .NET Core 2.1 en este enlace.
Encontrarás algún ejemplo más en este otro enlace.

 

gRPC para ASP.NET Core 3

Llegados a este punto, conviene mencionar que Microsoft está impulsando la capacidad del desarrollo de servicios a través de gRPC dentro de ASP.NET Core 3.0.
¿Qué tiene entonces ASP.NET Core 3 que no tenía antes?.

La implementación anterior de Google se basa en la librería nativa escrita en C (gRPC C-Core).

Microsoft, como sabes, trabaja activamente en ASP.NET Core 3 (en versión preview aún).
Dentro de este trabajo, trata de colaborar con Google con respecto a gRPC y focaliza sus esfuerzos en implementarlo de forma completamente manejada y basada en el servidor HTTP de Kestrel y la pila de ASP.NET Core.
El objetivo de Microsoft es comportarse con gRPC lo más parecido a como lo hacen lenguajes como Java y Go que aglutinan una de sus capas en una sola resolviendo algunas problemáticas que se pueden dar.

Otra de las intenciones de Microsoft es unificar y utilizar todas las opciones del protocolo HTTP/2 para que los desarrolladores de ASP.NET Core 3.x se beneficien de sus ventajas y las puedan aplicar a sus servicios.

Quizás en este punto te preguntes como lo hizo un usuario de Twitter que le preguntó a David Fowler sobre la ventaja de correr nuestros servicios en la parte superior de ASP.NET Core en lugar de hacerlo en Grpc.Core.Server.

Aquí la conversación dónde luego intervino otro usuario de Twitter:

Por otro lado, aparte de todo esto y si te has dado cuenta ya (sino lo aclaro), no estoy nombrando en ningún momento (intencionadamente) la palabra microservicios, y es que mucha gente reduce el uso de gRPC a microservicios, pero la realidad es que aunque se pueda aplicar a ellos, debemos evitar malos entendidos y verlo de forma amplia, global y válida de establecer comunicaciones entre clientes o consumidores de un servicio, y del servicio en sí, y no sólo para un ámbito enfocado a microservicios.

 

¿REST o gRPC?

Otra de las discusiones generales que aparecen en la mesa cuando hablamos de gRPC es qué pasará con REST.

En ASP.NET Core podemos desarrollar nuestras propias APIs con ASP.NET Core Web Api.
¿Es acaso gRPC un sustituto de ASP.NET Core Web Api?.

La respuesta es tajante. NO.

Simplemente tenemos dos mecanismos o dos formas para desarrollar nuestros propios servicios.
El primero de ellos basado en ASP.NET Core Web Api, y el otro a través de gRPC.

De forma general, me atrevo a afirmar que desarrollar una solución en ASP.NET Core Web Api es más sencilla o rápida que hacerlo en gRPC.
Sin embargo y por norma general también, recibir datos y enviar respuestas en gRPC mejora el rendimiento que ofrece REST (entre 5 y 10 veces aproximadamente).

El uso del protocolo HTTP/2 (en lugar de HTTP/1.x como en REST) y el hecho de no utilizar datos planos como JSON, ayudan en buena parte a que la balanza de rendimiento se incline a favor de gRPC.

Los payloads en JSON son de forma general legibles, lo cual facilita su rápida lectura e interpretación, pero demasiado grandes a veces.
Los payloads con Protobuf son binarios, y aunque no sean legibles en una rápida lectura, son más pequeños y por lo tanto consume menos recursos de red además de ser enviados y recibidos más rápidamente.

HTTP/2 por su parte, posee la característica principal de manejar múltiples conexiones, a excepción de REST que sólo puede manejar 1 por llamada.
gRPC nos permite también comunicarnos bidireccionalmente entre cliente y servicio.

Finalmente, es posible agregar a gRPC diferentes plugins para traceo, logging o monitoreo por ejemplo.

Para más información sobre algunas comparaciones entre HTTP API con JSON y gRPC, te invito a visitar este enlace de Microsoft al respecto.

Para ver algunas comparaciones más, te indico una imagen comparativa:

Por si tienes problemas para ver esta imagen, puedes acceder a ello directamente aquí.

 

gRPC everywhere

Una de las características más destacables de gRPC es el hecho de ser multiplataforma.
Podríamos disponer de un cliente programado en un lenguaje de programación concreto (de los más de 10 soportados anteriormente comentados) y un servidor en otro lenguaje o tecnología.

Incluso por razones estratégicas u otras diferentes, podríamos llegar a portar en un momento dado una de esas partes de un lenguaje de programación a otro.

Esto es o puede llegar a ser algo muy atractivo para las empresas y sus equipos de desarrollo.

Aunque ya he comentado algunas cosas con respecto a HTTP/2, te sugiero leer esta entrada explicativa y esta otra muy interesante también.

 

Otras características destacables de gRPC

El hecho de apoyarse en el protocolo HTTP/2 aporta ventajas adicionales como el streaming bidireccional, la compresión de cabeceras, y el multiplexing y control de flujo o congestión para conexiones simples TCP, ofreciendo un alto rendimiento.

Por lo anteriormente comentado y más, gRPC es asíncrono por naturaleza.
Cabe recordar que las redes son inherentemente asíncronas.
Recordemos que el objetivo principal de la asincronía es no bloquear el hilo.

La reconexión en conexiones con problemas es automática, y es posible propagar los errores y cancelación.

Aunque lo he comentado en otra entrada, no está de más recordar que gRPC es extensible.
Podemos extenderlo con traceo y logging, monitorización, balanceo de carga o load balancing, chequeo de salud o health checking, descubrimiento de servicios o service discovery, autenticación y seguridad, proxies, etc.

También es posible medir los niveles de calidad de servicio (QoS).

La instalación y uso de gRPC es tremendamente sencilla y rápida, si bien creo que (y puede ser que diga esto basándome en mi costumbre) hacerlo con ASP.NET Core Web Api es aún más rápido y sencillo.

 

Resumen de los beneficios de gRPC

Para recordar de forma rápida y sencilla los beneficios principales que nos ofrece gRPC, me he inventado una sigla que los engloba a todos.

CPM – Compatibility, Performance and Manteinance.

Enfocado a la compatibility o compatibilidad porque es multiplataforma, multilenguaje y evita los breaking changes (eso no significa que no los pueda haber, porque nada es infalible).

Enfocado al performance o rendimiento porque maneja las conexiones de red permitiendo múltiples llamadas por conexión, permite la transmisión rápida de datos binarios, y mejora el uso y consumo de recursos (CPU).

Enfocado al mantenimiento porque permite extender o utilizar plugins para obtener datos de traceo, logging y monitorización entre otros.

En próximas entradas entraremos en detallar las partes principales de gRPC y lo que debes conocer y dominar de él.

 

Happy Coding!

Comments

One Responseso far

  1. Daniel dice:
    15 agosto, 2019 a las 4:40 am

    Primero que todo excelente post! Felicitaciones!
    Un par de puntos a aclarar, tras bambalinas gRPC utiliza también https y es estatelest, en teoría es una forma de definir tus appis en un lenguaje simplificado e interoperable. Web Api también puede usar http 2.0 desde la versión 2.2 de .net core. La razón por la cual http 2.0 es más rápido es porque recicla la conexión y no porque pueda hacer varias conexiones al tiempo http 1 también realizar multiples conexión al tiempo, solo que está no recicla la conexión simplemente la tira. Con web api también puedes usar varios mecanismos de serializado, JSON,XML, messagepack etc…

    Responder

Deja un comentario Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

← Previous Post Next Post →

Jorge Serrano

MVP Reconnect


Donaciones
Donation

Entradas recientes

  • Go – Tipos de Datos
  • Go – Variables
  • Hello Go-rld!
  • Introducción a Go o Golang
  • JSON Patch en ASP.NET Core 5 Web API
  • Null Checking en C#
  • ¿Porqué mi página web por defecto de ASP.NET Core no se vé en mi Azure Web App y me da un 404?
  • .NET 5 lanzado oficialmente – detalles y consideraciones
  • Configurar el Pipeline de Azure DevOps para compilar proyectos .NET 5
  • ¿Cómo puedo probar .NET 5 y C# 9?

Categorías

  • .NET 5
  • .NET Core
  • .NET Core 3.0
  • .NET Core 3.1
  • .NET Framework 2.0
  • .NET Framework 3.0
  • .NET Framework 3.5
  • .NET Framework 4.0
  • .NET Framework 4.5
  • .NET Framework 4.6
  • .NET Framework 4.7
  • .NET Framework 4.8
  • .NET Standard 2.0
  • .NET Standard 2.1
  • AMQP
  • Android
  • Angular
  • API REST
  • Apple
  • Apple iOS
  • Apple macOs
  • Arquitectura
  • ASP.NET
  • ASP.NET Core
  • ASP.NET Core 3
  • ASP.NET Core 5
  • AWS
  • Azure App Service
  • Azure Application Insights
  • Azure Cosmos DB
  • Azure Database Migration Service
  • Azure Databricks
  • Azure DevOps
  • Azure Event Grid
  • Azure Functions
  • Azure IoT
  • Azure Portal
  • Azure PowerShell
  • Azure Queue Storage
  • Azure SQL
  • Azure Storage
  • Azure Virtual Datacenter
  • Azure WebApps
  • Big Data
  • Bing
  • Blazor
  • Blog
  • Bots
  • C#
  • C# 7.0
  • C# 7.1
  • C# 7.2
  • C# 7.3
  • C# 8.0
  • C# 9.0
  • Channel 9
  • Codeplex
  • Codespaces
  • Containers
  • Debugging
  • DevOps
  • Docker
  • Electron
  • Entity Framework
  • Entity Framework Core
  • Entity Framework Core 3.0
  • Entity Framework Core 5
  • Eventos
  • F#
  • FaaS
  • FeatureFlags
  • FeatureToggles
  • Feeds
  • Fluent Assertions
  • General
  • GIMP
  • Git
  • GitHub
  • Go
  • Google
  • Google Analytics
  • Gradle
  • gRPC
  • GSA
  • Historia de la Informática
  • HoloLens
  • HtmlAgilityPack
  • IdentityServer4
  • Inkscape
  • Ionic
  • iOS
  • IoT
  • Java
  • JavaScript
  • JDBC
  • JSON
  • Kubernetes
  • Lenguajes de Programación
  • Libros y Cursos
  • LINQ
  • Linux
  • LiteDB
  • Machine Learning
  • macOS
  • Microservices
  • Microsoft
  • Microsoft .NET Framework 4.5
  • Microsoft 365
  • Microsoft Azure
  • Microsoft Build
  • Microsoft Ignite
  • Microsoft Learn
  • Microsoft Orleans
  • Microsoft Surface Go
  • Microsoft Teams
  • ML.NET
  • MQTT
  • MRO
  • MS-DOS
  • MsCoders Madrid
  • MVP
  • NancyFx
  • Node.js
  • NoSQL
  • NuGet
  • NUnit
  • OData
  • ODP.NET Core
  • Office 2007
  • Office 2010
  • Office 2013
  • Office 2016
  • Office 2019
  • Office 365
  • Open Source
  • Open XML SDK
  • Opinión
  • Orchard CMS
  • OT
  • PaaS
  • Patterns
  • PdfSharpCore
  • Performance
  • PHP
  • Postman
  • Power BI
  • PowerShell
  • PowerShell Core
  • Productividad
  • Project Server 2019
  • R
  • Rendimiento
  • Scala
  • Scraper
  • Security
  • Serverless
  • Service Fabric
  • SharePoint Server 2019
  • SignalR
  • Sin categoría
  • Sistemas Distribuidos
  • Skype
  • Skype for Business Server 2019
  • Small Basic Online
  • SQL Server 2005
  • SQL Server 2008
  • SQL Server 2012
  • SQL Server 2014
  • SQL Server 2016
  • SQL Server 2017
  • SQL Server 2019
  • STOMP
  • Swagger
  • Testing
  • TFS 2017
  • TFS 2018
  • Tools
  • TypeScript
  • Unity
  • UWP
  • UX
  • Visio
  • Visual Basic
  • Visual Studio 2010
  • Visual Studio 2012
  • Visual Studio 2013
  • Visual Studio 2015
  • Visual Studio 2017
  • Visual Studio 2017 for Mac
  • Visual Studio 2019
  • Visual Studio 2019 for Mac
  • Visual Studio App Center
  • Visual Studio Code
  • Visual Studio IntelliCode
  • Visual Studio Live Share
  • Visual Studio Live Share Audio
  • Visual Studio Online
  • VS Anywhere
  • Vue.js
  • Web API
  • WebAssembly
  • WinDbg
  • Windows
  • Windows 10
  • Windows Compatibility Pack
  • Windows Phone 10
  • Windows Phone 7
  • Windows Phone 8
  • Windows Server 2008
  • Windows Server 2012
  • Windows Server 2016
  • Windows Server 2019
  • Windows Service
  • WinForms
  • WinUI
  • WPF
  • Xamarin
  • Xbox
  • Xcode
  • Xiaomi Mi Band 2
  • xUnit
  • YAML

Archivos

  • enero 2021
  • diciembre 2020
  • noviembre 2020
  • octubre 2020
  • septiembre 2020
  • agosto 2020
  • julio 2020
  • junio 2020
  • mayo 2020
  • abril 2020
  • marzo 2020
  • febrero 2020
  • enero 2020
  • diciembre 2019
  • noviembre 2019
  • octubre 2019
  • septiembre 2019
  • agosto 2019
  • julio 2019
  • junio 2019
  • mayo 2019
  • abril 2019
  • marzo 2019
  • febrero 2019
  • enero 2019
  • diciembre 2018
  • noviembre 2018
  • octubre 2018
  • septiembre 2018
  • agosto 2018
  • julio 2018
  • junio 2018
  • mayo 2018
  • abril 2018
  • marzo 2018
  • febrero 2018
  • enero 2018
  • diciembre 2017
  • noviembre 2017
  • octubre 2017
  • septiembre 2017
  • agosto 2017
  • julio 2017
  • junio 2017
  • febrero 2015
  • octubre 2014
  • junio 2014
  • marzo 2014
  • febrero 2014
  • enero 2014
  • diciembre 2013
  • septiembre 2013
  • agosto 2013
  • julio 2013
  • junio 2013
  • abril 2013
  • febrero 2013
  • enero 2013
  • diciembre 2012
  • noviembre 2012
  • septiembre 2012
  • agosto 2012
  • junio 2012
  • mayo 2012
  • abril 2012
  • marzo 2012
  • febrero 2012
  • enero 2012
  • diciembre 2011
  • noviembre 2011
  • octubre 2011
  • septiembre 2011
  • agosto 2011
  • julio 2011
  • junio 2011
  • mayo 2011
  • abril 2011
  • marzo 2011
  • enero 2011
  • diciembre 2010
  • noviembre 2010
  • octubre 2010
  • septiembre 2010
  • agosto 2010
  • julio 2010
  • junio 2010
  • mayo 2010
  • abril 2010
  • marzo 2010
  • febrero 2010
  • enero 2010
  • diciembre 2009
  • noviembre 2009
  • octubre 2009
  • septiembre 2009
  • agosto 2009
  • julio 2009
  • junio 2009
  • mayo 2009
  • abril 2009
  • marzo 2009
  • febrero 2009
  • enero 2009
  • diciembre 2008
  • noviembre 2008
  • octubre 2008
  • septiembre 2008
  • agosto 2008
  • julio 2008
  • junio 2008
  • mayo 2008
  • abril 2008
  • marzo 2008
  • febrero 2008
  • enero 2008
  • diciembre 2007
  • noviembre 2007
  • octubre 2007
  • septiembre 2007
  • agosto 2007
  • julio 2007
  • junio 2007
  • mayo 2007
  • abril 2007
  • marzo 2007
  • febrero 2007
  • enero 2007
  • diciembre 2006
  • noviembre 2006
  • octubre 2006
  • septiembre 2006
  • agosto 2006
  • julio 2006
  • junio 2006
  • mayo 2006
About This Site

A cras tincidunt, ut tellus et. Gravida scel ipsum sed iaculis, nunc non nam. Placerat sed phase llus, purus purus elit.

Archives Widget
  • January 2010
  • December 2009
  • November 2009
  • October 2009
Categories
  • Entertainment
  • Technology
  • Sports & Recreation
  • Jobs & Lifestyle
Search
  • twitter

Powered by WordPress  |  Business Directory by InkThemes.

This site uses cookies: Find out more.