PHP平臺下使用gRPC

概念

  • gRPC:基於RPC的一種遠程調用協議(php平臺只支持gRPC客戶端調用,不支持gRPC服務端實現)
  • Protobuf:語言無關的高效數據交換協議,用於支持gRPC在不一樣語言間序列化和反序列化數據,具體的數據交換約定由.proto文件定義

安裝

sudo yum -y install unzip libtool

git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc
cd grpc
git pull --recurse-submodules && git submodule update --init --recursive
make & sudo make install

# 編譯導出文件中,經常使用的有:
# grpc/bins/opt/protobuf/protoc:proto文件編譯器
# grpc/bins/opt下生成了各種語言的gRPC編譯插件,用於配合protoc編譯器生成客戶端基類

sudo pecl install grpc
sudo pecl install protobuf
composer require grpc/grpc --profile --prefer-dist --optimize-autoloader
composer require google/protobuf --profile --prefer-dist --optimize-autoloader

使用

proto文件示例php

syntax = "proto3";

package grpc.services.list; #默認包路徑

//針對不一樣語言自定義包路徑
option php_package = "com.service.grpc";

//服務
service ListService {
	//方法定義
    rpc FetchListByUid(ListRequest) returns (ListResponse) {};
}

//請求
message ListRequest {
    string uid = 1;
}

//響應
message ListResponse {
   string result = 1;
}

編譯proto文件,導出客戶端類git

protoc --php_out=src/generated_code/grpc \
       --grpc_out=src/generated_code/grpc \
       --plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin \
       path/your.proto

調用示例github

$request = (new ListRequest())->setUid($id);

$client = new ListServiceClient("gRPC主機:端口", [
    'credentials' => ChannelCredentials::createInsecure(),
    'timeout' => 1000000,
]);

list($reply, $status) = $client->FetchListByUid($request)->wait();
$reply->getXxx();
$client->close();
相關文章
相關標籤/搜索