@coppel/microservices

Framework para el desarrollo de microservicios

Usage no npm install needed!

<script type="module">
  import coppelMicroservices from 'https://cdn.skypack.dev/@coppel/microservices';
</script>

README

Micro servicios

El micro servicio hereda de Worker o Fork dependiendo del elemento que se quiera crear, se tiene soporte para el broker NATS.

NOTA

Para la seleccion del brocker (kafka, Nats) se debe pasar la variable de ambiente que contenga la lista de los servidores del cluster del broker ejemplo: KAFKA=servidor,servidor2,servidor3 "o" NATS=servidor,servidor2,servidor3

NOTAS.

Las posibles acciones que tienen un micro servicio son:

  • List
  • Create
  • Get
  • Update
  • Delete

Esta son definidas utilizando decoradores tal como se muestra en el ejemplo.

Ejemplo:

import { ErrorMs, Microservice, MsManager } from '@coppel/microservices';

@MsManager.define({
    App: 'NombreApp',
    Name: 'NombreWorker',
    Version: 'v1',
    Broker: ['127.0.0.1:9092'],
    Debug: true
})
class MiWorker extends Microservice {

    /**
     * Metodo de smoketest
     */
    public smoketest(): boolean | Promise<boolean> {
        // Retornar la promesa
        return new Promise( ( rr: (r: boolean) => void, ff: (r: boolean) => void ) => {
            rr(true);
        });
    }

    /**
     *  Errores que puede tener el servicio.
     */
    @MsManager.Errors()
    public errores(): ErrorMs {
        return {
            '-12': 'Error definido por el usuario',
        };
    }

    // Para recuperar cierta informacion se utilizan los siguientes parametros, y colocas nada mas lo que requieras
    // @MsManager.ctx('data') data: any
    // @MsManager.ctx('uuid') id: any
    // @MsManager.ctx('authorization') auth: any
    // @MsManager.ctx('response') resp: any

    @MsManager.List()
    public metodoList(@MsManager.ctx('uuid') id: any, @MsManager.ctx('authorization') auth: any): any {
        // Listar
    }

    @MsManager.Create()
    public crear(@MsManager.ctx('data') data: any, @MsManager.ctx('authorization') auth: any): any {
        // Registrar
    }

    @MsManager.Get()
    public recuperar(@MsManager.ctx('uuid') id: any, @MsManager.ctx('authorization') auth: any): any {
        // Recuperar un elemento
    }

    @MsManager.Update()
    public actualizar(@MsManager.ctx('data') data: any, @MsManager.ctx('uuid') id: any, @MsManager.ctx('authorization') auth: any): any {
        // Actualizar un elemento
    }

    @MsManager.Delete(@MsManager.ctx('uuid') id: any, @MsManager.ctx('authorization') auth: any)
    public eliminar(data: any, auth: boolean, id: any): any {
        // Eliminar un elemento
    }

}

NOTAS:

Las clases son auto ejecutables, no se requiere que se implemente una inicializacio/start o similar para poner en marcha el servicio.

Para la indicacion de la cola de mensajes se utiliza la variable de ambiente KAFKA.

Diseño Legado.

Si lo que se quiere es crear un micro servicio basado en el diseño de la version v1.* se utiliza la definicion de *Listener*, como se indica en el siguiente ejemplo:

import { ErrorMs, Microservice, MsManager } from "@coppel/microservices";

@Ms.define({
    App: "NombreApp",
    Name: "NombreWorker",
    Version: "v1",
    Broker: ["127.0.0.1:9092"],
    Debug: true
})
class MiWorker extends Microservice {
    /**
     * Metodo de smoketest
     */
    public smoketest(): boolean | Promise<boolean> {
        // Retornar la promesa
        return new Promise((rr: (r: boolean) => void, ff: (r: boolean) => void) => {
            rr(true);
        });
    }

    /**
     *  Errores que puede tener el servicio.
     */
    @MsManager.Errors()
    public errores(): ErrorMs {
        return {
            "-12": "Error definido por el usuario"
        };
    }

    @MsManager.Listener()
    public metodoList(@MsManager.ctx("data") data: any, @MsManager.ctx("authorization") auth: any): any {
        // Escuchar todos los eventos
    }
}

Retorno de valores

Para retornar una respuesta simplemente se debe regresar el valor de la funcion:

  @MsManager.Get()
  public miFuncion(@MsManager.ctx('data') data: any, @MsManager.ctx('authorization') auth: any): object {
       // Retorno de un objeto
       return {
           Clave: 'Valor',
       };
   }

NOTAS:

En caso de que se requiera regresar un valor con una promesa:

  @MsManager.Get()
  public miFuncion(@MsManager.ctx('data') data: any, @MsManager.ctx('authorization') auth: any): Promise<object> {
      // Retornar la promesa
      return new Promise( (resolve: any, fail: any) => {
          resolve({ Clave: 'Valor' });
      });
  }

El core detecta la promesa, y espera que se resuelva para retornar la respuesta a la peticion inicial.

Errores

Para la notificacion de errores, se implementa la utilizada por el lenguaje, llamando a la propiedad heredada Errors, como muestra el ejemplo.

  @MsManager.Get()
  public miFuncion(@MsManager.ctx('data') data: any, @MsManager.ctx('authorization') auth: any): object {
       // Ejecutar el error.
       throw this.emitError('-34'); // definido antes.
   }

Esto ejecutara la excepcion que es escuchada, por el core, notificando a la peticion original.

NOTAS:

Cuando se utiliza una promesa se puede implementar el llamdo a la excepcion como el ejemplo anterior o de la siguiente manera.

  @MS.Get()
  public miFuncion(@MsManager.ctx('data') data: any, @MsManager.ctx('authorization') auth: any): Promise<object> {
      // Retornar la promesa
      return new Promise( (resolve: any, fail: any) => {
          fail(this.emitError('-34'));
      });
  }

Ambas opciones generar un error que es enviado por el core.

Bifurcaciones

import { Actions, ConfForks, ErrorMs, Microservice, MsManager } from "@coppel/microservices";

@MsManager.define({
    App: "NombreApp",
    Name: "NombreWorker",
    Version: "v1",
    Broker: ["127.0.0.1:9092"],
    Debug: true
})
class MiWorker extends Microservice {
    /**
     * Metodo de smoketest
     */
    public smoketest(): boolean | Promise<boolean> {
        // Retornar la promesa
        return new Promise((rr: (r: boolean) => void, ff: (r: boolean) => void) => {
            rr(true);
        });
    }

    /**
     *  Errores que puede tener el servicio.
     */
    @MsManager.Errors()
    public errores(): ErrorMs {
        return {
            "-12": "Error definido por el usuario"
        };
    }

    @MsManager.Fork()
    public configFork(): ConfForks {
        return {
            bif: {
                App: "appcoppel",
                Name: "prueba2",
                Version: "v1"
            },
            demo: {
                App: "appcoppel",
                Name: "simple",
                Version: "v1"
            }
        };
    }

    public initData(req: any, resp: any): any {
        return 10;
    }

    @MsManager.Listener([
        { action: Actions.DEFAULT, fork: "bif" },
        { action: Actions.CREATE, fork: "demo", fnc: "initData" } // Sin datos, se para data tal como llega
    ])
    public metodoList(@MsManager.ctx("request") data: any): any {
        return { todo: "ok1" };
    }
}