vmorozov/event-backbone-laravel

Laravel 包,方便使用 Event Backbone (Apache Kafka) 实现基于事件的微服务通信。

dev-master 2023-11-01 06:25 UTC

This package is auto-updated.

Last update: 2024-09-29 20:43:22 UTC


README

此包用于方便地使用 Event Backbone (目前仅支持 Apache Kafka) 实现基于事件的微服务通信。

安装

您可以通过 composer 安装此包

composer require vmorozov/event-backbone-laravel

您需要使用以下命令发布配置文件:

php artisan vendor:publish --tag="event-backbone-laravel-config"

使用方法

生产事件

要开始生产事件,您需要创建第一个实现 Vmorozov\EventBackboneLaravel\Producer\ExternalEvent 接口的事件。

<?php

namespace App\Events;

use App\Models\User;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
use Vmorozov\EventBackboneLaravel\Producer\ExternalEvent;

class UserCreated implements ExternalEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    private User $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function getTopic(): string
    {
        return 'users';
    }

    public function getName(): string
    {
        return 'user_created';
    }

    public function getKey(): string
    {
        return $this->user->getKey();
    }

    public function getPayload()
    {
        return $this->user->toJson();
    }

    public function getHeaders(): array
    {
        return [];
    }
}

然后,您需要触发之前步骤中创建的事件。

use App\Events\UserCreated;

// some code here
event(new UserCreated($user));

消费事件

要开始消费事件,您需要创建第一个实现 Vmorozov\EventBackboneLaravel\Consumer\ExternalConsumedEvent 接口的事件,并为其创建 Laravel 事件监听器。
以下是在 "生产事件" 部分中生产事件的示例。
创建事件

<?php

namespace App\Events;

use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
use Vmorozov\EventBackboneLaravel\Consumer\ExternalConsumedEvent;

class UserCreatedConsumedEvent implements ExternalConsumedEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    private array $payload;

    public function __construct(array $payload)
    {
        $this->payload = $payload;
    }

    public function getId()
    {
        return $this->payload['id'];
    }

    public function getName(): string
    {
        return $this->payload['name'];
    }

    public function getEmail(): string
    {
        return $this->payload['email'];
    }
}

创建监听器

<?php

namespace App\Listeners;

use App\Events\UserCreatedConsumedEvent;
use App\Models\User;
use Illuminate\Contracts\Queue\ShouldQueue;

class UserCreatedListener implements ShouldQueue
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  object  $event
     * @return void
     */
    public function handle(UserCreatedConsumedEvent $event): void
    {
        if (User::query()->find($event->getId())) {
            return;
        }

        User::unguard();
        User::query()->create([
            'id' => $event->getId(),
            'name' => $event->getName(),
            'email' => $event->getEmail(),
        ]);
    }
}

EventServiceProvider 中注册您的监听器

protected $listen = [
    \App\Events\UserCreatedConsumedEvent::class => [
        \App\Listeners\UserCreatedListener::class,
    ],
];

要开始消费事件,请运行以下 artisan 命令

php artisan event_backbone:consume

配置

上下文功能

事件可以包含额外的上下文,以便在接收到事件时切换应用状态。要启用此功能,您需要在您的应用程序中添加两个类:ContextProvider 和 Context applier,并在配置中注册它们。

  1. 创建应用类
<?php

namespace App\Utils\EventBackbone;

use Vmorozov\EventBackboneLaravel\Producer\Context\ProducedEventContextProvider;
use Vmorozov\LaravelFluentdLogger\Tracing\TraceStorage;

class ContextProvider implements ProducedEventContextProvider
{
    private TraceStorage $traceStorage;

    public function __construct(TraceStorage $traceStorage)
    {
        $this->traceStorage = $traceStorage;
    }

    public function getContext(): array
    {
        return [
            'trace_id' => $this->traceStorage->getTraceId(),
        ];
    }
}
  1. 创建上下文应用类
<?php

namespace App\Utils\EventBackbone;

use Vmorozov\EventBackboneLaravel\Consumer\Context\ConsumedEventContextApplier;
use Vmorozov\LaravelFluentdLogger\Tracing\TraceStorage;

class ContextApplier implements ConsumedEventContextApplier
{
    private TraceStorage $traceStorage;

    public function __construct(TraceStorage $traceStorage)
    {
        $this->traceStorage = $traceStorage;
    }

    public function apply(array $context): void
    {
        $this->traceStorage->setTraceId($context['trace_id']);
    }
}
  1. event-backbone-laravel.php 配置中注册创建的类
'context' => [
    'provider_class' => \App\Utils\EventBackbone\ContextProvider::class,
    'applier_class' => \App\Utils\EventBackbone\ContextApplier::class,
],

测试

composer test

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

贡献

有关详细信息,请参阅 CONTRIBUTING

安全漏洞

有关如何报告安全漏洞的详细信息,请参阅 我们的安全策略

致谢

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件