恥知らずのウェブエンジニア -web engineer, shameless

これは一歩を踏み出すことができない者たちのブログ

GoでgRPCサーバー立てて、PHPでリクエストしてみる

なんかもうアレなので前回PHPでgRPCサーバーにリクエストするっぽいことをやったので、今回は実際にgRPCサーバーを立てて、リクエストをしてみる。

PHPでgRPC叩く手始め - 恥知らずのウェブエンジニア -web engineer, shameless

ちなみにPHPでgRPCサーバーは↓で話されているようなのですが、2018/2月現在では実装の目処は立っていない模様。 groups.google.com

なので今回は,GoでgRPCサーバーを立てて、それにPHPからリクエストをするようにしてみようと思います。

流れ

  1. protoを定義
  2. Go用のコードを生成
  3. 生成されたコードからGoでgRPCサーバーを立てる
  4. PHP用のコードを生成
  5. 生成されたコードからPHPクライントを作る
  6. 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から。公式はこちら

grpc.io

生成に必要なのは、下記です。

- 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しました。

github.com

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

developers.eure.jp

実際のコードはこちら

github.com

PHP用のコードを生成

次はgRPCサーバーを叩く用のPHP用のコードを生成します。

grpc.io

生成に必要なのは、下記です

- grpc-extension
- protobuf-extension
- protoc // 先ほどGoの時にinstallしたのと同じ
- grpc_php_plugin //protoからgRPCのPHPのコードを生成するためのplugin

grpc-extension, protobuf-extensionpecl, 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コードをつくります。

下記がほぼすべてで、生成されたclientrequestをsetしてリクエストしているだけです。

今回はUnaryCall(1回リクエストして、1回レスポンスを受け取る)を行うwait()を指定しています。

github.com

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は下記になります。

github.com

github.com

github.com