Introdução: Por que PHP e microsserviços?
Por muito tempo, o PHP foi associado exclusivamente a aplicações monolíticas — WordPress, Laravel ou Symfony. No entanto, o PHP moderno (a partir da versão 7.4 e especialmente 8.x) se transformou em uma ferramenta poderosa para a construção de arquiteturas de microsserviços. Graças ao desempenho aprimorado, tipagem estrita, capacidades assíncronas (via ReactPHP ou Swoole) e um ecossistema maduro, o PHP se tornou uma linguagem completa para microsserviços.
Neste artigo, vamos abordar: o que são microsserviços em PHP, como projetar a arquitetura, quais tecnologias usar e escrever exemplos reais de código.
O que é arquitetura de microsserviços?
Microsserviços são uma abordagem na qual uma aplicação é dividida em serviços pequenos e implantados de forma independente. Cada serviço é responsável por sua própria função de negócio e se comunica com os outros através da rede (HTTP/REST, gRPC, filas de mensagens).
Princípios-chave dos microsserviços em PHP
- Independência — cada serviço pode ser escrito em PHP, Node.js ou Go, mas usamos PHP para todos.
- Descentralização de dados — cada banco de dados pertence a apenas um serviço.
- Orquestração vs Coreografia — escolha entre gerenciamento centralizado (Kubernetes) e uma abordagem orientada a eventos.
- Tolerância a falhas — um serviço que falha não deve quebrar todo o sistema.
Arquitetura de microsserviços em PHP: da teoria à prática
Vamos considerar um projeto típico: uma loja online. Vamos dividi-lo em microsserviços:
- User Service — registro, autenticação, perfis.
- Product Service — catálogo de produtos, preços, estoque.
- Order Service — criação de pedidos, status.
- Payment Service — processamento de pagamentos.
- Notification Service — notificações por email/SMS.
Passo 1: Projetando o API Gateway
API Gateway — ponto de entrada único. Em PHP, pode ser implementado com Slim Framework ou usando Nginx + PHP-FPM. Exemplo de um gateway simples no Slim 4:
<?php// api-gateway/public/index.phpuse Slim\\Factory\\AppFactory;use Psr\\Http\\Message\\ServerRequestInterface as Request;use Psr\\Http\\Message\\ResponseInterface as Response;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
// Roteamento para microsserviços$app->post('/api/orders', function (Request $request, Response $response) { // Redireciona a requisição para o Order Service $client = new GuzzleHttp\\Client(['base_uri' => 'http://order-service:8080']); $res = $client->post('/orders', [ 'json' => $request->getParsedBody() ]); $response->getBody()->write($res->getBody()); return $response->withStatus($res->getStatusCode());});
$app->run();Passo 2: Interação síncrona (REST)
A maneira mais simples — requisições HTTP entre serviços. Usamos Guzzle ou Symfony HttpClient. Exemplo do Product Service:
<?php// product-service/src/Controller/ProductController.phpnamespace App\\Controller;
use Symfony\\Component\\HttpFoundation\\JsonResponse;use Symfony\\Component\\HttpFoundation\\Request;
class ProductController{ public function getProduct(int $id): JsonResponse { // Lógica para obter o produto do banco de dados $product = $this->productRepository->find($id); if (!$product) { return new JsonResponse(['error' => 'Product not found'], 404); } return new JsonResponse([ 'id' => $product->getId(), 'name' => $product->getName(), 'price' => $product->getPrice() ]); }}