php调用GRPC

<?php
/**
 * Grpc 服务类
 *
 * 1,composer.json 中 添加 "GPBMetadata\\":"proto/GPBMetadata/" ,composer dump
 * 2,在proto文件夹下创建 .proto文件
 *   注意:package GPBMetadata.repository; 添加前缀 GPBMetadata
 * 3,在grpc文件中执行 /usr/local/protoc/bin/protoc --php_out=. *.proto
 * 4,使用例子1
 * $method = "workorder.workOrderService/GetWorkOrderList"; //服务方提供
 * $request_obj = new \GPBMetadata\Workorder\SearchRequest($set_data); //要组装的数据对像
 * $set_data = ['start_city_id' => 1,'end_city_id'=>100];
 * $replay  ='GPBMetadata\Workorder\ResultReply 或 直接使用文件夹名 Workorder';
 * $clien = new App\Services\GrpcService();
 * $clien->execute($method, $request_obj,$replay);
 *
 * 5,使用例子2,查2次grpc
 * $grpc = new GrpcService(config("grpc.service_url.ducms"));
    //main_line_repository
    $method = '/ducms_main_line_repository.MainLineRepositoryService/GetMainLineRepositoryList';
    $query = new Query();
    //$query->setSqlQuery("status=10 and repositoryid=" . $repository_id);
    $line = new MainLineRepository();
    $line->setStatus(10);
    $line->setRepositoryid($repository_id);
    $query->setEntityQuery($line);

    $res = $grpc->execute($method, $query, new ListResult());
    $repos = $res->getData();

    if(!count($repos)){
        return true;
    }

    $mainLineIds='';
    foreach ($repos as $k=>$v){
        if ($v instanceof MainLineRepository ) {
            $mainLineIds.=$v->getMainLineId().',';
        }
    }
    $mainLineIds = trim($mainLineIds,',');

    //检查另一张表数据 main_line
    $method = '/ducms_main_line.MainLineService/GetMainLine';
    $query = new \GPBMetadata\Dcms_main_line\Query();
    $query->setSqlQuery("id in({$mainLineIds})");

    $res = $grpc->execute($method, $query, new \GPBMetadata\Ducms_main_line\EntityResult());
    $repos = $res->getData();

    if ($repos instanceof MainLine ) {
    return false;
    }else{
    return true;
    }
 *
 * @filename  GrpcService.php
 * @author    Zhenxun Du <5552123@qq.com>
 * @date      2019/6/22 14:28
 * @version   $Id$
 */

namespace App\Services;

use App\Entity\Result;
use App\Library\Common;
use Illuminate\Support\Facades\Log;

class GrpcService extends \Grpc\BaseStub
{
    public $server_url;

    public function __construct($server_url = '')
    {
        $this->server_url = $server_url ? $server_url : config("grpc.service_url.default");

        parent::__construct($this->server_url, ['credentials' => \Grpc\ChannelCredentials::createInsecure()]);
    }

    /**
     * 执行rpc
     * @param string $method 服务端提供  /workorder.workOrderService/GetWorkOrderList
     * @param object $request_obj 要发送的数据对像
     * @param object $response_obj 响应结果对像
     * @return Result
     */
    public function execute($method, $request_obj, $response_obj)
    {
        $result = new Result();
        try {
            //尝试2次
            $i = 0;
            while ($i < 2) {
                $res = $this->_simpleRequest($method, $request_obj, [$response_obj, 'decode']);
                list($reply, $status) = $res->wait();
                if ($reply instanceof $response_obj) {
                    break;
                } else {
                    //echo $i.PHP_EOL;
                    usleep(1000000);
                    $i++;
                }
            }

            $res_data = $reply->getData();
            if (is_string($res_data)) {
                $data = json_decode($reply->getData(), true) ?: $reply->getData();
            } else {
                $data = $res_data;
            }

            $result->setCode(Result::CODE_SUCCESS)->setData($data);
        } catch (\Exception $e) {
            //记录日志 ....
            $result->setCode(Result::CODE_ERROR)->setMsg('系统繁忙,请重试!');
        }
        return $result;
    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值