|
| 1 | +# Refactorización de monolitos a microservicios en PHP |
| 2 | +### Joel Cuevas Estrada - 22210298 |
| 3 | + |
| 4 | +Migrar un monolito en PHP hacia una arquitectura de microservicios es un proceso que requiere estrategia, ya que no se trata solo de dividir código, sino de transformar la manera en que tu sistema funciona, escala y se mantiene. Te hago un desglose en pasos, buenas prácticas y ejemplos aplicados a PHP: |
| 5 | + |
| 6 | +## 1. Evaluación del monolito |
| 7 | + |
| 8 | +Antes de separar, identifica: |
| 9 | + |
| 10 | +- Módulos lógicos claros: autenticación, facturación, catálogo, notificaciones, etc. |
| 11 | + |
| 12 | +- Dependencias internas: qué partes del código se llaman entre sí. |
| 13 | + |
| 14 | +- Cuellos de botella: consultas pesadas, controladores muy grandes, partes difíciles de testear. |
| 15 | + |
| 16 | +## 2. Definir límites (Bounded Contexts) |
| 17 | + |
| 18 | +Inspírate en Domain-Driven Design (DDD): |
| 19 | +- Cada microservicio debe cubrir un dominio específico. |
| 20 | + |
| 21 | +- Ejemplo en un e-commerce en PHP: |
| 22 | + User Service → registro/login, tokens JWT |
| 23 | + Catalog Service → productos, categorías |
| 24 | + Order Service → pedidos y pagos |
| 25 | + Notification Service → emails y SMS |
| 26 | + |
| 27 | +## 3. Preparar comunicación entre servicios |
| 28 | +En PHP puedes usar varios enfoques: |
| 29 | +- REST con Slim o Laravel Lumen → servicios ligeros. |
| 30 | +- gRPC (con extensiones PHP) → más rápido en sistemas complejos. |
| 31 | +- Mensajería asíncrona (RabbitMQ, Kafka) → para procesos como correos o logs. |
| 32 | + |
| 33 | +## 4. Refactor paso a paso |
| 34 | +- Extrae un servicio pequeño del monolito (ej. notificaciones). |
| 35 | +- Expón una API para ese servicio. |
| 36 | +- Haz que el monolito consuma esa API en lugar del código interno. |
| 37 | +- Itera con otros módulos hasta reducir el monolito a un núcleo mínimo. |
| 38 | + |
| 39 | +## 5. Manejo de datos |
| 40 | +- El monolito probablemente tenga una sola base de datos (MySQL, MariaDB, PostgreSQL). |
| 41 | +- En microservicios, cada servicio debería tener su propia base de datos o esquema. |
| 42 | +- Si no puedes separarlo aún, comienza con schemas separados dentro de la misma BD. |
| 43 | + |
| 44 | +## 6. Observabilidad y despliegue |
| 45 | +- Logs centralizados (Graylog, ELK, Monolog en PHP). |
| 46 | +- Health checks para cada microservicio. |
| 47 | +- Contenerización con Docker + Docker Compose para orquestar microservicios PHP. |
| 48 | +- Eventualmente, migrar a Kubernetes si el sistema crece. |
| 49 | + |
| 50 | +## 7. Herramientas útiles en PHP |
| 51 | +- Frameworks ligeros: Slim, Lumen, Symfony MicroKernel. |
| 52 | +- Autenticación: JWT con Firebase PHP JWT. |
| 53 | +- Mensajería: php-amqplib (RabbitMQ). |
| 54 | +- Service Discovery: Consul o Eureka (aunque en PHP suelen delegarse a Docker/K8s). |
| 55 | + |
| 56 | +## Ejemplo practica |
| 57 | + |
| 58 | +### Monolito (antes) |
| 59 | +Supongamos que tienes un monolito Laravel y separas el módulo de notificaciones: |
| 60 | +Monolito (antes) |
| 61 | +```` php |
| 62 | +// Dentro del monolito |
| 63 | +class OrderController { |
| 64 | + public function store(Request $request) { |
| 65 | + $order = Order::create($request->all()); |
| 66 | + Notification::send($order->user, new OrderCreated($order)); |
| 67 | + return response()->json($order); |
| 68 | + } |
| 69 | +} |
| 70 | +```` |
| 71 | +### Después de extraer a microservicio (Slim API) |
| 72 | +```` php |
| 73 | +// Notification Service (API independiente) |
| 74 | +$app->post('/send', function ($request, $response) { |
| 75 | + $data = $request->getParsedBody(); |
| 76 | + mail($data['email'], "Order Created", "Your order #{$data['order_id']} was created."); |
| 77 | + return $response->withJson(['status' => 'sent']); |
| 78 | +}); |
| 79 | +```` |
| 80 | +### Después de extraer a microservicio (Slim API) |
| 81 | +````php |
| 82 | + |
| 83 | +class OrderController { |
| 84 | + public function store(Request $request) { |
| 85 | + $order = Order::create($request->all()); |
| 86 | + Http::post('http://notification-service/send', [ |
| 87 | + 'email' => $order->user->email, |
| 88 | + 'order_id' => $order->id |
| 89 | + ]); |
| 90 | + return response()->json($order); |
| 91 | + } |
| 92 | +} |
| 93 | +```` |
| 94 | +## Bibliografia |
| 95 | + |
| 96 | +Fowler, M. (2015). Microservices: a definition of this new architectural term. MartinFowler.com. https://martinfowler.com/articles/microservices.html |
| 97 | + |
| 98 | +Balalaie, A., Heydarnoori, A., & Jamshidi, P. (2016). Microservices architecture enables DevOps: Migration to a cloud-native architecture. IEEE Software, 33(3), 42–52. https://doi.org/10.1109/MS.2016.64 |
| 99 | + |
| 100 | +Vogel, A. (2019). Migrating from Monolith to Microservices. InfoQ. https://www.infoq.com/articles/migrating-monolith-microservices/ |
| 101 | + |
| 102 | +PHP-FIG. (2020). PHP Standards Recommendations (PSR). PHP Framework Interop Group. https://www.php-fig.org/psr/ |
0 commit comments