Systemic: solución milagrosa para desarrollar microservicios perfectos en Node.JS

November 27, 2020

Systemic: solución milagrosa para desarrollar microservicios perfectos en Node.JS

Photo by Lukas Blazek on Unsplash

Que es Systemic?

Para comprender qué es Systemic, debemos comprender qué significan las inyecciones de dependencia. La inyección de dependencia (DI) es una técnica en la que un objeto recibe otros objetos de los que depende. Estos otros objetos se denominan dependencias. Los marcos y bibliotecas de inyección de dependencias modernos nos brindan la posibilidad de pasar dependencias como parámetros o referencias.

"Systemic es una biblioteca de inyección de dependencia mínima para NodeJS"

Systemic no es un framework, es una biblioteca que se encarga de crear un árbol de dependencias conectando las diferentes piezas de las que está hecho su código. Systemic no te obliga a definir las cosas de una determinada manera y no te dice cómo codificar tus piezas de software, lo que hace es fomentar un crecimiento orgánico de una aplicación durante su desarrollo promoviendo el uso de las prácticas definidas en twelve-factor app methodology.

Systemic y trenes

En Guidesmiths estamos acostumbrados a aprovechar lo Systemic para desarrollar nuestros microservicios. Imaginemos nuestro microservicio como un valor de envío de tren para el cliente, luego podemos decidir aportar valor de una de las dos formas siguientes:

  1. Malo: podemos enviar nuestro código y sus funcionalidades todos juntos dentro de un gran vagón único

  2. Good - Podemos enviar nuestro código y sus funcionalidades intentando dividirlos lo máximo posible según la responsabilidad que tengan

Con el primer acercamiento pondríamos en un vagón todas las herramientas (pasajeros) que estemos usando (express, mongo, rabbit MQ, etc…), ahora imaginamos que queremos cambiar, modificar, mover cualquiera de los pasajeros que tengamos en ese vagón. Entraríamos y veríamos muchos pasajeros juntos, ¡y tendremos que revisar asiento por asiento para encontrar los pasajeros que estamos buscando!

no-systemic-train

Con el segundo enfoque, colocaríamos a todos los pasajeros relacionados con la responsabilidad en un vagón específico, por lo que agregarlos, modificarlos o eliminarlos sería más fácil. Systemic nos ayudará mucho a hacer esto.

systemic-train

¿Que necesitamos hacer? Comencemos con los 4 conceptos principales de Systemic

  1. System  -  Nuestro tren
  2. Runners  - Nuestra locomotora
  3. Components  - Los vagones del tren
  4. Dependencies  -  La que uno los vagones

System

Un servicio basado en Systemic es un sistema en el que todos sus componentes y dependencias estarán en su lugar y listos para ser utilizados.

Un manifiesto de sistema es la forma sistémica de definir qué es el sistema y de qué componentes está compuesto.

Para agregar un componente solo necesita usar el método .add () como este:

Documentation here

Cuando inicia el sistema, systemic itera a través de todos los componentes, iniciándolos en el orden derivado del gráfico de dependencia con await system.start ().

Cuando detiene el sistema await system.stop (), systemic itera a través de todos los componentes deteniéndolos en el orden inverso.

Runner

A runner es una función simple que ejecuta la función de arranque de nuestro sistema, es como una locomotora que da energía para arrancar el tren.

Documentation code here

También puede utilizar corredores ya creados:

Components

Un componente de nuestro sistema no es más que un subsistema que debe estructurarse como una función que devuelve un objeto con dos funciones de propiedad asíncronas para iniciarlo y detenerlo, como si todos los coaches estuvieran disponibles para ser iniciados y detenidos cuando lo necesiten.

Documentation here

Dependencies

¿Qué pasa si necesitamos pasar información entre vagones?

Como hemos hecho para el sistema principal tenemos que definir un manifiesto para cada uno de sus subsistemas (componentes) con el fin de especificar quién depende de quién, es aquí donde tenemos que usar el método .dependsOn () justo después del Método .add ().

Podemos pasar como argumento a ese método la cadena que representa el nombre del componente del que dependemos.

Luego, en el momento de inicio, el componente recibirá el objeto de dependencia completo del componente conectado a él en el método .dependsOn ().

Intentemos explicar esto con un ejemplo:

Documentation here

En este ejemplo, en la función de inicio del componente mongo se inyectará una propiedad que es el objeto devuelto por la función de inicio del componente de configuración. Esta es la forma en que los componentes pueden depender entre sí.

complete-train

Este es un sistema básico representado como un tren.

Y si quiero:

El ecosistema Systemic

Es posible que una gran cantidad de componentes que se pueden usar con systemic ya se hayan creado y enviado como paquetes npm como: systemic-rabbitmq or systemic-mongodb

Yo systemic

Systemic tiene su propia yeoman generator para acelerar la creación de un nuevo proyecto listo para ser completado con su propia lógica empresarial. Creará un sistema con un montón de capacidades listas para ser utilizadas como componentes, configuración, documentos, prueba, archivos de docker, archivos de eslint. Como esto codesandbox.

Si necesita ver un ejemplo con alguna lógica de negocios ya implementada, puede usar el comando --showcase y ver un ejemplo de palabra real.

Conclusiones

Esto fue solo una pequeña charla sobre lo que systemic es capaz de hacer, en un escenario del mundo real podemos imaginar una aplicación basada en Systemic como una especie de enorme sistema de trenes, donde cada tren, autocar y pasajero puede comunicarse, compartir información, comenzar o deténgase cuando lo necesiten.

Puede haber algunos inconvenientes, Systemic puede no funcionar de la forma en que está acostumbrado a organizar su código y su ecosistema aún puede perder algo. Es por eso que escribí este artículo, quería hacerle saber que Systemic está ahí fuera y que podemos cultivarlo juntos.

Otros recursos: ¿Cómo puede llegar su tren al 88Mph de Matteo Di Paolantonio🚆