aliasproject/laravel-echo-api-gateway

Laravel Echo 与 API Gateway Websockets

v0.5.0 2023-12-18 23:04 UTC

This package is auto-updated.

Last update: 2024-08-29 18:45:35 UTC


README

CI codecov

未维护!!!

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

我的建议是使用无服务器的 Soketi: 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 aliasproject/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 AliasProject\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,无排序键,投影:ALL
  2. 名称:lookup-by-channel,键:channel,无排序键,投影:所有
B2. API网关

创建一个新的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来生成你的资源。完成这一步后,你应该可以正常运行。