BloomRPC o cómo jugar y probar nuestros servicios gRPC
Introducción
En esta entrada voy a tratar de mostrarte cómo probar y jugar con tu servicio gRPC.
Para ello, voy a utilizar BloomRPC (GUI Client for GRPC Services) desarrollado en Electron, y que está disponible para Linux, Mac y Windows.
Podrás encontrar la última versión de BloomRPC aquí.
Las herramientas cliente para probar nuestros servicios gRPC no han llegado a un estado de madurez necesario ni suficiente aún, pero con herramientas como estas, podemos «jugar» un poco con nuestros servicios para tratar de estudiar su comportamiento y ver si realmente hace lo que tiene que hacer.
Creación de nuestro Servicio gRPC
Para lograr este propósito, he creado un servicio gRPC siguiendo los pasos que Microsoft indica en su pequeño tutorial introductorio Tutorial: Create a gRPC client and server in ASP.NET Core.
Así que partiré de la base de que ya tienes preparado el correspondiente proyecto.
Una vez que has preparado el servicio, vamos a ejecutar directamente BloomRPC, así que presupongo que ya has instalado la herramienta en tu entorno.
Probando BloomRPC
Dentro de la herramienta, agregaremos el fichero proto de nuestra aplicación, que en el caso de la plantilla automática de Microsoft se llama greet.proto.
Para agregar el fichero proto en BloomRPC deberemos hacer clic sobre el botón +:
Seleccionaremos el fichero proto y éste aparecerá cargado en el entorno:
Por defecto y en la parte derecha de la herramienta, aparecerá el json que será enviado al servicio.
Si ejecutamos el servicio y después, una vez cargado, ejecutamos una petición con el botón play de BloomRPC, aparecerá un error:
¿Cómo resolver este error?.
Modificando parámetros en el servicio
Para resolver el problema, deberemos modificar una serie de parámetros en el servicio dentro de Kestrel.
Abriremos la clase Program y eliminaremos el código de la función CreateHostBuilder.
En su lugar, escribiremos lo siguiente, que lo que hace es utilizar HTTP/2 y HTTP en el puerto 5001 que es el que por defecto se crea en la plantilla.
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureKestrel(options => { options.Listen(IPAddress.Any, 5001, listenOptions => { listenOptions.Protocols = HttpProtocols.Http2; }); }); webBuilder.UseStartup(); });
Probando BloomRPC nuevamente
Ejecutaremos el servicio otra vez, esperaremos a que se cargue y ejecutaremos BloomRPC nuevamente.
Observaremos que la consola nos ha levantado un warning y es que en realidad estamos sobreescribiendo el puerto y protocolo.
Si todo ha ido correctamente, obtendremos ahora un resultado satisfactorio como el que se indica a continuación:
De esta forma, podemos explorar nuestros servicios gRPC, estudiar su comportamiento, los datos de ida y vuelta, etc.
Me falta probar bien su uso en streaming, pero en llamadas unitarias normales funcionan perfectamente como hemos podido ver.
Considera también, la posibilidad de trabajar con directivas de compilación para evitar que te llevas a producción el cambio de configuración en el protocolo a la hora de trabajar con BloomRPC.
Hay múltiples estrategias (no sólo la que apunto de directivas de compilación), pero usando esta característica, nuestro código quedaría algo similar a lo que se indica a continuación:
public static IHostBuilder CreateHostBuilder(string[] args) { #if DEBUG return Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureKestrel(options => { options.Listen(IPAddress.Any, 5001, listenOptions => { listenOptions.Protocols = HttpProtocols.Http2; }); }); webBuilder.UseStartup(); }); #else return Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); #endif }
Cabe destacar que ASP.NET Core gRPC no está actualmente soportado dentro de IIS o Azure App Service, ya que la implementación de HTTP/2 de Http.Sys no soporta encabezados finales o en la cola de la respuesta HTTP (HTTP response trailing headers). Más información aquí.
También podría interesarte este otro hilo de GitHub al respecto.
Espero que todo esto te sirva de ayuda en tus desarrollos con gRPC.
Happy Coding!