matrix2305/laravel-grpc

GRPC Laravel 包

dev-master 2024-06-10 09:10 UTC

This package is auto-updated.

Last update: 2024-09-10 09:41:06 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文件

将上一步中创建的文件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