zipzoft/laravel-message-transporter

0.2.2 2021-09-10 08:41 UTC

This package is auto-updated.

Last update: 2024-09-10 15:25:20 UTC


README

作为广播信息到各个服务(微服务架构)的工具

所需条件

{
  "php": "^7.4|^8.0"
}

安装

composer require zipzoft/laravel-message-transporter

配置

通常情况下 env 的默认值如下

SERVICE_BROADCASTER_DRIVER=none

驱动

目前仅支持 redis

SERVICE_BROADCASTER_DRIVER=redis 

配置

这是默认值

// /config/message-transporter.php

return [
    'default' => env('SERVICE_BROADCASTER_DRIVER', 'none'),
    'connection_prefix' => 'app-services_',
    'queue' => true,
]

或者您可以通过以下命令自行修改

配置文件位于 /config/message-transporter.php

php artisan vendor:publish --class="Zipzoft\MessageTransporter\MessageTransporterServiceProvider" --tag="config"

开始使用

生产者部分

生产者的配置示例

// /config/database.php

return [
    // ...
    
    'redis' => [
        // ....
        
        'app-services_producer' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', '6379'),
            'database' => 2,
            'options' => [
                'prefix' => env('SERVICE_BROADCASTER_PREFIX'),
            ]
        ]
    ]
];

将实现放入您的 Event 中

关于使用方式,您可以参考 Laravel 文档

<?php

namespace App\Events;

use App\User;
use Zipzoft\MessageTransporter\ShouldBroadcastAppServices;
use Zipzoft\MessageTransporter\ShouldBroadcastAppServicesNow;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\PrivateChannel;

class UserCreated implements ShouldBroadcastAppServices
{
    // ....
    
    public $user;
    
    public function __construct(User $user)
    {
        $this->user = $user;
    }
    
    public function broadcastOn()
    {
        return [
            new Channel("app"),
            new PrivateChannel("call-center"),
        ];
    }
    
    
    // Supported method
    // broadcastWith, broadcastWhen, broadcastAs
}

通常情况下会通过 Queue 来发送

如果您不想使用 Queue 来发送,可以使用 ShouldBroadcastAppServicesNow 代替

use Zipzoft\MessageTransporter\ShouldBroadcastAppServicesNow;

发送的格式为 JSON

{
  "event" : "App\\Events\\UserCreated",
  "data" : {
    "user" : {
      "id" : "....",
      "name" : "..."
    }
  },
  "sent" : "2021-09-10T15:13:12+07:00"
}

Channel 名称主要从 broadcastOn 方法中读取,因此在此处名称将按照以下示例

app
private-call-center

当将您在 env('SERVICE_BROADCASTER_PREFIX') 中设置的 prefix 结合起来时,例如 (假设 SERVICE_BROADCASTER_PREFIX = 'myweb::')

myweb::app
myweb::private-call-center

消费者部分

消费者的配置示例

// /config/database.php

return [
    // ...
    
    'redis' => [
        // ....
        
        'app-services_consumer' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', '6379'),
            'database' => 2,
            'options' => [
                'prefix' => '',
            ]
        ]
    ]
];

当您作为持久接收者时,您必须先创建 Artisan Command,例如在以下示例中

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Zipzoft\MessageTransporter\Broadcasters\ServiceBroadcaster;
use Zipzoft\MessageTransporter\Event\OnMessage;

class SubscribeAppServicesCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'service:subscribe';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Subscribe other services';

    /**
     * @var ServiceBroadcaster 
     */
    private ServiceBroadcaster $broadcaster;

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct(ServiceBroadcaster $broadcaster)
    {
        parent::__construct();
        
        $this->broadcaster = $broadcaster;
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $this->broadcaster->subscribe(['myweb*'], function (OnMessage $event) {
            // $event->event (string|null)
            // $event->data (array|string|null)
            // $event->channel (string)
        });

        return 0;
    }
}