Construyendo un monolito modular con Fastify

Spanish audio is available in the player settings
Rate this content
Bookmark

En mi viaje por Nodeland, vi a la mayoría de los equipos luchando con la naturaleza libre de desarrollo de Node.js: no hay barreras para la máxima flexibilidad. Sin embargo, no todos los caminos ofrecen un viaje suave.
¿Cómo construir aplicaciones que estén bien organizadas, sean probables y extensibles? ¿Cómo podríamos construir un código que resistiera la prueba del tiempo?
En esta charla, exploraremos cómo evitar la trampa de los Singletons para crear aplicaciones robustas de Node.js a través del uso de plugins de Fastify: ¡construiremos un monolito modular!

30 min
14 Apr, 2023

Comments

Sign in or register to post your comment.

Video Summary and Transcription

Fastify es una herramienta poderosa para construir aplicaciones web y APIs en Node.js, con millones de descargas por mes. Promueve la encapsulación y estructuración a través de plugins y decoradores, permitiendo la segmentación de código y datos. La charla enfatiza la importancia de modularizar las aplicaciones por dominios y características, y muestra una demostración de una aplicación típica de Fastify. El orador también discute los beneficios de usar Platformattic para refactorizar y lanzar aplicaciones Fastify en la nube. La sección de preguntas y respuestas cubre temas como la inyección de dependencias y la depuración, mientras también destaca la importancia de separar la lógica de negocio de los contratos de API.

Available in English

1. Introducción a Fastify

Short description:

Encantado de estar aquí en el Congreso de Node. Hablando de Fastify, una poderosa herramienta para construir aplicaciones web y APIs en Node.js. Tiene un registrador incorporado llamado Pino. Fastify es ampliamente utilizado con millones de descargas por mes. El problema con el uso de un sistema de controlador de vista de modelo es que no escala bien en complejidad. En lugar de construir una capa de vista, nos enfocamos en construir APIs. Esto puede llevar a un gran número de modelos y un archivo routes.js extenso.

Entonces, encantado de estar aquí en el Congreso de Node. He estado... Mira, he sabido de esta conferencia durante un tiempo, y es genial finalmente estar aquí en Berlín. Ha pasado mucho tiempo desde que vine a Berlín, y me ha hecho falta. Entonces, mira, estoy aquí hablando de Fastify. Entonces, es genial estar aquí, y así sucesivamente.

Entonces, un par de cosas sobre mí. También tengo un boletín de noticias, y en el Reino Unido, si no importa, solo suscríbete allí, o sígueme en Twitter, en Matteo Collina. Y también estoy transmitiendo en Twitch, así que si te gusta eso, puedes unirte. Además, necesito corregir a Liz, porque desde que puse en la biografía, en realidad son 17 mil millones en 2022. Lo que sea. Como, es muy divertido.

Entonces, está bien. Entonces, hoy, estamos hablando de Fastify. Y si no conoces Fastify, probablemente deberías, pero probablemente deberías usarlo si estás usando Node.js, ¿verdad? Esto no es el Congreso, así que no lo sé. Probablemente deberías usar Fastify para construir tus aplicaciones web y backends y APIs. ¿Cómo lo usas? Muy fácil, requieres importar lo que sea. Tiene un registrador incorporado. EpiDays, quieres un registrador en tu aplicación, ¿verdad? Se llama Pino. Y puedes usarlo para crear tus rutas usando AsyncAwait y todas las otras travesuras que podrías querer. Probablemente son 4 mil millones de veces por año o algo así, descargas por mes.

Entonces, está bien. Hablemos un poco sobre por qué no deberías usar Fastify o cualquier cosa, o cómo no usar Node.js. ¿Cuántos de ustedes han construido un sistema de controlador de vista de modelo en su carrera? Genial. ¿Cuál es el problema con este sistema es que finalmente no escala? ¿En qué sentido no escala? Bueno, no escala bien en complejidad. Si estás construyendo una aplicación, y la estás construyendo siguiendo los controladores de vista de modelo, está bien, comencemos con la vista. La mayoría de las veces ya no hay una capa de vista, solo construimos API, así que eso se ha ido. Entonces, si estás escribiendo un pedazo de código, o va al controlador o a los modelos, y si, ya sabes, hay un 50% de posibilidades. Después de un tiempo tienes 2000 modelos y un archivo routes.js que tiene 10,000 líneas de largo.

2. Construyendo Monolitos con Fastify

Short description:

Verdad. MVC lleva a Carbonara y código spaghetti. En su lugar, estructura tu aplicación por dominios y características. Evita mezclar las bases de datos de las características. Fastify ofrece encapsulación a través de plugins, permitiendo la segmentación de código y datos. No tiene costo ni sobrecarga y soporta decoradores. La encapsulación permite contextos anidados sin compartir datos entre capas.

Verdad. Este es un número real de code. Así que realmente no funciona bien de esa manera, y no scale bien en complejidad. ¿Qué haces en su lugar? Porque la pregunta es, si el controlador de vista de modelo no es suficiente, ¿qué haces en su lugar? Y cómo algunas pocas compañías importantes y algunos sistemas importantes pueden construir monolitos, porque el controlador de vista de modelo no es bueno pero aún así envían monolitos. Así que hay algunos artículos de vez en cuando sobre monolitos, y por qué y cómo, qué están haciendo.

Bueno, para ser honesto, MVC lleva a Carbonara y code spaghetti, pero me gusta la Carbonara y no el code spaghetti. Eso es todo. Entonces, ¿cómo lo haces? Necesitas estructurar tu aplicación por dominios, por características. Necesitas identificar cuáles son las características clave de tu aplicación y segmentarla. Y entre esos sistemas, tiendes a comunicarte a través de APIs bien conocidas. La parte importante es, no tener un conjunto de características, leer la database del otro conjunto de características. Porque en el momento en que empiezas a sumergirte en ambos, entonces tienes mucho, no sabes cómo terminas con tus relaciones. Otra forma de decirlo es que si para obtener un data, necesitas hacer un 10, necesitas unir 10 tablas, probablemente tienes el esquema equivocado. ¿De acuerdo? Así que piensa en eso y en lo que estás haciendo y reflexiona sobre tus elecciones de vida.

Entonces, ¿qué hace un dominio y cómo construimos un monolito? Como es algo que queremos hacer, ¿verdad? Es algo bueno. Y bueno, sabes, normalmente, es un tema específico que se está desarrollando, ¿de acuerdo? Los casos típicos son el catálogo o el sistema de gestión de pedidos o un carrito o como quieras llamarlo, ¿de acuerdo? En algunas de las cosas que han estado desarrollando recientemente, se llama, tenemos un dominio que es la organización y los equipos y otras cosas son sobre las aplicaciones y el code que ejecutas en nuestra cloud. De todos modos, son dominios, y quieres evitar el code spaghetti. Entonces, ¿qué ofrece Fastify para ayudar a construir con esto? Fastify ofrece un concepto llamado encapsulación. Así que te permite estructurar tu aplicación en un conjunto de plugins que puedes usar para segmentar tus data, para segmentar tu code y de esa manera no comparten nada, esencialmente. Ahora algunos pueden preguntar pero podrías hacer esto antes, ¿verdad? Hay otras técnicas. Sí, pero esto no tiene costo, no tiene sobrecarga alguna. ¿De acuerdo? Es súper rápido, así que no tienes nada que pagar por ello. Y es genial. También tiene un concepto de esto llamado decorador. Así que puedes agregar cosas a tu code y aplicación. Entonces, ¿cómo funciona la encapsulación? Básicamente puedes crear contexto dentro de contexto dentro de contexto dentro de este contexto, como una especie de gran matrioshka, y cada capa no comparte nada con la anterior. Es genial. Algo desapareció. Bueno, divertido. Algo falta.

3. Encapsulación y Estructuración con Fastify

Short description:

Podemos usar la llamada register para crear contextos de encapsulación, decorar objetos de solicitud o respuesta con data e información, y utilizar hooks. El plugin de Fastify permite romper la encapsulación y estructurar la aplicación como sub-aplicaciones con sus propios dominios y sub-dominios. Cada sub-aplicación puede tener sus propios plugins, rutas y estructura de código. Los plugins también pueden ser utilizados para metaprogramación y personalización del comportamiento del sistema. En las aplicaciones de JavaScript, los plugins y las rutas se utilizan para la estructuración.

No lo sé. Vale, divertido. Había un ejemplo allí. No lo sé. Vale, llegó. No tengo ni idea. No he hecho nada. Genial. Lo que pasó es que... Lo que puedes ver aquí, podemos usar esta llamada register para crear estos contextos de encapsulación, y podemos decorar nuestros objetos de solicitud o respuesta con data e información, y tenemos un concepto de hooks.

Aquí tenemos hooks, y tenemos el hook onRequest donde establecemos el data, y esto llevará... Dadas las dos rutas, tendrás un valor diferente. Ves eso uno y dos. Y esos tendrán los mismos valores diferentes que se han poblado en base al concepto... Basado en los metadatos, en los que se está ejecutando la ruta. Es genial, porque de esta manera, podríamos crear nuestras cosas mejor. Entonces, ¿cómo lo haces... Pero ya sabes, en todo sistema de encapsulación, hay una forma de romper la encapsulación. Entonces, ¿cómo rompes la encapsulación? Bueno, hay una utilidad llamada plugin de Fastify que te permite hacer eso.

El concepto clave es que quieres proporcionar, crear, estructurar tu aplicación como pequeños bits de sub-aplicaciones. De modo que cada una de ellas contenga su propio dominio y su propio sub-dominio. Y de esa manera, puedes scale tu desarrollo de JavaScript a diferentes partes. Y cada una de ellas tiene sus propios plugins, sus propias rutas, y toda la estructura de su code. ¿Cómo rompes el término de encapsulación? Usas estos bonitos, puedes usar un skip override o el plugin de Fastify de nuevo. Nos faltan algunas diapositivas, así que estoy, vale, llegó. Además, puedes usar plugins para hacer metaprogramación. Cuando registras un plugin o una ruta, podrías empezar automáticamente a crear un nuevo comportamiento. Personalizar automáticamente la forma en que funciona el sistema. Vamos a saltar, estoy un poco tarde. ¿Cómo estructuras tu aplicación normal de JavaScript? Usas plugins y rutas para estructurar tu cosa.

4. Construyendo un Monolito Modular

Short description:

Para construir un monolito modular, necesitas identificar el dominio, estructurar tus carpetas de código y utilizar plugins y decoradores para compartir código entre dominios.

Estas son estructuras típicas para un monolito, ¿verdad? Esto no es modular en absoluto, es solo un monolito. Bueno, está bien. Esta no es la diapositiva que se suponía que debía mostrar. Bueno, ahora es verde. Entonces, ¿cómo construimos un monolito modular? En primer lugar, es uno, y ha llegado. Necesitas identificar el dominio que quieres trabajar, y luego dos... Bueno, necesitas estructurar tus carpetas de código para que puedas organizar tus dominios uno a la vez. Y tres, es lo mismo. Va a ser divertido cuando haga la codificación en vivo. Me has gafado, Paolo. Esto es totalmente por ti. Entonces tres, puedes usar plugins y decoradores para compartir code entre dominios.

5. Demostración de Fastify

Short description:

Vamos a hacer una rápida demostración de una aplicación típica de Fastify. Tenemos una carpeta con server.js que inicia la aplicación y la configura. En la aplicación, cargamos Fastify y utilizamos Fastify autoload para cargar automáticamente plugins y rutas. Tenemos plugins para la gestión de errores y el manejo de no encontrados. También tenemos un objeto de inventario para almacenar datos y dos rutas para productos e inventario. Vamos a ejecutar la demostración y ver los resultados.

Y vamos a hacer una rápida demostración ahora porque de hecho, es hora de la demostración. Y esto se suponía que iba a ser una bonita imagen de Roma, y los dioses de la demostración deberían estar conmigo. Pero, aparentemente, está bien, esto está empezando súper bien. Así que veamos cómo va.

Bueno, aquí vamos. Así que tenemos esta bonita carpeta. Y en esta bonita carpeta tenemos algunas cosas. Así que estas son aplicaciones típicas de Fastify. Tengo mi server.js que inicia las cosas, y configuramos mi, tenemos un método de construcción para construir la aplicación. Y luego puedo cerrar mi, escuchar algo en el puerto y el host. Y luego cerrar la aplicación, genial. Y en mi aplicación, ¿qué hago? Bueno, en mi aplicación cargo Fastify. Utilizo una utilidad llamada Fastify autoload para cargar automáticamente todos mis plugins, o mis rutas. Y luego devuelvo la aplicación.

¿Cuáles son mis plugins? Bueno, tengo algunos plugins diferentes. Tengo uno para gestionar el error, y uno para hacer el manejo de un no encontrado. Y mira, quieres un no encontrado y una gestión de errores, ¿verdad? Así que, vale, y tenemos algo llamado inventario. ¿Qué es un inventario? Bueno, el inventario es una especie de objeto que utilizo para almacenar data, ¿vale? En algún momento, necesitas una entidad, alguien que quieras obtener algo de data de la database, ¿vale? Y puedes usar lo que quieras. Puedes usar Prisma. Puedes usar Next. Puedes usar solo el controlador de la database. Pero en algún momento, necesitarás tener alguna utilidad que lea data de la database para ti. Así que de eso se trata esto. Y lo falsificó completamente, ¿vale? Simplemente devolvió verdadero si esta SQ es para tejido, ¿vale?

¿Cuáles son nuestras rutas? Tenemos dos rutas. Una es el producto. Así que queremos una ruta para productos, y eso devuelve. Y luego también consultamos para obtener nuestro inventario, ¿vale? Y también, tenemos un inventario que acaba de devolver el número de artículos que están en la tienda para ese SQ. ¿Por qué estamos haciendo esta estructura de API, quién sabe, ¿vale? Pero ese no es el punto. Así que, vale, tenemos esta estructura. Vamos a ejecutar esto y veamos cómo va.

6. Modularización de Rutas y Carga

Short description:

Podemos consultar el catálogo de productos y el inventario. Fastify autoload proporciona una estructura de enrutamiento basada en el sistema de archivos. Podemos refactorizar nuestra carpeta de rutas para convertirla en módulos y crear subcarpetas para rutas dentro de cada módulo. El punto de interacción clave entre el catálogo y el inventario es el archivo inventory.js, que pertenece al subsistema de inventario. Creamos un archivo index.js y cargamos nuestras rutas utilizando la utilidad autoload.

Entonces hacemos Node server, y luego podríamos hacer... hagamos eso, ¿vale? Podemos hacer curl. Y podemos ir y consultar el catálogo de los productos, ¿vale? Y puedes ver el resultado. Y luego puedes ir al inventario, y producto 42, y obtienes los data. Y luego si es 43, no obtienes nada, ¿vale? Nota que ves que hay un prefijo, y el prefijo es la carpeta. Entonces Fastify autoload realmente te da esa agradable estructura de enrutamiento basada en el sistema de archivos de Fastify para estructurar tu cosa.

Entonces, esta estructura es bastante buena, ¿vale? Esto es un buen monolito, esencialmente, lo que llamarías arquitectura MVC, muy cercana. Pero es algo que puede llevarte muy lejos. ¿Cómo migramos esto para ser un monolito modular? ¿Y cómo podemos tener varios equipos comunicándose entre sí, y compartiendo code de una mejor manera? Vale, comencemos haciendo un poco de refactorización a esto.

Entonces, primero que nada, tomemos nuestra mágica carpeta de rutas, y llamémosla modules, porque nos gusta, ¿verdad? Así que no es ruta, son modules. Entonces, y ahora nos estamos convirtiendo en una arquitectura modular, ¿verdad? Así es como lo haces, ¿vale? Entonces, y todavía tienes tu catálogo y tu inventario, pero ahora creamos subcarpetas para rutas, y mueves las cosas allí. Vale, y luego inventario. Y mueves las otras rutas. Genial, tenemos, tal vez he hecho mi movimiento en estas cosas, ¿y por qué hacemos esto? Bueno, quedará claro en un segundo. Así que hemos hecho esto, estas dos migraciones, ¿vale? ¿Cómo los separamos? Entonces, el punto de interacción clave entre el catálogo y el inventario es este archivo inventory.js, que es un plugin. Entonces necesitamos hacer algo al respecto porque esto realmente, pertenece al subsistema de inventario. Entonces, lo que hacemos es abrirlo y creamos, aquí creamos un archivo index.js. Y en este archivo, literalmente, estoy haciendo trampa mal. Solo estoy poniendo cosas aquí, vale, copiando estas. Bueno, ya no necesitaremos esto. Te mostraré en un segundo por qué. Así que tenemos esto y genial. Ahora necesitamos algunas cosas más. Entonces queremos cargar nuestras rutas. Entonces vamos y copiamos estas dos cosas. Obtenemos el autoload y esta utilidad llamada DSM que escribí. No preguntes por qué porque es una mala respuesta. Así que no quieres unir rutas. Entonces aquí tomas eso y oh solo copias esto. Vale, entonces aquí vas al inventario y después de hacer eso has configurado la cosa de autoload y para cargar nuestras rutas.

7. Refactorización y Mejoras con Platformattic

Short description:

Hemos refactorizado todo y ahora podemos reiniciar esta aplicación. Se está bloqueando, pero lo arreglamos. Ahora podemos consultarla y ver que todavía funciona igual que antes. ¿Podemos hacer algo mejor? Sí, podemos. Hemos estado trabajando en una nueva empresa llamada Platformattic. Podemos crear un nuevo archivo de configuración Platformattic.service.json y abrir un servidor.

Bueno, entonces esto está hecho. Bueno, ahora lo que necesitamos hacer es esencialmente hacer lo mismo para nuestro catálogo. Y aquí vamos y no necesitamos el inventario. Bueno, usaremos el inventario de la capa superior. Genial, necesitamos una cosa más. Bueno, queremos establecer el prefijo. Entonces necesitamos las opciones y aquí necesitamos opciones y prefijo, ops prefijo. Genial. ¿Por qué lo haremos? Porque nuestra magia de autoload necesitará, configurará nuestro prefijo y solo necesitamos pasar eso. Entonces hacemos eso y tenemos, ¿qué es? ¡Bien! Entonces hemos creado, hemos configurado nuestras cosas. Ahora aquí podemos eliminar este archivo de inventario. Y aquí, oh, bueno no necesitamos, esto ya no son rutas. Son modules pero solo necesitamos cambiar algo. No queremos, queremos romper la encapsulación. Y solo queremos cargar cosas a un nivel. Entonces hemos refactorizado todo. Y ahora podemos reiniciar esta aplicación y se está bloqueando. ¡Bien! Y aquí vas y está arriba en lugar de fastify. ¡Genial! Bueno, y de nuevo es lo mismo en el otro archivo. Mira aquí, solo estoy cambiando esto fastify. ¡Genial! Entonces aquí vas y es... Vamos, sigo olvidando cosas. Bueno, aquí vas. ¡Genial! Entonces ahora podemos consultarla y puedes ver que esto todavía funciona igual que antes. Bueno, y los dioses de la demostración han estado mayormente conmigo. Así que estemos muy contentos con esto. Entonces hemos estado haciendo esta bonita refactorización y configurando cosas y parece bueno, ¿verdad? Sin embargo, ¿podemos hacer algo mejor? ¿Podemos mejorar nuestras cosas? Bueno, podemos. He estado trabajando durante un tiempo en una nueva empresa llamada Platformattic. Aquí viene el discurso, así que ten cuidado. Entonces, lo que podemos hacer aquí ahora es que podemos crear un nuevo archivo de configuración Platformattic.service.json y podríamos literalmente abrir un servidor.

8. Configurando Fastify y Lanzando la Nube

Short description:

Veamos si Copilot está lo suficientemente contento. Agregamos la propiedad del servidor, los plugins y los módulos. Eliminamos archivos innecesarios. La aplicación se reinicia automáticamente. Se generan documentos OpenAPI. PlatformaticDB genera APIs a partir de una base de datos. Construir un monolito modular se trata de crear y separar preocupaciones. Puedes migrar fácilmente a microservicios. Lanzamos nuestra nube gratuita para desplegar aplicaciones Fastify o Node.js.

Veamos si Copilot está lo suficientemente contento. Entonces platformattic.dev, esquemas, bueno, sí, no exactamente lo que debería ser. Esquemas, y aquí tenemos V20 y aquí vamos. Y esto es DB, está bien, genial. Y ahora se está quejando porque nos falta algo, así que queremos agregar la propiedad del servidor, y queremos escuchar el puerto, y que vaya a 1000, queremos el nombre del host, y queremos... Está bien, genial, necesitamos agregar algunas cosas más, así que una cosa que queremos agregar son los plugins, y queremos decirle que cargue cosas desde alguna ruta, que es una ruta, y necesitamos cargar los plugins primero, así que simplemente hacemos cargar plugins, genial, y simplemente no queremos encapsular esto, y esto es falso, genial. Ahora lo siguiente es que queremos cargar nuestros modules, y queremos los modules, no queremos encapsular, y queremos ir solo un nivel de profundidad, con un nivel de profundidad, y ahora puedo eliminar este archivo muy felizmente, eliminar este otro archivo muy felizmente, así que hay muchos menos archivos para mantener, y ahora puedo simplemente hacer esto NPX-PLT service start, y ahora todo sigue funcionando como antes. Entonces, y ahora hemos simplificado muchas cosas. Un punto extra de este enfoque es que podría simplemente hacer, por ejemplo, servicio, agregar más configuración, y simplemente activar OpenAPI. Verdadero, está bien. ¿Qué error cometí? No está permitido... Oh, es DB. Servicio. Claro, tiene razón. Bueno, aquí simplemente se reinicia. Bueno, se reinició automáticamente. Cosas geniales. Así que se reinicia automáticamente como has visto. Así que lo que podríamos hacer ahora es ir aquí y mirar la pérdida 3000 documentation y verás todos nuestros documentos OpenAPI docs generados automáticamente y configurados correctamente. También admite métricas automáticas, integración automática de permisos y muchas otras cosas que quieres en tu aplicación de producción Node.js. Hay otro componente llamado PlatformaticDB que genera automáticamente tus APIs a partir de una database, pero no estoy hablando de esto en esta presentación. Lo que quería decir al final es que construir un monolito modular se trata de crear y separar preocupaciones y en algún momento podrías querer cambiar a microservices. Pero si has hecho eso, ves todo el code que he hecho es solo un archivo de configuración para empezar, así que podrías migrar fácilmente a microservices ahora y tienes casi una arquitectura de no compartir nada. Así que solo quería decir al final que también acabamos de lanzar nuestra cloud. Así que si quieres desplegar tu aplicación Fastify o Node.js está ahí y es gratis. Así que gracias. ¿Se toman las instantáneas de las startups después de la optimization de la función? No creo que esta pregunta fuera para mí. Sí, no creo que sí. Pero si quieres puedo intentar responder a esa pregunta.

QnA

Preguntas y Respuestas sobre Inyección de Dependencias y Depuración

Short description:

Esta es una sección de preguntas y respuestas donde el orador responde preguntas sobre la inyección de dependencias y la depuración de microservicios Fastify. Explican que el mecanismo de inyección de dependencias mostrado es una forma sencilla de crear un contexto y adjuntar cosas a él. Es un sistema seco, del tipo no te repitas, que simplemente funciona. En cuanto a la depuración, el orador aconseja especificar esquemas tanto para los datos entrantes como para los salientes para garantizar la protección y una rápida representación de JSON.

Probablemente tengo la respuesta. No creo que esto sea para ti. Vale no. Espera. Parece que algo no está funcionando. Algo no está funcionando con las preguntas y respuestas. ¿Tienen alguna pregunta, amigos? Sí, simplemente levanta la mano y luego seguimos. A la antigua. Ooh. Sí, simplemente están... Vale, hay una pregunta allí.

¿Cuál es tu opinión sobre la inyección de dependencias basada en ShareCode? ShareCode, Fastify, ¿qué son? Sí, lo que acabo de mostrar es una forma muy simplista de inyección de dependencias. Esencialmente. La pregunta era, ¿qué piensas es lo que mostraste. Mecanismo de inyección de dependencias basado en compartir code a través del plugin Fastify. Si entiendo correctamente la pregunta, ¿verdad? Perfecto. Es exactamente eso. Es una forma muy cruda de crear un contexto y adjuntar cosas a ese contexto. Y para ser honesto, es un mecanismo de inyección de dependencias. Es principalmente un sistema muy seco, del tipo no te repitas. Y ni siquiera está basado en configuración. Simplemente creas tus plugins y puedes incluso especificar con Fastify autoload, incluso puedes especificar un poco qué otros valores necesitan ser decorados y todo se cargará correctamente. Entonces, sí, es un mecanismo de inyección de dependencias muy simple. Y desde mi punto de vista, es un mecanismo de inyección de dependencias que simplemente funciona, esencialmente.

Vale. Gracias. Tengo una pregunta aquí. ¡Oh, funcionó! ¡Choca esos cinco! Entonces, ¿cómo podemos debug que nuestro microservice Fastify está funcionando al máximo? Sí, esta es una pregunta fenomenal. Vale, lo primero que quieres hacer, quieres crear... Quieres asegurarte de que has especificado esquemas tanto para los data que entran como para los data que salen. De esa manera, estás protegido y también estás representando tu JSON lo más rápido posible.

Protegiendo Servicios y Reutilización de Código

Short description:

Puede utilizar el módulo under-pressure para proteger su servicio de sobrecarga. Asegura que su servicio devuelva un agradable error 503 cuando está sobrecargado. El módulo es parte de Platformatic y viene con soporte de autocompletado. Platformatics soporta la compilación completa de TypeScript, por lo que puede escribir plugins en TypeScript. Al modularizar por dominio, puede colocar el código que no cae bajo una categoría de dominio particular en una biblioteca de utilidades que puede ser compartida entre módulos. Es importante mantener el dominio y la base de datos separados para mantener la integridad de los datos.

Es genial. Entonces, la segunda parte es que quieres usar un módulo. Se llama under-pressure, y under-pressure protege tu servicio de ser sobrecargado. Así que, probablemente has oído hablar del trashing del bucle de eventos, y te protege automáticamente de eso y esencialmente asegura que si tu servicio recibe demasiada carga, empieza a devolver un agradable 503 y, al menos, no se está bloqueando o entrando en una situación que es irrecuperable. Ah, por cierto, ese módulo también es parte de Platformatic, así que lo obtienes gratis, si usas nuestras cosas. Genial.

Y el archivo JSON era muy específico. ¿Cómo sabría qué poner allí si no soy Matteo? Oh, hay autocompletado si no lo notaste. En realidad es muy sencillo de poner allí, se basa en el esquema JSON, y el esquema JSON proporciona una guía. Finalmente, allí, yay. Esa es mi próxima pregunta. Es genial, y puedes ponerlo allí, está totalmente documentado, pero también hay autocompletado. Así que si hay autocompletado, es genial.

Entonces, ¿odias TS? No, no, esa es la respuesta, no. No, no lo hago. De hecho, Platformatics soporta la compilación completa de TypeScript, así que puedes escribir tus plugins en TypeScript y todo funcionará bien como se espera. Así que sí, no, no odio TypeScript. ¿Qué pasa con los plugins cuando la aplicación se convierte en microservicios? Oh, ya sabes, microservicios es solo un plugin, ¿verdad? Así que, eso es lo que es.

Y cuando se modulariza por dominio, ¿dónde colocas el código que no cae bajo una categoría de dominio particular? Algunos ayudantes para ser reutilizados en los puntos finales de la API. Entonces, está bien, eso son dos partes. Entonces, cuando estás construyendo este tipo de sistema, tienes dos niveles de reutilización. Un nivel de reutilización es típicamente a nivel de código. Y cuando trabajas en equipos más grandes, especialmente en un monolito modular, tiendes a usar un mono-repositorio. Así que cada uno de tus módulos, como mostré, en lugar de ser estructurados, en lugar de ser solo una carpeta, también tiene un agradable JSON adjunto, ¿verdad? Así que podrías tener muy prácticamente una biblioteca de utilidades que estás importando y requiriendo allí. Así que si solo necesitas código para reutilizar la utilidad, puedes simplemente, ya sabes, compartir código. Y eso es todo. Si quieres establecer la parte clave es mantener el dominio separado, mantener la base de datos separada. Mantén los datos de cada dominio contenidos para que no se compartan entre límites. Genial. Pensamientos sobre la separación del transporte HTTP GraphQL PubSub de la lógica de negocio para permitir la reutilización de la lógica de negocio entre ellos.

Separando la Lógica de Negocio y los Contratos de API

Short description:

Separar la lógica de negocio del transporte es un desafío en el desarrollo de software. Las APIs son contratos entre desarrolladores, permitiendo la comunicación y el acceso a datos y lógica de negocio. La API y su interfaz son cruciales para una colaboración efectiva.

OK. Probablemente me perdí algunos. Sí, es así. OK, entonces, sí, mi punto aquí es que sería bueno hacerlo si pudieras separarlos. Y la dura realidad del desarrollo de software implica que en realidad es muy difícil separar la lógica de negocio del transporte. Y puedes hacerlo, pero requiere un esfuerzo gigantesco. Entonces, por supuesto, si puedes, hazlo. Pero en algún momento, estás pasando de ser un servidor HTTP que expone alguna API a ser una cola que expone alguna API, ¿OK? Y lo que es importante no es solo el code, sino también la forma en que se invoca el code. Y tiendo a poner el estrés en las cosas en las personas, no en el software. Y cuando defines una API, una API no es code. Una API, es un contrato entre personas. Entonces, nosotros, los desarrolladores del back end ofrecemos a ustedes, los desarrolladores de front end, acceso a data y lógica de negocio. Y la API y la interfaz de esa API es en realidad lo que más importa. Porque es lo que, es cómo podemos hablar y comunicarnos con un lenguaje común. Entonces, no sé, espero. ¿Puedes explicarnos Fastified como si tuviéramos cinco años? ¿En serio? ¿Sabes cuando vas y juegas en preescolar con todos tus amigos? Sí, eso es Fastified, ¿de acuerdo? Sabes, también puedes hacer eso, y eso es Fastified, o puedes jugar solo en tu casa, y eso son otros frameworks. No. Genial. ¿Es posible hacer que los plugins de Fastified sean seguros en términos de tipos, podemos estar seguros de que el plugin fue realmente registrado antes de intentar acceder a él? Entonces sí, los plugins de Fastified pueden ser seguros en términos de tipos. De hecho, hay una compatibilidad total donde puedes especificar tus rutas y automáticamente validar tus data y hacerlas seguras en términos de tipos usando Typebox o Zod o JSON Schema 2TS, tú sabes, eso probablemente sea una charla completa, solo mostrando todas estas cosas. Pero hice un video recientemente en YouTube sobre ese tema específico, así que si quieres, puedes ir y buscar Fastified seguro en términos de tipos y verlo, en 10 minutos lo entenderás. Pero sí, esa es la respuesta y solo haz eso. No puedes permitir, asegúrate de que el plugin esté registrado, pero eso requiere un paso extra. Y gracias. Entonces nuestra última pregunta, porque nos quedan unos segundos, es ¿vas a unirte a la fiesta después de la masterclass? Por supuesto que sí. ¡Por supuesto! ¡Vamos! ¿No lo harás tú?

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Node Congress 2022Node Congress 2022
26 min
It's a Jungle Out There: What's Really Going on Inside Your Node_Modules Folder
Top Content
Do you know what’s really going on in your node_modules folder? Software supply chain attacks have exploded over the past 12 months and they’re only accelerating in 2022 and beyond. We’ll dive into examples of recent supply chain attacks and what concrete steps you can take to protect your team from this emerging threat.
You can check the slides for Feross' talk here.
Node Congress 2022Node Congress 2022
34 min
Out of the Box Node.js Diagnostics
In the early years of Node.js, diagnostics and debugging were considerable pain points. Modern versions of Node have improved considerably in these areas. Features like async stack traces, heap snapshots, and CPU profiling no longer require third party modules or modifications to application source code. This talk explores the various diagnostic features that have recently been built into Node.
You can check the slides for Colin's talk here. 
JSNation 2023JSNation 2023
22 min
ESM Loaders: Enhancing Module Loading in Node.js
Native ESM support for Node.js was a chance for the Node.js project to release official support for enhancing the module loading experience, to enable use cases such as on the fly transpilation, module stubbing, support for loading modules from HTTP, and monitoring.
While CommonJS has support for all this, it was never officially supported and was done by hacking into the Node.js runtime code. ESM has fixed all this. We will look at the architecture of ESM loading in Node.js, and discuss the loader API that supports enhancing it. We will also look into advanced features such as loader chaining and off thread execution.
JSNation Live 2021JSNation Live 2021
19 min
Multithreaded Logging with Pino
Top Content
Almost every developer thinks that adding one more log line would not decrease the performance of their server... until logging becomes the biggest bottleneck for their systems! We created one of the fastest JSON loggers for Node.js: pino. One of our key decisions was to remove all "transport" to another process (or infrastructure): it reduced both CPU and memory consumption, removing any bottleneck from logging. However, this created friction and lowered the developer experience of using Pino and in-process transports is the most asked feature our user.In the upcoming version 7, we will solve this problem and increase throughput at the same time: we are introducing pino.transport() to start a worker thread that you can use to transfer your logs safely to other destinations, without sacrificing neither performance nor the developer experience.

Workshops on related topic

Node Congress 2023Node Congress 2023
109 min
Node.js Masterclass
Top Content
Workshop
Have you ever struggled with designing and structuring your Node.js applications? Building applications that are well organised, testable and extendable is not always easy. It can often turn out to be a lot more complicated than you expect it to be. In this live event Matteo will show you how he builds Node.js applications from scratch. You’ll learn how he approaches application design, and the philosophies that he applies to create modular, maintainable and effective applications.

Level: intermediate
JSNation 2023JSNation 2023
104 min
Build and Deploy a Backend With Fastify & Platformatic
WorkshopFree
Platformatic allows you to rapidly develop GraphQL and REST APIs with minimal effort. The best part is that it also allows you to unleash the full potential of Node.js and Fastify whenever you need to. You can fully customise a Platformatic application by writing your own additional features and plugins. In the workshop, we’ll cover both our Open Source modules and our Cloud offering:- Platformatic OSS (open-source software) — Tools and libraries for rapidly building robust applications with Node.js (https://oss.platformatic.dev/).- Platformatic Cloud (currently in beta) — Our hosting platform that includes features such as preview apps, built-in metrics and integration with your Git flow (https://platformatic.dev/). 
In this workshop you'll learn how to develop APIs with Fastify and deploy them to the Platformatic Cloud.
Node Congress 2023Node Congress 2023
63 min
0 to Auth in an Hour Using NodeJS SDK
WorkshopFree
Passwordless authentication may seem complex, but it is simple to add it to any app using the right tool.
We will enhance a full-stack JS application (Node.JS backend + React frontend) to authenticate users with OAuth (social login) and One Time Passwords (email), including:- User authentication - Managing user interactions, returning session / refresh JWTs- Session management and validation - Storing the session for subsequent client requests, validating / refreshing sessions
At the end of the workshop, we will also touch on another approach to code authentication using frontend Descope Flows (drag-and-drop workflows), while keeping only session validation in the backend. With this, we will also show how easy it is to enable biometrics and other passwordless authentication methods.
Table of contents- A quick intro to core authentication concepts- Coding- Why passwordless matters
Prerequisites- IDE for your choice- Node 18 or higher
JSNation Live 2021JSNation Live 2021
156 min
Building a Hyper Fast Web Server with Deno
WorkshopFree
Deno 1.9 introduced a new web server API that takes advantage of Hyper, a fast and correct HTTP implementation for Rust. Using this API instead of the std/http implementation increases performance and provides support for HTTP2. In this workshop, learn how to create a web server utilizing Hyper under the hood and boost the performance for your web apps.
React Summit 2022React Summit 2022
164 min
GraphQL - From Zero to Hero in 3 hours
Workshop
How to build a fullstack GraphQL application (Postgres + NestJs + React) in the shortest time possible.
All beginnings are hard. Even harder than choosing the technology is often developing a suitable architecture. Especially when it comes to GraphQL.
In this workshop, you will get a variety of best practices that you would normally have to work through over a number of projects - all in just three hours.
If you've always wanted to participate in a hackathon to get something up and running in the shortest amount of time - then take an active part in this workshop, and participate in the thought processes of the trainer.
TestJS Summit 2023TestJS Summit 2023
78 min
Mastering Node.js Test Runner
Workshop
Node.js test runner is modern, fast, and doesn't require additional libraries, but understanding and using it well can be tricky. You will learn how to use Node.js test runner to its full potential. We'll show you how it compares to other tools, how to set it up, and how to run your tests effectively. During the workshop, we'll do exercises to help you get comfortable with filtering, using native assertions, running tests in parallel, using CLI, and more. We'll also talk about working with TypeScript, making custom reports, and code coverage.