// app/Listeners/ReduceStockListener.php class ReduceStockListener
$user = User::where('email', $request->email)->first(); $token = JWTAuth::fromUser($user);
$this->orderData = $orderData;
return new RabbitMQChannel('order.events'); Laravel Microservices- Breaking a Monolith to M...
composer require vladimir-yuldashev/laravel-queue-rabbitmq // app/Events/OrderPlaced.php class OrderPlaced implements ShouldBroadcast
if ($response->failed()) throw new \Exception('Catalog service unavailable');
public function __construct($orderData)
try $user = JWTAuth::parseToken()->authenticate(); catch (Exception $e) return response()->json(['error' => 'Unauthorized'], 401); // Inject the user ID from token into the request $request->merge(['authenticated_user_id' => $user->id]);
Synchronous HTTP calls create temporal coupling . If Catalog service is down, Orders fail. Use Circuit Breaker pattern (e.g., Laravel Circuit Breaker cache driver). Step 4: Asynchronous Events (Using RabbitMQ) To avoid tight coupling, use events. When an order is placed, OrderService emits OrderPlaced event. CatalogService listens and reduces stock.
public function broadcastOn()
$catalogUrl = config('services.catalog.url') . "/api/products/$productId";
// app/Http/Middleware/JwtMiddleware.php public function handle($request, Closure $next)
This article is written as an educational resource, covering the why , how , and implementation using Laravel and Docker. Introduction Most Laravel applications start as a beautiful, well-organized monolith. You use Eloquent, MVC, Service Providers, and everything feels fast and cohesive. But as your startup grows into an enterprise, the "Single Laravel Monolith" begins to crack. // app/Listeners/ReduceStockListener
Route::post('/auth/login', fn() => proxyTo('http://auth-service/api/login')); Route::get('/products', fn() => proxyTo('http://catalog-service/api/products')); Route::post('/orders', fn() => proxyTo('http://order-service/api/orders')); function proxyTo($url) $response = Http::withHeaders(request()->headers->all()) ->send(request()->method(), $url, [ 'query' => request()->query(), 'json' => request()->json()->all() ]);