zipzoft / laravel-message-transporter
消息传输器
0.2.2
2021-09-10 08:41 UTC
Requires
- php: ^7.4|^8.0
- illuminate/support: ^7.0|^8.0
Requires (Dev)
- orchestra/testbench: ~3.8.0|^4.0|^5.0|^6.0
- phpunit/phpunit: ^8.0|^9.0
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; } }