georgeboot/laravel-echo-api-gateway

使用Laravel Echo与API Gateway Websockets

0.5.0 2024-08-26 07:02 UTC

This package is auto-updated.

Last update: 2024-09-26 07:27:31 UTC


README

CI codecov

不再维护!!!

目前我没有时间维护这个包。

我的建议是使用Soketi无服务器:[https://renoki-25232877.hubspotpagebuilder.eu/soketi-serverless](https://renoki-25232877.hubspotpagebuilder.eu/soketi-serverless)

基本上免费使用,构建得很好。

这个包允许你将API Gateway的Websockets用作Laravel Echo的驱动,因此你不必使用像Pusher或Socket.io这样的服务。

它通过在API Gateway中设置一个WebSocket API,并在每次向WebSocket发送消息时调用一个Lambda函数来实现。此包包括并自动配置了一个处理程序来响应这些WebSocket消息。我们还配置Laravel使用此连接作为广播驱动程序。

尽管后者需要一些手动设置,但此包目前仅适用于BrefLaravel Vapor

一旦发布1.0版本,此包将适用于生产工作负载。在此之前,建议仅将此包用于非关键/非生产项目。

需求

为了使用此包,你的项目需要满足以下条件

  • PHP 7.4或8.x
  • Laravel 6、7或8
  • 使用brefLaravel Vapor部署到AWS
  • 有一个正常工作的队列
  • 使用Laravel Mix或任何其他工具打包你的资产

安装

安装此包相当简单。

首先,我们必须安装composer和npm包

composer require georgeboot/laravel-echo-api-gateway

yarn add laravel-echo-api-gateway
# or
npm install --save-dev laravel-echo-api-gateway

特定平台说明

A. 使用Bref

接下来,当使用Bref时,我们必须在我们的serverless.yml文件中添加一些元素。如果使用Vapor,则必须使用AWS CLI或控制台手动创建这些资源。

添加一个新函数来处理WebSocket事件(消息等)

functions:
    # Add this function
    websocket:
        handler: handlers/websocket.php
        layers:
            - ${bref:layer.php-80}
        events:
            - websocket: $disconnect
            - websocket: $default

添加一个资源来创建和配置我们的DynamoDB表,其中连接将被存储

resources:
    Resources:
        # Add this resource
        ConnectionsTable:
            Type: AWS::DynamoDB::Table
            Properties:
                TableName: connections
                AttributeDefinitions:
                    - AttributeName: connectionId
                      AttributeType: S
                    - AttributeName: channel
                      AttributeType: S
                KeySchema:
                    - AttributeName: connectionId
                      KeyType: HASH
                    - AttributeName: channel
                      KeyType: RANGE
                GlobalSecondaryIndexes:
                    - IndexName: lookup-by-channel
                      KeySchema:
                          - AttributeName: channel
                            KeyType: HASH
                      Projection:
                          ProjectionType: ALL
                    - IndexName: lookup-by-connection
                      KeySchema:
                          - AttributeName: connectionId
                            KeyType: HASH
                      Projection:
                          ProjectionType: ALL
                BillingMode: PAY_PER_REQUEST

添加以下iamRoleStatement以启用我们的Lambda函数访问表

provider:
    name: aws

    iamRoleStatements:
        # Add this iamRoleStatement
        - Effect: Allow
          Action: [ dynamodb:Query, dynamodb:GetItem, dynamodb:PutItem, dynamodb:UpdateItem, dynamodb:DeleteItem, dynamodb:BatchWriteItem ]
          Resource:
              - !GetAtt ConnectionsTable.Arn
              - !Join [ '', [ !GetAtt ConnectionsTable.Arn, '/index/*' ] ]

添加一个环境变量来自动生成我们的WebSocket URL

provider:
    name: aws

    environment:
        # Add these variables
        BROADCAST_DRIVER: laravel-echo-api-gateway
        LARAVEL_ECHO_API_GATEWAY_DYNAMODB_TABLE: !Ref ConnectionsTable
        LARAVEL_ECHO_API_GATEWAY_API_ID: !Ref WebsocketsApi
        LARAVEL_ECHO_API_GATEWAY_API_STAGE: "${self:provider.stage}"

接下来,在handlers/websocket.php中创建PHP处理程序文件

<?php

use Georgeboot\LaravelEchoApiGateway\Handler;
use Illuminate\Foundation\Application;

require __DIR__ . '/../vendor/autoload.php';

/** @var Application $app */
$app = require __DIR__ . '/../bootstrap/app.php';

$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$kernel->bootstrap();

return $app->make(Handler::class);

现在,通过运行serverless deploy或类似的命令来部署您的应用程序。记下输出给出的WebSocket URL。

B. 使用Vapor

当使用Vapor时,您必须使用AWS CLI或控制台手动创建这些必需的资源。

B1. 连接的DynamoDB表

为连接创建一个DynamoDB表。使用connectionId(字符串)作为HASH键,使用channel(字符串)作为SORT键。将容量设置设置为任何您喜欢的(可能是在需求模式下)。

创建2个索引

  1. 名称:lookup-by-connection,键:connectionId,无排序键,投影:所有
  2. 名称:lookup-by-channel,键:channel,无排序键,投影:所有
B2. API Gateway

创建一个新的Websocket API。输入名称,并保留路由选择表达式为默认值。添加 $disconnect$default。将两个集成都设置为 Lambda,并从列表中选择您的CLI lambda。设置阶段名称为您想要的名称,并创建API。创建后,记下ID,因为我们稍后需要它。

B3. IAM权限

在IAM中,转到角色并打开 laravel-vapor-role。打开内联策略并编辑它。在JSON选项卡上,将 "execute-api:*" 添加到操作列表中。

然后,登录到 Laravel Vapor,转到团队设置,AWS账户,点击正确账户旁边的角色并取消选择“接收更新”。

编辑您的 .env

BROADCAST_DRIVER=laravel-echo-api-gateway
LARAVEL_ECHO_API_GATEWAY_DYNAMODB_TABLE=the-table-name-you-entered-when-creating-it
LARAVEL_ECHO_API_GATEWAY_API_ID=your-websocket-api-id
LARAVEL_ECHO_API_GATEWAY_API_STAGE=your-api-stage-name

生成前端代码

添加到您的javascript文件

import Echo from 'laravel-echo';
import {broadcaster} from 'laravel-echo-api-gateway';

window.Echo = new Echo({
    broadcaster,
    // replace the placeholders
    host: 'wss://{api-ip}.execute-api.{region}.amazonaws.com/{stage}',
});

最后,您需要通过运行Laravel Mix来生成您的资源。完成此步骤后,您应该可以正常运行了。