本文章只描述使用php作为客户端调用grpc。
官网链接: grpc
官网php客户端链接: php-clent-grpc
- 得有个php环境并且安装好grpc扩展,
- 安装 protoc 与 grpc_php_plugin 可执行文件
- 使用protoc 与 grpc_php_plugin 生成客户端代码
- 调用
1. php环境并且安装grpc扩展,这里就不赘述了,用pecl,源码安装,大家投其所好。
2. 安装 protoc 与 grpc_php_plugin 可执行文件
# 下载对应分支(对应版本的)grpc
git clone -b v1.41.1 https://github.com/grpc/grpc.git
cd grpc
# 下载子模块
git submodule update --init
mkdir -p cmake/build
cd cmake/build
# 编译 protoc 与 grpc_php_olugin makefile 文件
cmake ../..
# 编译 makefile文件 生成可执行文件
make protoc grpc_php_plugin
在git submodule update --init 下载子模块的时候,有会出现超时失败等原因 解决办法: git submodule update --init失败解决办法
3. 使用protoc 与 grpc_php_plugin 生成客户端代码
# 这里是在laravel框架根目录下执行
# --php_out php代码输出路径,里面包含request,response,client代码
# --grpc_out GPBMetadata输出路径,用于保存.proto的二进制元数据
# --plugin 生成代码插件的类型与插件的绝对路径路径
protoc email.proto --php_out=./app/Grpc/EmailClient --grpc_out=./app/Grpc/EmailClient --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin
4 调用,单纯的调用我们只需要composer install grpc/grpc 就ok,然后根据request php文件传入所需参数即可,基本上都有接口文档或者readme.md,或者直接跟编写服务端代码人员交流
以下为我司的借口文档与调用事例:
<?php
namespace App\Service;
use Grpc\ChannelCredentials;
use Internal\EmailClient;
use Internal\SendSingleEmailToPartnersRequest;
/**
* >#####[SendSingleEmailToPartners] 根据事件为单商家发送邮件
* 请求参数结构:
* ```
* SendSingleEmailToPartnersRequest {
* string partners_uuid; //接收商家的uuid
* string node; //发送终端 client-客户端, auction-拍卖端, operation-运营端
* string event; //发送事件 详见事件说明
* string params; //发送需要的参数
* }
* ```
* 返回参数结构:
* ```
* SendSingleEmailToPartnersResponse {
* bool result; //是否成功,true or false
* string error; //错误时返回错误信息
* }
* ```
* 事件说明:
* + welcome: 商家入驻,提交资料成功
* + settled_audit_succ: 入驻资料审核成功
* + settled_audit_fail: 入驻资料审核失败,params传递审核记录uuid
* + settled_sign_succ: 签约资料审核成功
* + settled_sign_fail: 签约资料审核失败,params传递审核记录uuid
* + auction_succ: 拍卖会审核成功,params传递该拍卖会uuid
* + auction_fail: 拍卖会审核失败,params传递该拍卖会uuid
* + payment_remind: 买家支付完成发票通知商家,params传递invoice uuid
*/
class GrpcSendEmail
{
const PARTNERS_AUDIT_SUCCESS_EVENT = 'settled_audit_succ';
const PARTNERS_AUDIT_FAIL_EVENT = 'settled_audit_fail';
const PARTNERS_SIGN_SUCCESS_EVENT = 'settled_sign_succ';
const PARTNERS_SIGN_FAIL_EVENT = 'settled_sign_fail';
const AUCTION_AUDIT_SUCCESS = 'auction_succ';
const AUCTION_AUDIT_FAIL = 'auction_fail';
//初始化客户端
private static function CreateClient()
{
return new EmailClient("127.0.0.1:8082", [
"credentials" => ChannelCredentials::createInsecure()
]);
}
/**
* @param $partnersUuid
* @param $event
* @param string $params
* @param string $node
* @throws \Exception
*/
public static function SendSingleEmailToPartners($partnersUuid, $event, $params = '', $node = 'operation')
{
$request = new SendSingleEmailToPartnersRequest();
$request->setPartnersUuid($partnersUuid);
$request->setNode($node);
switch ($event) {
case self::PARTNERS_AUDIT_SUCCESS_EVENT : //基础信息审核通过
$request->setEvent($event);
break;
case self::PARTNERS_AUDIT_FAIL_EVENT : //基础信息审核失败
$request->setEvent($event);
$request->setParams($params);
break;
case self::PARTNERS_SIGN_SUCCESS_EVENT : //签约文件审核成功
$request->setEvent($event);
break;
case self::PARTNERS_SIGN_FAIL_EVENT : //签约文件审核失败
$request->setEvent($event);
$request->setParams($params); //$params 审核记录uuid
break;
case self::AUCTION_AUDIT_SUCCESS : //拍卖会审核成功
$request->setEvent($event);
$request->setParams($params);
break;
case self::AUCTION_AUDIT_FAIL : //拍卖会审核失败
$request->setEvent($event);
$request->setParams($params);
break;
}
[$resultBool, $msg] = self::CreateClient()->SendSingleEmailToPartners($request)->wait();
if (!$resultBool) {
throw new \Exception('Email Send Fail!');
}
return $msg;
}
}
调用:
<?php
namespace App\Api\Controllers;
use App\Http\Controllers\Controller;
use App\Models\Auction;
use App\Models\AuctionHouse;
use App\Service\ExchangeRate;
use App\Service\GrpcSendEmail;
class TestController extends Controller
{
public function index(){
//拍卖行基础信息审核失败短信发送测试
var_dump(GrpcSendEmail::SendSingleEmailToPartners('570b5992-b63f-11ec-8bfd-0aca2988090e',GrpcSendEmail::PARTNERS_AUDIT_FAIL_EVENT,'9c8f58d8-b63f-11ec-937b-0aca2988090e'));
//拍卖行基础信息审核失败短信发送测试
var_dump(GrpcSendEmail::SendSingleEmailToPartners('570b5992-b63f-11ec-8bfd-0aca2988090e',GrpcSendEmail::PARTNERS_SIGN_SUCCESS_EVENT));
//拍卖会审核成功短信发送测试
var_dump(GrpcSendEmail::SendSingleEmailToPartners('437f5bd8-b24f-11ec-a32d-0aca2988090e',GrpcSendEmail::AUCTION_AUDIT_SUCCESS,'ceeb948e-b26d-11ec-a407-0aca2988090e'));
//拍卖会审核后失败短信发送测试
var_dump(GrpcSendEmail::SendSingleEmailToPartners('437f5bd8-b24f-11ec-a32d-0aca2988090e',GrpcSendEmail::AUCTION_AUDIT_SUCCESS,'ceeb948e-b26d-11ec-a407-0aca2988090e'));
}
}