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:
- Explicación del proyecto: Creación de una aplicación de microservicios con Laravel y RabbitMQ
- Creación del proyecto backend ADMIN-APP con Docker Compose : Laravel, Nginx y MySQL (23/01/2022)
- Desarrollamos la API REST de ADMIN-APP para empresas y clientes
- CRUD controller y API controller para las empresas (cm_enterprise) (30/01/2022)
- CRUD controller y API controller para los clientes (cm_customer) (07/02/2022)
- Creación del proyecto order app con docker frontend pedidos (12/02/2022)
- Creación de la aplicación ORDERS APP: MVC WEB de los pedidos
- ORDER APP – CLIENTES: CRUD de clientes modelo y controlador (cm_customer) (20/03/2022)
- ORDER APP – PEDIDOS: CRUD de pedidos modelo y controlador (cm_order) (27/03/2022)
- RabbitMQ admin y order app , actualización de clientes (10/04/2022)
- RabbitMQ Automatización y colas diferenciadas (20/04/2022)
- RabbitMQ actualizamos el saldo de clientes en ADMIN-APP desde ORDER-APP (30/04/2022)
- 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.
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:
El detalle de las tablas es el siguiente:
Learning Project | ||
TABLA | DESCRIPCIÓN | CARACTERÍSTICAS DE DISEÑO |
cm_enterprise | Empresas 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_customer | Tabla 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_orders | Pedidos por cliente un cliente puede tener múltiples pedidos | En 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: