PHP(Laravel)作为客户端调用GRPC

1 篇文章 0 订阅
1 篇文章 0 订阅
本文章只描述使用php作为客户端调用grpc。

官网链接: grpc
官网php客户端链接: php-clent-grpc

  1. 得有个php环境并且安装好grpc扩展,
  2. 安装 protoc 与 grpc_php_plugin 可执行文件
  3. 使用protoc 与 grpc_php_plugin 生成客户端代码
  4. 调用
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'));

    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值