GoでgRPCサーバー立てて、PHPでリクエストしてみる
なんかもうアレなので前回PHPでgRPCサーバーにリクエストするっぽいことをやったので、今回は実際にgRPCサーバーを立てて、リクエストをしてみる。
PHPでgRPC叩く手始め - 恥知らずのウェブエンジニア -web engineer, shameless
ちなみにPHPでgRPCサーバーは↓で話されているようなのですが、2018/2月現在では実装の目処は立っていない模様。 groups.google.com
なので今回は,GoでgRPCサーバーを立てて、それにPHPからリクエストをするようにしてみようと思います。
流れ
- protoを定義
- Go用のコードを生成
- 生成されたコードからGoでgRPCサーバーを立てる
- PHP用のコードを生成
- 生成されたコードからPHPクライントを作る
- gRPCサーバーを立てて、PHPクライントリクエストしてみる
protoを定義
下記のprotoを用意。とりあえず単純に文字列を受けて、返すだけです
syntax = "proto3"; package ping; service Ping { rpc Hello (HelloReqest) returns (HelloResponse) { } } message HelloReqest { string toMessage = 1; } message HelloResponse { string resMessage = 1; }
Go用のコードを生成
ますはGoから。公式はこちら
生成に必要なのは、下記です。
- google.golang.org/grpc - github.com/golang/protobuf/protoc-gen-go //protoからgRPCのgoのコードを生成するためのplugin - protoc //protoc compiler
google.golang.org/grpc
, protoc-gen-go
は普通にgo get します
go get -u google.golang.org/grpc go get -u github.com/golang/protobuf/protoc-gen-go
protoc
は各platformにあったものを下記からDLし、bin以下などにおきます。
自分はmacなのでprotoc-3.5.1-osx-x86_64.zip
をDLしました。
Go用のコードの生成コマンドは下記になります
// protos/*.protoを対象にして、./go以下に生成されたgo用のgRPCを使ったコードが生成されます protoc --go_out=plugins=grpc:./go protos/*.proto
実際に生成されコードはこちらのようになります。
come-on-proto/ping.pb.go at master · ogataka50/come-on-proto · GitHub
生成されたコードからGoでgRPCサーバーを立てる
これらもとにGoでgRPCサーバーを用意します。
今回は下記の記事をかなり色濃くほぼそのまま参考にさせて頂きました!ありがとうございます!m( )m
実際のコードはこちら
PHP用のコードを生成
次はgRPCサーバーを叩く用のPHP用のコードを生成します。
生成に必要なのは、下記です
- grpc-extension - protobuf-extension - protoc // 先ほどGoの時にinstallしたのと同じ - grpc_php_plugin //protoからgRPCのPHPのコードを生成するためのplugin
grpc-extension
, protobuf-extension
はpecl, brewなどでinstallできます。
brew install php71-grpc brew install php71-protobuf pecl install grpc pecl install protobuf
grpc_php_plugin
は、grpcのrepoをcloneして、make grpc_php_plugin
することでつくることができます
git clone -b v1.9.x https://github.com/grpc/grpc cd grpc && git submodule update --init && make grpc_php_plugin
PHP用のコードの生成コマンドは下記になります
// protos/*.protoを対象にして、./php以下に生成されたPHP用のgRPCを使ったコードが生成されます protoc --proto_path=protos/ \ --php_out=php \ --grpc_out=php \ --plugin=protoc-gen-grpc=./grpc_php_plugin \ ./protos/*.proto
実際に生成されコードはこちらのようになります。
come-on-proto/PingClient.php at master · ogataka50/come-on-proto · GitHub
生成されたコードからPHPクライントを作る
次に生成されたコードを使ってリクエストを行うPHPコードをつくります。
下記がほぼすべてで、生成されたclient
にrequest
をsetしてリクエストしているだけです。
今回はUnaryCall
(1回リクエストして、1回レスポンスを受け取る)を行うwait()
を指定しています。
gRPCサーバーを立てて、PHPクライントでリクエストしてみる
準備は整ったので、実際に動かしていきます。
Goサーバーのビルド、実行
go build -o bin/server server.go go build -o bin/client client.go // goでgRPCにリクエストする用。今回はスルー。 ※make build でもできるようにしています ./bin/server
でGoのgRPCサーバーを立てます
PHPクライントでリクエストしてみる
さっそくリクエストしてます。gRPC-client-PHP
に戻って php ./bin/console helloGRPC
でリクエストできます。
$ php ./bin/console helloGRPC object(stdClass)#52 (3) { ["metadata"]=> array(0) { } ["code"]=> int(0) ["details"]=> string(0) "" } string(24) "I hear hogeeeeeeeeeeeeee"
正常にリクエストできてば、上記のような出力になるはずです。 それっぽくできているようです!
まとめ
今回は実際にGoでgRPCサーバーを立てて、PHPでリクエストしてみました。
最初色々戸惑いところもありましたが、簡単な動作確認することができました。
次は、Streaming RPC
なども試したいところ。パフォーマンスなども気になる。
共通のprotoを元に複数言語で利用できるところなどはmicro services
とは確かに相性良さそうなことは実感できました!^^
また今回つかったrepoは下記になります。