matrix2305 / 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: ^v2024.1.3
- spiral/roadrunner-grpc: ^3.3.0
- vandarpay/service-repository: ^0.1
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
要激活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文件
将上一步中创建的文件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