butschster / LumenMicroservice by butschster

This Package will help you to use Lumen framework as a microservice with AMQP and JMS Serializer without extra knowledge.
764
6
2
Package Data
Maintainer Username: butschster
Maintainer Contact: butschster@gmail.com (Pavel Buchnev)
Package Create Date: 2020-10-18
Package Last Update: 2021-01-21
Home Page:
Language: PHP
License: MIT
Last Refreshed: 2024-04-19 15:16:46
Package Statistics
Total Downloads: 764
Monthly Downloads: 3
Daily Downloads: 0
Total Stars: 6
Total Watchers: 2
Total Forks: 2
Total Open Issues: 0

Lumen Microservice

Build Status Latest Stable Version Total Downloads License heading

This Package helps you to use Lumen framework as a microservice through AMQP without extra knowledge. Just install package, create Exchange Point class and start exchanging information between services through RabbitMQ.

For serialization this package uses JMS\Serializer.

P.S. You can use this service for testing https://www.cloudamqp.com. They have free plan.

Requirements

  • Lumen 7.x to 8.x
  • PHP 7.4 and above

Installation and Configuration

From the command line run

composer require butschster/lumen-microservice

Register Service provider

$app->register(Butschster\Exchanger\Providers\ExchangeServiceProvider::class);

Copy configs from package config directory to your Lumen app and register them.

$app->configure('amqp');
$app->configure('microservice');

Add variables to your .env file

MICROSERVICE_NAME=...
MICROSERVICE_VERSION=1.0.0
RABBITMQ_HOST=...
RABBITMQ_USERNAME=...
RABBITMQ_PASSWORD=...
RABBITMQ_VHOST=...

Create exchange point in your app

This point will use for receiving request from other services and for sending responses.

namespace App\Exchange\Point;

use Butschster\Exchanger\Contracts\Exchange\Point as PointContract;

class Point implements PointContract
{
    public function getName(): string
    {
        return 'com.test';
    }

    /**
     * // subject: com.test.action.test
     * @subject action.test
     */
    public function testSubject(IncomingRequest $request, LoggerInterface $logger)
    {
        $logger->info(
            sprintf('info [%s]:', $request->getSubject()),
            [$payload]
        );

        // Response
        $payload = new ...;
        $request->sendResponse($payload);
    }

    /**
     * // subject: com.test.action.test1
     * @subject action.test1
     */
    public function anotherTestSubject(IncomingRequest $request, LoggerInterface $logger)
    {
        $payload = new ...;
        $request->sendResponse($payload);
    }
}

Then register this point

use App\Exchange\Point;
use Illuminate\Support\ServiceProvider;
use Butschster\Exchanger\Contracts\Exchange\Point as PointContract;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton(PointContract::class, Point::class);
    }
}

Register console command

use Butschster\Exchanger\Console\Commands\RunMicroservice;

class Kernel extends ConsoleKernel
{
    protected $commands = [
        RunMicroservice::class
    ];
}

Runnig microservice

This single command will run your microservice and start listening to commands registered in your exchange point.

php artisan service:run

Supervisor is a process monitor for the Linux operating system, and will automatically restart your horizon process if it fails. To install Supervisor on Ubuntu, you may use the following command:

sudo apt-get install supervisor

Supervisor configuration files are typically stored in the /etc/supervisor/conf.d directory. Within this directory, you may create any number of configuration files that instruct supervisor how your processes should be monitored. For example, let's create a microservice.conf file that starts and monitors a process:

[program:microservice]
process_name=%(program_name)s
command=php /var/www/app.com/artisan service:run
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/www/app.com/storage/logs/microservice.log
stopwaitsecs=3600

Once the configuration file has been created, you may update the Supervisor configuration and start the processes using the following commands:

sudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start microservice

Sending requests

For requesting information from another service you should use ExchangeManager

use Butschster\Exchanger\Contracts\ExchangeManager;

class UserController {

    public function getUser(ExchangeManager $manager, int $userId)
    {
        $request = new GetUserByIdPayload();
        $request->userId = $userId;

        $user = $manager->request('com.test.action.test', $request);
        ...
    }

}

Broadcasting

If you want to send event to all services you should use ExchangeManager

use Illuminate\Http\Request;
use Butschster\Exchanger\Contracts\ExchangeManager;

class UserController {

    public function update(ExchangeManager $manager, Request $request, User $user)
    {
        $payload = new UserPayload();
        $data = $request->validate(...);
        $user->update($data);

        $payload->id = $user->id;
        $payload->username = $user->username;
        ...
        
        $manager->broadcast('com.user.event.updated', $payload);
    }

}