vanardpay / laravel-grpc
GRPC Laravel 包
Requires
- php: ^8.1
- ext-grpc: *
- ext-protobuf: *
- google/common-protos: ^3.0
- google/protobuf: ^3.11
- grpc/grpc: ^1.36
- nyholm/psr7: ^1.5
- spiral/roadrunner: ^2.11
- spiral/roadrunner-grpc: ^2.0
- spiral/roadrunner-laravel: ^5.9
- vandarpay/service-repository: ^0.1
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
要激活 xDebug,请确保在您的 php.ini
中设置了 xdebug.mode=debug
。
要启用应用程序中的 xDebug,请确保设置了 ENV
变量 GRPC_XDEBUG
。
请考虑您想要的 gRPC 服务器地址
最大工作执行次数。零(或无)表示没有限制。(默认:0)
启动的进程数量。零(或无)表示逻辑 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