Hello, laravel web developers! In this article, we'll see how to create microservices with laravel 11. In laravel 11, Microservices allow developers to break down a large monolithic application into smaller, loosely coupled services.
Each service is responsible for a specific function within the system and can be scaled independently. Laravel 11 provides a strong foundation for building microservices by utilizing its existing features like queues, event broadcasting, HTTP clients, and service discovery.
Microservices architecture enables you to divide your application into smaller, independently deployable services. This provides better scalability, fault isolation, and faster development. Let's walk through building a basic microservice architecture using Laravel 11, including communication methods and challenges management.
Laravel 11 Microservices: Best Practices for Scaling Applications
Start by setting up your main application and a microservice, both running independently with their own databases. Install Laravel for both:
composer create-project --prefer-dist laravel/laravel main-app
composer create-project --prefer-dist laravel/laravel user-service
In Laravel, services often communicate over HTTP via REST APIs. Use Laravel HTTP Client
for making requests between services.
Example: Calling User Service from Main App
In the main app, define a controller that sends a request to the user-service
API.
MainApp/Http/Controllers/UserController.php
use Illuminate\Support\Facades\Http;
class UserController extends Controller
{
public function getUser($id)
{
$response = Http::get('http://user-service.local/api/users/' . $id);
if ($response->successful()) {
return $response->json();
}
return response()->json(['error' => 'User not found'], 404);
}
}
In user-service
, create the corresponding route and controller:
UserService/routes/api.php
Route::get('users/{id}', [UserController::class, 'show']);
UserService/app/Http/Controllers/UserController.php
class UserController extends Controller
{
public function show($id)
{
$user = User::find($id);
if ($user) {
return response()->json($user);
}
return response()->json(['error' => 'User not found'], 404);
}
}
For high-performance, low-latency communication, gRPC is an excellent alternative to HTTP. You can integrate gRPC with Laravel by using the grpc/grpc
package. Start by installing the gRPC package.
composer require spiral/roadrunner laravel/octane
composer require grpc/grpc
Then, define the .proto
file, which outlines the gRPC service and message structures.
proto/user.proto
syntax = "proto3";
service UserService {
rpc GetUser (UserRequest) returns (UserResponse);
}
message UserRequest {
int32 id = 1;
}
message UserResponse {
int32 id = 1;
string name = 2;
}
Compile the .proto
file to generate the PHP gRPC classes, and create a gRPC server in the user-service.
UserService/app/Grpc/UserService.php
use Grpc\BaseStub;
class UserService extends BaseStub
{
public function getUser($request)
{
$id = $request->getId();
$user = User::find($id);
if ($user) {
$response = new UserResponse();
$response->setId($user->id);
$response->setName($user->name);
return $response;
}
throw new NotFoundException("User not found");
}
}
For asynchronous communication, message queues like RabbitMQ are widely used. To integrate RabbitMQ with Laravel, use the php-amqplib/rabbitmq-bundle
package.
composer require php-amqplib/rabbitmq-bundle
Publish Message to RabbitMQ:
MainApp/Http/Controllers/UserController.php
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
class UserController extends Controller
{
public function notifyUser($id)
{
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('user_notifications', false, false, false, false);
$messageBody = json_encode(['user_id' => $id, 'message' => 'Notification sent']);
$msg = new AMQPMessage($messageBody);
$channel->basic_publish($msg, '', 'user_notifications');
$channel->close();
$connection->close();
}
}
Consume Message in User Service:
UserService/Console/Commands/ConsumeUserNotifications.php
use PhpAmqpLib\Connection\AMQPStreamConnection;
class ConsumeUserNotifications extends Command
{
protected $signature = 'consume:user-notifications';
public function handle()
{
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('user_notifications', false, false, false, false);
$callback = function ($msg) {
$data = json_decode($msg->body, true);
// Handle the notification logic
echo 'Received ', $data['message'], "\n";
};
$channel->basic_consume('user_notifications', '', false, true, false, false, $callback);
while ($channel->is_consuming()) {
$channel->wait();
}
$channel->close();
$connection->close();
}
}
You might also like: