摘要:緊接上一篇,下面用作為客戶端調(diào)用的服務(wù)端。安裝插件插件可以幫助我們自動(dòng)生成客戶端封裝了的服務(wù)接口,方便我們直接引入調(diào)用,否則只生成服務(wù)請(qǐng)求響應(yīng)的實(shí)體類,用起來不太方便。打包解包客戶端發(fā)送至服務(wù)端服務(wù)端接收數(shù)據(jù)后使用對(duì)應(yīng)的實(shí)體解包服務(wù)端
緊接上一篇,下面用PHP作為客戶端調(diào)用Go的服務(wù)端。
安裝 grpc_php_plugin 插件grpc_php_plugin插件可以幫助我們自動(dòng)生成client stub客戶端(封裝了grpc的服務(wù)接口),方便我們直接引入調(diào)用,否則只生成服務(wù)/請(qǐng)求/響應(yīng)的實(shí)體類,用起來不太方便。
# 下載 grpc 的庫到本地 cd ~ && git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc # 更新子模塊依賴 cd grpc && git submodule update --init # 這里我們只編譯 php 的插件 如果要編譯所有的 make && make install make grpc_php_plugin # 插件路徑 ll ./bins/opt/grpc_php_plugin生成PHP客戶端
PHP只能做C端,且需要安裝grpc和protobuf擴(kuò)展和庫。
###生成php客戶端庫 #不會(huì)有 client stub 類 protoc -I. --php_out=plugins=grpc:./user user.proto # 會(huì)有 client stub 類 protoc -I. --php_out=./user --grpc_out=./user --plugin=protoc-gen-grpc=/root/grpc/bins/opt/grpc_php_plugin user.proto # 查看生成的服務(wù)類庫 [root@localhost grpc]# tree user user ├── GPBMetadata │?? └── User.php ├── User │?? ├── UserClient.php │?? ├── UserDeleteRequest.php │?? ├── UserDeleteResponse.php │?? ├── UserEntity.php │?? ├── UserIndexRequest.php │?? ├── UserIndexResponse.php │?? ├── UserPostRequest.php │?? ├── UserPostResponse.php │?? ├── UserViewRequest.php │?? └── UserViewResponse.php └── user.pb.goPHP GRPC 擴(kuò)展及依賴安裝
#安裝擴(kuò)展 pecl install grpc pecl install protobuf
使用 composer 管理依賴加載。
mkdir grpc-php-client && cd grpc-php-client # 使用 composer 管理項(xiàng)目 composer init # 安裝 grpc/protobuf 的客戶端庫文件 composer require grpc/grpc composer require google/protobuf # 新建 grpc 服務(wù)庫目錄 將生成的PHP客戶端文件移動(dòng)至此 mkdir grpc && mv $GOPATH/src/grpc/user/* ./grpc # 注冊(cè) psr4 自動(dòng)加載服務(wù)的客戶端文件 vi composer.json { "name": "root/php-client", "require": { "grpc/grpc": "^1.19", "google/protobuf": "^3.7" }, "autoload": { "psr-4": { "User": "./grpc/User/", "GPBMetadata": "./grpc/GPBMetadata/" } } } # 更新 composer 加載器 composer dump-autoloadPHP客戶端代碼實(shí)例
在安裝完php的grpc擴(kuò)展和依賴庫后,我們就可以編寫代碼了。
GrpcChannelCredentials::createInsecure() ]); $userIndexRequest = new UserIndexRequest(); $userIndexRequest->setPage(1); $userIndexRequest->setPageSize(12); /* @var $userIndexResponse UserIndexResponse */ /* @var $statusObj stdClass */ list($userIndexResponse, $statusObj) = $userClient->UserIndex($userIndexRequest)->wait(); if (0 != $statusObj->code) { throw new Exception($statusObj->details, $statusObj->code); } printf("index request end: err %d msg %s" . PHP_EOL, $userIndexResponse->getErr(), $userIndexResponse->getMsg()); /* @var $data UserEntity[] */ $data = $userIndexResponse->getData(); foreach ($data as $row) { echo $row->getName() . " " . $row->getAge() . PHP_EOL; } // 剩余的就不寫了 都很簡單的 // $userClient->UserView(); // $userClient->UserPost(); // $userClient->UserDelete();
# 結(jié)果 [root@localhost php-client]# php index.php index request end: err 0 msg success big_cat 28 sqrt_cat 29
Go 服務(wù)端和客戶端版
Protobuf 的原生使用grpc使用protobuf作為IDL,聲明服務(wù)接口,請(qǐng)求實(shí)體,響應(yīng)實(shí)體,后續(xù)我們將自己業(yè)務(wù)填充進(jìn)去,客戶端發(fā)送請(qǐng)求實(shí)體,服務(wù)端服務(wù)接口處理業(yè)務(wù),然后返回響應(yīng)實(shí)體,請(qǐng)求/響應(yīng)實(shí)體的數(shù)據(jù)傳輸也使用protobuf進(jìn)行了打包/解包。
# 打包 //GoogleProtobufInternalMessage::serializeToString # 解包 //GoogleProtobufInternalMessage::mergeFromString // 客戶端 $message = new Message(); $message->setId(1); $message->setName("sqrt_cat"); $message->setAddress("shanghai"); $package = $message->serializeToString(); // 發(fā)送 $package 至服務(wù)端 // 服務(wù)端接收數(shù)據(jù)后使用對(duì)應(yīng)的實(shí)體解包 // 服務(wù)端 $message = new Message(); $message->mergeFromString($package); var_dump($message->getId(), $message->getName(), $message->getAddress());
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/31518.html
摘要:原文地址從實(shí)踐到原理,帶你參透在語言中大放異彩,越來越多的小伙伴在使用,最近也在公司安利了一波,希望能通過這篇文章能帶你一覽的愛與恨。幀的主要作用是裝填主體信息,是數(shù)據(jù)幀。 showImg(https://segmentfault.com/img/remote/1460000019552245); 原文地址:從實(shí)踐到原理,帶你參透 gRPC gRPC 在 Go 語言中大放異彩,越來越多...
摘要:帶入對(duì)方法做自定義認(rèn)證原文地址帶入對(duì)方法做自定義認(rèn)證項(xiàng)目地址前言在前面的章節(jié)中,我們介紹了兩種證書算一種可全局認(rèn)證的方法證書認(rèn)證基于的證書認(rèn)證而在實(shí)際需求中,常常會(huì)對(duì)某些模塊的方法做特殊認(rèn)證或校驗(yàn)。 帶入gRPC:對(duì) RPC 方法做自定義認(rèn)證 原文地址:帶入gRPC:對(duì) RPC 方法做自定義認(rèn)證項(xiàng)目地址:https://github.com/EDDYCJY/go... 前言 在前面的章...
摘要:定義微服務(wù)作為客戶端調(diào)用的函數(shù)實(shí)現(xiàn)中的接口,使作為的服務(wù)端檢查是否有適合的貨輪貨物被承運(yùn)解析命令行參數(shù)作為的客戶端增加貨物并運(yùn)行更新中的貨物,塞入三個(gè)集裝箱,重量和容量都變大。 譯文鏈接:wuYin/blog原文鏈接:ewanvalentine.io,翻譯已獲作者 Ewan Valentine 授權(quán)。 本節(jié)未細(xì)致介紹 Docker,更多可參考:《第一本Docker書 修訂版》 前言 在...
閱讀 2598·2023-04-25 20:50
閱讀 3961·2023-04-25 18:45
閱讀 2231·2021-11-17 17:00
閱讀 3337·2021-10-08 10:05
閱讀 3086·2019-08-30 15:55
閱讀 3503·2019-08-30 15:44
閱讀 2365·2019-08-29 13:51
閱讀 1121·2019-08-29 12:47