Microsserviços em PHP: arquitetura e prática
No desenvolvimento web moderno, a arquitetura monolítica está cada vez mais dando lugar à arquitetura de microsserviços. O PHP, tradicionalmente associado a monolitos (WordPress, Laravel monolítico), é excelente para construir sistemas distribuídos. Neste artigo, vamos abordar os princípios-chave da arquitetura de microsserviços em PHP, explorar exemplos práticos de código e ferramentas que ajudarão você a migrar de um monolito para um sistema flexível.
O que são microsserviços e por que são necessários no PHP
A arquitetura de microsserviços é uma abordagem onde a aplicação é dividida em vários serviços independentes. Cada serviço é responsável por sua própria lógica de negócios (autenticação, pagamentos, notificações) e pode ser desenvolvido, implantado e escalado separadamente.
Por que o PHP é adequado para microsserviços:
- Início rápido — Frameworks PHP (Laravel, Symfony, Lumen) permitem criar um serviço em minutos.
- Grande comunidade — Milhares de pacotes prontos para trabalhar com filas, APIs e bancos de dados.
- Flexibilidade — É possível combinar PHP com outras linguagens (Go, Python) no mesmo sistema.
No entanto, lembre-se: microsserviços adicionam complexidade. Não vale a pena fragmentar o projeto se você tem uma aplicação pequena. Comece com um monolito e depois extraia serviços conforme o crescimento.
Arquitetura de um microsserviço típico em PHP
Vamos considerar a estrutura básica de um serviço. Suponha que temos um serviço UserService, responsável pelo registro e autenticação de usuários.
Estrutura do projeto:
user-service/├── api/│ └── index.php # ponto de entrada (REST API)├── src/│ ├── Controllers/│ │ └── AuthController.php│ ├── Models/│ │ └── User.php│ ├── Services/│ │ └── AuthService.php│ └── Database/│ └── migrations/├── config/│ └── database.php├── composer.json├── Dockerfile└── .envCada serviço:
- Possui seu próprio repositório e banco de dados (geralmente PostgreSQL ou MySQL).
- Comunica-se com o mundo externo via REST API ou gRPC.
- É empacotado em um container Docker.
Exemplo de um controlador REST simples no Lumen (micro-framework Laravel):
<?php
namespace App\\Http\\Controllers;
use Illuminate\\Http\\Request;use App\\Models\\User;
class AuthController extends Controller{ public function register(Request $request) { // Validação $this->validate($request, [ 'email' => 'required|email|unique:users', 'password' => 'required|min:8' ]);
// Criação do usuário $user = User::create([ 'email' => $request->input('email'), 'password' => app('hash')->make($request->input('password')) ]);
return response()->json(['user_id' => $user->id], 201); }}Troca de dados entre serviços: síncrona e assíncrona
Microsserviços não podem existir isoladamente. Existem duas formas principais de comunicação:
1. Síncrona (HTTP/REST)
O Serviço A chama diretamente a API do Serviço B. Simples, mas cria um acoplamento forte.
<?php// No serviço OrderService$httpClient = new \\GuzzleHttp\\Client();$response = $httpClient->post('http://user-service/api/validate', [ 'json' => ['token' => $token]]);
if ($response->getStatusCode() === 200) { // Usuário é válido}2. Assíncrona (filas / RabbitMQ)
O serviço envia uma mensagem para um broker (RabbitMQ, Kafka), e outro serviço a processa em segundo plano. Isso reduz a carga e torna o sistema mais tolerante a falhas.
Exemplo de envio de evento via RabbitMQ com a biblioteca php-amqplib:
<?phprequire_once __DIR__ . '/ve