亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

grpc - 使用 golang 帶你從頭擼一套 RPC 服務(wù)(二)

raise_yang / 1559人閱讀

摘要:緊接上一篇,下面用作為客戶(hù)端調(diào)用的服務(wù)端。安裝插件插件可以幫助我們自動(dòng)生成客戶(hù)端封裝了的服務(wù)接口,方便我們直接引入調(diào)用,否則只生成服務(wù)請(qǐng)求響應(yīng)的實(shí)體類(lèi),用起來(lái)不太方便。打包解包客戶(hù)端發(fā)送至服務(wù)端服務(wù)端接收數(shù)據(jù)后使用對(duì)應(yīng)的實(shí)體解包服務(wù)端

緊接上一篇,下面用PHP作為客戶(hù)端調(diào)用Go的服務(wù)端。

安裝 grpc_php_plugin 插件

grpc_php_plugin插件可以幫助我們自動(dòng)生成client stub客戶(hù)端(封裝了grpc的服務(wù)接口),方便我們直接引入調(diào)用,否則只生成服務(wù)/請(qǐng)求/響應(yīng)的實(shí)體類(lèi),用起來(lái)不太方便。

# 下載 grpc 的庫(kù)到本地
cd ~ && git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc
# 更新子模塊依賴(lài)
cd grpc && git submodule update --init
# 這里我們只編譯 php 的插件 如果要編譯所有的 make && make install
make grpc_php_plugin
# 插件路徑
ll ./bins/opt/grpc_php_plugin
生成PHP客戶(hù)端

PHP只能做C端,且需要安裝grpcprotobuf擴(kuò)展和庫(kù)。

###生成php客戶(hù)端庫(kù)

#不會(huì)有 client stub 類(lèi)
protoc -I. --php_out=plugins=grpc:./user user.proto

# 會(huì)有 client stub 類(lèi)
protoc -I. 
--php_out=./user 
--grpc_out=./user 
--plugin=protoc-gen-grpc=/root/grpc/bins/opt/grpc_php_plugin 
user.proto

# 查看生成的服務(wù)類(lèi)庫(kù)
[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.go
PHP GRPC 擴(kuò)展及依賴(lài)安裝
#安裝擴(kuò)展
pecl install grpc
pecl install protobuf

使用 composer 管理依賴(lài)加載。

mkdir grpc-php-client && cd grpc-php-client
# 使用 composer 管理項(xiàng)目
composer init

# 安裝 grpc/protobuf 的客戶(hù)端庫(kù)文件
composer require grpc/grpc
composer require google/protobuf

# 新建 grpc 服務(wù)庫(kù)目錄 將生成的PHP客戶(hù)端文件移動(dòng)至此
mkdir grpc && mv $GOPATH/src/grpc/user/* ./grpc
# 注冊(cè) psr4 自動(dòng)加載服務(wù)的客戶(hù)端文件
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-autoload
PHP客戶(hù)端代碼實(shí)例

在安裝完phpgrpc擴(kuò)展和依賴(lài)庫(kù)后,我們就可以編寫(xiě)代碼了。

 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;
}

// 剩余的就不寫(xiě)了 都很簡(jiǎn)單的
// $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ù)端和客戶(hù)端版

Protobuf 的原生使用

grpc使用protobuf作為IDL,聲明服務(wù)接口,請(qǐng)求實(shí)體,響應(yīng)實(shí)體,后續(xù)我們將自己業(yè)務(wù)填充進(jìn)去,客戶(hù)端發(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

// 客戶(hù)端
$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://www.ezyhdfw.cn/yun/31518.html

相關(guān)文章

  • 從實(shí)踐到原理,帶你參透 gRPC

    摘要:原文地址從實(shí)踐到原理,帶你參透在語(yǔ)言中大放異彩,越來(lái)越多的小伙伴在使用,最近也在公司安利了一波,希望能通過(guò)這篇文章能帶你一覽的愛(ài)與恨。幀的主要作用是裝填主體信息,是數(shù)據(jù)幀。 showImg(https://segmentfault.com/img/remote/1460000019552245); 原文地址:從實(shí)踐到原理,帶你參透 gRPC gRPC 在 Go 語(yǔ)言中大放異彩,越來(lái)越多...

    geekidentity 評(píng)論0 收藏0
  • 帶入gRPC:對(duì) RPC 方法做自定義認(rèn)證

    摘要:帶入對(duì)方法做自定義認(rèn)證原文地址帶入對(duì)方法做自定義認(rèn)證項(xiàng)目地址前言在前面的章節(jié)中,我們介紹了兩種證書(shū)算一種可全局認(rèn)證的方法證書(shū)認(rèn)證基于的證書(shū)認(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... 前言 在前面的章...

    wh469012917 評(píng)論0 收藏0
  • Golang服務(wù)教程(

    摘要:定義微服務(wù)作為客戶(hù)端調(diào)用的函數(shù)實(shí)現(xiàn)中的接口,使作為的服務(wù)端檢查是否有適合的貨輪貨物被承運(yùn)解析命令行參數(shù)作為的客戶(hù)端增加貨物并運(yùn)行更新中的貨物,塞入三個(gè)集裝箱,重量和容量都變大。 譯文鏈接:wuYin/blog原文鏈接:ewanvalentine.io,翻譯已獲作者 Ewan Valentine 授權(quán)。 本節(jié)未細(xì)致介紹 Docker,更多可參考:《第一本Docker書(shū) 修訂版》 前言 在...

    sevi_stuo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<