vanardpay/laravel-grpc

GRPC Laravel 包

0.1.1 2022-09-20 05:22 UTC

This package is auto-updated.

Last update: 2024-09-20 09:41:56 UTC


README

本包用于在 Laravel 中实现服务器端和客户端的 gRPC,以实现微服务结构。

请按照以下步骤设置所需的部分,页面底部还提供了示例,以帮助您更好地理解

安装

composer require vandarpay/laravel-grpc

发布必要文件

php artisan vendor:publish --provider=" vandarpay\LaravelGrpc\LaravelGrpcServiceProvider"

需求

  • PHP 8.1
  • 安装 protobuf-ext .
  • 安装 grpc-ext .

服务器端

本包使用 RoadRunner 管理进程并实现 gRPC 服务器,RoadRunner 是一个由 Golang 编写的性能高效的 PHP 应用程序服务器、负载均衡器和进程管理器。

安装 RoadRunner 二进制文件

您也可以使用 composer 包中提供的命令自动安装 RoadRunner,运行

./vendor/bin/rr get-binary

服务器二进制文件将在您项目的根目录下可用。

PHP 的扩展 php-curl 和 php-zip 是自动下载 RoadRunner 所必需的。运行 roadrunner 需要 PHP 的扩展 php-sockets。使用 php --modules 检查您的已安装扩展。

环境

请将以下环境变量添加到 .env 文件中

#Available value : panic, error, warn, info, debug. Default: debug
ROAD_RUNNER_LOG_LEVEL=debug
GRPC_XDEBUG=0 # 1,0
GRPC_SERVER=tcp://127.0.0.1:6001
GRPC_WORKER_MAX_JOBS=0
GRPC_WORKER_NUM_WORKERS=2
  • GRPC_XDEBUG

要激活 xDebug,请确保在您的 php.ini 中设置了 xdebug.mode=debug

要启用应用程序中的 xDebug,请确保设置了 ENV 变量 GRPC_XDEBUG

  • GRPC_SERVER

请考虑您想要的 gRPC 服务器地址

  • GRPC_WORKER_MAX_JOBS

最大工作执行次数。零(或无)表示没有限制。(默认:0)

  • GRPC_WORKER_NUM_WORKERS

启动的进程数量。零(或无)表示逻辑 CPU 数量。(默认:0)

创建新服务

php artisan make:service {service-name} --grpc --language=fa

编译 proto 文件

首先,在 app/Protobuf 路径下创建一个名为 echo.proto 的 proto 文件,并将以下内容复制到其中,如果该文件夹不存在,请创建它

syntax = "proto3";

package services;

option php_namespace = "GrpcServices\\Echo\\Messages";
option php_metadata_namespace = "GrpcServices\\Echo";

service Echo {
    rpc Ping (PingMessage) returns (PingMessage) {
    }
}

message PingMessage {
    string msg = 1;
}

注意,以下 3 行文件内容不应更改

package services;

option php_namespace = "GrpcServices\\Echo\\Messages";
option php_metadata_namespace = "GrpcServices\\Echo";

安装 protobuf 编译器

sudo apt install -y protobuf-compiler

接下来,在安装 protoc 程序后,执行以下命令以创建连接所需的文件

protoc --proto_path=app/Protobuf --php_out=./app/Protobuf echo.proto

执行 protoc 命令后,在 app/Protobuf 路径下创建一个名为 GrpcServices 的文件夹,其中包含消息和主服务类

创建第一个方法

将此行添加到创建的仓库中

use Spiral\RoadRunner\GRPC\ContextInterface;
use GrpcServices\Echo\Messages\PingMessage;

public function Ping(ContextInterface $ctx, PingMessage $in): PingMessage;

然后在相关的服务中,在仓库中添加额外的方方法,并根据 proto 文件的定义放置其输出。

在 RoadRunner 中注册 Proto 文件

根据以下方式将上一步创建的文件路径添加到 .rr.yaml 文件中

grpc:
  listen: ${GRPC_SERVER}
  proto:
    - "app/Protobuf/notification.proto"
    - "proto file path"

将服务注册到 gRPC 服务器

要在 register 方法中注册创建的服务,在 App\Providers\GrpcServiceProvider.php 类中注册您的服务如下

$this->bindGrpc(PingRepository::class, PingService::class);

运行 RoadRunner 服务器

./rr serve --dotenv .env

客户端

要构建客户端的通信类,首先必须像服务器端一样编译 proto 文件,然后使用以下命令创建通信类。

composer require vandarpay/laravel-grpc
php artisan vendor:publish --tag=grpc-config
php artisan make:grpc-client {service name}

proto 文件应在 app/Protobuf 路径下。执行上述命令后,将在 app/Protobuf 路径下创建一个名为 Clients 的文件夹。

之后,应将定义的服务通信设置放置在配置文件 grpc.php

        'notification' => [
            'host' => env('NOTIFICATION_SERVER_HOST'),
            'authentication' => env('NOTIFICATION_SERVER_AUTHENTICATION','insecure'), // insecure, tls
            'cert' => env('NOTIFICATION_SERVER_CERT','')
        ],

注意:此设置的索引必须等于服务名称

在此步骤中,将 proto 文件从服务器端传输到客户端,并使用 proto 编译器创建所需的文件。

protoc --proto_path=app/Protobuf --php_out=./app/Protobuf notification.proto

以下是一个更好的理解 GRPC 客户端类的示例

<?php

namespace App\Protobuf\Clients;

use GrpcServices\Echo\Messages\PingMessage;
use GrpcServices\Notification\Messages\TextMessage;
use vandarpay\LaravelGrpc\GrpcClient;

class NotificationClient extends GrpcClient
{
    protected string $service = 'services.Notification';

    public function send(string $message): TextMessage
    {
        $request = new TextMessage();
        $request->setMsg($message . ' In Client ' . rand(0, 9999));

        return $this->client->simpleRequest('send', $request);
    }
}

在服务上启用版本控制

当然,在服务开发过程中,有时需要升级旧版本,此包完全支持这一部分。为此,考虑服务所需的所有必要文件夹后。

在这种情况下,文件夹结构如下所示

├── Services
    ├── Test 
    |   ├── v1
    |   |   ├── TestException.php
    |   |   ├── TestRepository.php
    |   |   ├── TestTransformer.php
    |   |   └── TestService.php
    |   └── v2
    |       ├── TestException.php
    |       ├── TestRepository.php
    |       ├── TestTransformer.php
    |       └── TestService.php
    └── AlphaService