El proyecto que vamos a realizar consiste en una aplicación principal que se encarga de la gestión de empresas y clientes, y una aplicación que gestiona los pedidos de los clientes de una empresa, nos servirá como tutorial para el desarrollo de aplicaciones de microservicios con Laravel y RabbitMQ.

Para ello la aplicación principal que llamaremos ADMIN-APP se encargará de transmitir los clientes nuevos y sus actualizaciones a la aplicación de pedidos que llamaremos ORDERS-APP. La aplicación de gestión de pedidos transmitirá a ADMIN-APP los gastos de cada cliente por los pedidos.

Índice

EL proyecto lo realizaremos en una 8 publicaciones apróximadamente, de las cuales la primera es la explicación del proyecto y partir de ahí ya empezaremos con el desarrollo real:

  1. Explicación del proyecto: Creación de una aplicación de microservicios con Laravel y RabbitMQ
  2. Creación del proyecto backend ADMIN-APP con Docker Compose : Laravel, Nginx y MySQL (23/01/2022)
    1. Creación del proyecto Laravel
    2. Contenedor Docker con la definición del Dockerfile para la máquina principal con PHP
    3. Creación del fichero de configuración para el servidor web con Nginx
    4. Configuración con docker-compose de Laravel / Servidor Web / MySQL
  3. Desarrollamos la API REST de ADMIN-APP para empresas y clientes
    1. CRUD controller y API controller para las empresas (cm_enterprise) (30/01/2022)
      1. Definimos la migración para la tabla de empresas
      2. Definimos el modelo para la tabla de empresas
      3. Definimos el recurso para empresas
      4. Definimos la ruta para la API
      5. Definimos el controlador CRUD para API
        1. Creación de registros: store(Request $request)
        2. Listado de empresas: index()
        3. Mostramos el registro seleccionado por id: show($id)
        4. Creación de registros: update(Request $request, $id)
        5. Eliminar registro: destroy($id)
    2. CRUD controller y API controller para los clientes (cm_customer) (07/02/2022)
      1. Definimos la migración para la tabla de clientes
      2. Creamos el modelo para la tabla de clientes
      3. Detallamos el recurso para clientes
      4. Añadimos la ruta para la API
      5. Definimos el controlador CRUD para la Api Rest
        1. Creación de registros: store(Request $request)
        2. Listado de clientes: index()
        3. Consulta de cliente: show($id)
        4. Actualización de cliente: update($id)
        5. Eliminamos el cliente: delete($id)
  4. Creación del proyecto order app con docker frontend pedidos (12/02/2022)
    1. Creación del proyecto Laravel
    2. Contenedor Docker con la definición del Dockerfile para la máquina principal con PHP
    3. Creación del fichero de configuración para el servidor web con Nginx
    4. Configuración con docker-compose de Laravel / Servidor Web / MySQL
  5. Creación de la aplicación ORDERS APP: MVC WEB de los pedidos
    1. ORDER APP – CLIENTES: CRUD de clientes modelo y controlador (cm_customer) (20/03/2022)
    2. ORDER APP – PEDIDOS: CRUD de pedidos modelo y controlador (cm_order) (27/03/2022)
  6. RabbitMQ admin y order app , actualización de clientes (10/04/2022)
  7. RabbitMQ Automatización y colas diferenciadas (20/04/2022)
  8. RabbitMQ actualizamos el saldo de clientes en ADMIN-APP desde ORDER-APP (30/04/2022)
  9. EXTRA: Laravel Api Rest documentación de API con Swagger para ADMIN-APP (11/02/2022)
  • Nota: durante las publicaciones este índice podrá sufrir alguna modificación para adaptar el contenido.

Software que utilizaremos

En este listado incluimos todo el software utilizado en todo el proyecto, no solo en esta publicación:

  • Linux (Ubuntu 20.04 LTS): sistema operativo Linux con la versión de Ubuntu 20.04 LTS
  • Docker (docker): Docker version 20.10.7, esta guía se ha generado utilizando esta versión de Docker.
  • Docker compose (docker-compose): docker-compose version 1.25.0, , esta guía se ha generado utilizando esta versión
  • Laravel 8: framewok PHP de desarrollo de aplicaciones web, en este caso utilizaremos la versión 8.
  • Mysql 5.7: versión utilizada en la imagen de docker-compose para la base de datos.
  • Nginx: servidor web de aplicaciones
  • PHP 7.4: utilizamos PHP en una versión superior a 7.4 siguiendo las recomendaciones de Laravel, por eso la imagen que utilicemos será de esta versión.
  • Composer 2: gestor de paquetes a partir de archivos json utilizado por Laravel, utilizamos Composer 2 porque lo necesitamos para Laravel 8, en esta publicación indicamos como actualizarlo.
  • Artisan: programa de línea de comandos de Laravel que nos ayuda en la creación de elementos como modelos, controladores, …, y también, nos proporciona otras utilidades como gestión de las migraciones o el listado de las rutas
  • RabbitMQ / CloudAMQP: en este proyecto utlizaremos CloudAMQP (provides managed RabbitMQ servers in the cloud), que nos proporciona un servidor para RabbitMQ en la nube, y así nos facilita el desarrollo en la nube. Otra opción sería instalar una máquina Docker con RabbitMQ pero eso complicaría el objetivo de este tutorial

1. Explicación del proyecto: una aplicación de microservicios con Laravel y RabbitMQ

Cómo deciíamos en la presentación es un proyectos sencillo con un sistema de empresas con clientes y pedidos, esto nos va a permitir separar la parte de pedidos de la gestión de clientes y empresas.

Este proyecto lo llamamos Learning Project Mini , puedes obtener más información sobre el mismo y la estructura de la base de datos en Learning Project Mini: un proyecto multiples desarrollos.

En este tutorial veremos la versión para proyectos con microservicios donde definiremos con detalle dos aplicaciones:

  • (1) Aplicación ADMIN (ADMIN-APP): se desarrollará una API REST para la admnistración de empresas y clientes, desarrollaremos los CRUD de las dos entidades.
  • (2) Aplicación PEDIDOS (ORDERS-APP): La segunda encargada de la gestión de pedidos, está segunda almacenará toda la información de los pedidos y enviará a la aplicación de administración los gastos de cada uno para que cada cliente tenga su balance de gastos.

Para ello necesitaremos usar microservicios con un sistema de colas para la comunicación entre las dos aplicaciones independientes, la aplicación ADMIN matendrá actualizados los clientes en la aplicación de PEDIDOS, la aplicación PEDIDOS actualizará el saldo de los clientes cada vez que se produzca un pedido de venta o devolución, esto nos permitirá ver colas bidireccionales de gestión con Laravel y RabbitMQ.

El proyecto lo podemos ver reflejado en el siguiente esquema sencillo para entender el desarrollo que llevaremos a cabo.

Creación de una aplicación de MICROSERVICIOS con LARAVEL y RABBITMQ
Creación de una aplicación de MICROSERVICIOS con LARAVEL y RABBITMQ

LEARNING PROJECT MINI

Un proyecto sencillo para el aprendizaje software, lo desarrollaremos tanto en una aplicación molítica como una aplicacíon orientada a microservicios: Learning Project Mini: un proyecto multiples desarrollos.

Código xules

El proyecto: tablas utilizadas

Si estuvieramos diseñando una aplicación que se encargará de toda la gestión es, decir, un monolito, partiríamos de la siguiente estructura de base de datos, que mostramos para que nos sirva de base y referencia:

Learning Project Mini - Diagrama ER
Learning Project Mini – Diagrama ER

El detalle de las tablas es el siguiente:

Learning Project
TABLADESCRIPCIÓNCARACTERÍSTICAS DE DISEÑO
cm_enterpriseEmpresas de la aplicación, cada empresa tendrá sus clientes.Las empresas tendrán definido sus datos en la misma tabal: idioma, país y moneda, por simplificación; varios clientes podrán pertenecer a la misma empresa.
cm_customerTabla general de cliente, donde se almacenarán los clientes de las diferentes empresas, un cliente asignado a una única empresa.Los datos del cliente los almacenamos directamente en la misma tabla: idioma, país, direcciones, empresas, métodos de pago y moneda.
cm_ordersPedidos por cliente un cliente puede tener múltiples pedidosEn pedidos recogemos los datos del producto por descripción, las unidades el precio total y la dirección, simplificado al máximo

Ya puedes seguir avanzando en el tutorial con el apartado número 2 donde aprendemos a utilizar docker para nuestros proyectos Laravel: