第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

mac下grpc(golang server + php client)實(shí)踐

標(biāo)簽:
PHP

目前微服务这么流行,RPC框架也是百花齐放,本文讲述一下mac下grpc的开发环境搭建,其中server端使用golang,客户端使用php。

服务端

golang grpc安装

这里列出了一个参考,由于grpc在github上的文件目录有改动,所以直接按官方的安装,会出404资源无法找到的问题。
需要先在本地安装golang+grpc。具体可参考:golang安装grpc
操作完之后,在终端运行:protoc --version,能看到版本信息
同时,protoc-gen-go命令应该也已经被安装

查看protoc版本信息


php grpc客户端

扩展有几个,推荐使用官方的
当然,另外一个也相当不错,datto的protobuf扩展。使用datto的这个的时候,我用perl根据其文档安装失败,既然官方的ok了,也就懒得再去折腾了。
官方的具体的安装流程,刚刚给的github的网址上有详细的说明,根据步骤走,就ok了。
安装完之后,为了在nginx下使用,应该装grpc这个扩展:

php的grpc扩展安装成功查看


开始Demo



官方给了一个helloworld.proto的demo,咱们按样子,增加一个,目录结构如下:

demo目录结构


app和meta,放的是protoc编译之后的服务端的go的源码。
grpc,将protoc编译成PHP所需要的工具及源码(即:grpc_php_plugin)
phpClient,是protoc编译出来的php的源码,下面的vendor文件夹是composer加载的grpc/grpc的php客户端的连接服务端的源码

上源码

先建立文件夹:mkdir grpc_demo

meta.proto的源码

syntax = "proto3";

package meta;

service Agent {  rpc GetInfo (MetaRequest) returns (MetaResponse);
}

message MetaRequest {  string appId = 1;
}

message MetaResponse {  string appId = 1;  string title = 2;  string name = 3;  string logo = 4;
}

编译成golang文件:

protoc --go_out=plugins=grpc:./meta ./meta.proto

编译成php文件:

protoc --proto_path=./ \
       --php_out=phpClient/meta \
       --grpc_out=phpClient/meta \
       --plugin=protoc-gen-grpc=./grpc/bins/opt/grpc_php_plugin \
       meta.proto

编写main.go文件:(此处把helloworld.proto这个demo也加进来了)

package mainimport (    "log"
    "net"
    pb "grpc_demo/app"
    meta "grpc_demo/meta"
    "golang.org/x/net/context"
    "google.golang.org/grpc")const (
    port = ":50051")// server is used to implement helloworld.GreeterServer.type server struct{}// SayHello implements helloworld.GreeterServerfunc (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {    return &pb.HelloReply{Message: "Hello " + in.Name + "--from jacky_chen"}, nil}func (s *server) GetInfo(ctx context.Context, in *meta.MetaRequest) (*meta.MetaResponse, error) {    return &meta.MetaResponse {
        AppId: in.AppId,
        Title: "my title",
        Name: "My Name",
        Logo: "https://xxx.com",
    }, nil} 
func main() {
    lis, err := net.Listen("tcp", port)    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    meta.RegisterAgentServer(s, &server{})
    s.Serve(lis)
}

agent_client.php源码:

<?phprequire dirname(__FILE__).'/../vendor/autoload.php';

print_r(get_declared_classes());exit;include_once dirname(__FILE__).'/Meta/AgentClient.php';include_once dirname(__FILE__).'/Meta/MetaRequest.php';include_once dirname(__FILE__).'/Meta/MetaResponse.php';include_once dirname(__FILE__).'/GPBMetadata/Meta.php';
$appId = "123";try {
    $client = new Meta\AgentClient('localhost:50051', [        'credentials' => Grpc\ChannelCredentials::createInsecure(),
    ]);
    $request = new Meta\MetaRequest();
    $request->setAppId($appId);    list($reply, $status) = $client->GetInfo($request)->wait();    echo $reply->serializeToJsonString();
} catch (\Throwable | \Error | \Exception $e) {    echo  "error : " . $e->getMessage();
}

运行服务端:

go run main.go

运行客户端:

php

结果如图:


php调用go的rpc服务

由于php本身的原因(官方是基于php-fpm,非常驻内存),所以grpc官方并没有php的服务端。当然,基于swoole开发的grpc的服务端在github上已经有了。



作者:陈晓风
链接:https://www.jianshu.com/p/74b6080c3c5f


點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消