GO-Grpc微服務開發四 服務呼叫for php
阿新 • • 發佈:2018-11-08
GO-Grpc微服務開發四 服務呼叫for php
參考文件列表
- PHP grpc官方文件 https://grpc.io/docs/quickstart/php.html
- PHP grpc官方案例 https://grpc.io/docs/tutorials/basic/php.html
- PHP grpc官方案例之github下載 https://github.com/grpc/grpc/tree/master/examples/php
一.環境搭建
1.安裝grpc擴充套件
pecl install grpc
修改php.ini檔案 新增 extension=grpc.so
通過php -m | grep grpc
檢視grpc.so是否安裝成功
2.下載protoc命令
以mac為例:參考連結 https://www.jianshu.com/p/f8b789280df4
protoc --version
檢視是否安裝成功
3.安裝PHP GRpc SDK
git clone -b v1.15.0 https://github.com/grpc/grpc
需要grpc-php-plugin來生成proto對應的php可執行檔案。
cd grpc && git submodule update --init && make grpc_php_plugin
可與將 grpc_php_plugin 命令加入環境變數
二.通過protoc檔案生成PHP檔案
編寫proto檔案
syntax = "proto3"; package yunpian; service YunPian { rpc Send(SendSmsReq) returns (SendSmsRes); } message SendSmsReq { string code = 1; } message SendSmsRes { int32 code = 1; string message = 2; map<string, string> data = 3; }
protoc命令生成PHP檔案
參考連結: https://www.cnblogs.com/ghj1976/p/5435565.html
protoc --proto_path=examples/protos --php_out=examples/php/route_guide --grpc_out=examples/php/route_guide
--plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin ./examples/protos/route_guide.proto
proto_path對應proto檔案的位置,php_out指定生成PHP檔案的目錄,grpc_out和php_out指定相同的目錄,plugin對應上面安裝的grpc_php_plugin命令路徑,最後跟上具體proto的檔案地址。
三.PHP客戶端呼叫微服務 例子1
proto檔案編輯
syntax = "proto3";
package yunpian;
service YunPian {
rpc Send(SendSmsReq) returns (SendSmsRes);
}
message SendSmsReq {
string code = 1;
}
message SendSmsRes {
int32 code = 1;
string message = 2;
map<string, string> data = 3;
}
通過protoc命令生成PHP檔案
protoc --proto_path=examples/protos --php_out=examples/php/route_guide --grpc_out=examples/php/route_guide
--plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin ./examples/protos/route_guide.proto
通過composer安裝consule-php-sdk等包
"require": {
"grpc/grpc": "^v1.3.0",
"google/protobuf": "^v3.3.0",
"sensiolabs/consul-php-sdk": "^3.0"
},
require dirname(__FILE__).'/../vendor/autoload.php';
define('COORD_FACTOR', 1e7);
$serviceFactory = new SensioLabs\Consul\ServiceFactory();
$cl = $serviceFactory->get("catalog"); //採用cataLog的服務方式
$service = $cl->service("yunpian"); //引數傳入和服務端約定的服務名
$microServiceData = \GuzzleHttp\json_decode($service->getBody(), true)[0]; //請求微服務的具體地址
$host = $microServiceData["ServiceAddress"];
$port = $microServiceData["ServicePort"];
$client = new Yunpian\YunPianClient($host.":".$port, [
'credentials' => Grpc\ChannelCredentials::createInsecure(),
]);
$reqObj = new Yunpian\SendSmsReq(); //自定義請求
$reqObj->setCode("1234");
list($data, $status) = $client->Send($reqObj)->wait();
var_dump($data->getCode());
var_dump($data->getMessage());
var_dump($data->getData());