本文作一個小demo,用go你們grpc服務,提供一個查詢用戶列表的接口。用php作client。php
環境安裝:git
- 安裝grpc
- 安裝protobuf
- 安裝protoc-gen-go ,參見:https://github.com/golang/protobuf
- 安裝php的grpc和protobuf組件,能夠安裝擴展(性能更高一些),也能夠經過composer的方式安裝。
- 安裝grpc的php_plugin 參見:https://github.com/grpc/grpc/tree/master/src/php
定義proto文件:github
在程序根目錄下新建usercenter目錄,新建usercenter.proto文件。golang
syntax = "proto3"; package usercenter; service usercenterservice { rpc GetUserList (GetUserListReq) returns (GetUserListResp) { } } message GetUserListReq { int64 page = 1; int64 pagesize = 2; } message UserInfo { int64 userid = 1; string username = 2; string mobile = 3; } message GetUserListResp { repeated UserInfo data = 1; }
根據proto文件生成相應的go的庫文件:json
執行:app
protoc --go_out=plugins=grpc:./ usercenter.proto
server端文件composer
在根目錄下新建usercenterserver.gotcp
package main import ( "context" "google.golang.org/grpc" "log" . "net" "protobufdemo/usercenter" ) const ( addr = "127.0.0.1:10023" ) type server struct{} func (s *server) GetUserList(ctx context.Context, in *usercenter.GetUserListReq) (*usercenter.GetUserListResp, error) { var data []*usercenter.UserInfo temp1 := usercenter.UserInfo{Userid: 1, Username: "zhangsan", Mobile: "13566667777"} temp2 := usercenter.UserInfo{Userid: 3, Username: "lisi", Mobile: "13899998888"} data = append(data, &temp1) data = append(data, &temp2) return &usercenter.GetUserListResp{Data: data}, nil } func main() { lis, err := Listen("tcp", addr) if err != nil { log.Fatal("failed to listen: %v", err) } s := grpc.NewServer() usercenter.RegisterUsercenterserviceServer(s, &server{}) s.Serve(lis) }
執行 go run usercenterserver.go,啓動server端。性能
client端:測試
執行命令,生成對應的類:
protoc --proto_path=./ \ --php_out=./ \ --grpc_out=./ \ --plugin=protoc-gen-grpc=/Users/ccc/work/grpc/bins/opt/grpc_php_plugin \ *.proto
編寫client文件:
<?php /** * Class * 參考: * https://github.com/grpc/grpc/tree/master/src/php * 本例採用composer而非擴展來加載protobuf和grpc包 * * php調用grpc測試 * * @version: * @datetime: 2018-12-28 15:10 * @author: guoqiang * @copyright: ec */ function includeIfExists($file) { if (file_exists($file)) { return include $file; } else { return false; } } function my_autoloader($class) { $arr = explode("\\", $class); if (in_array($arr[0], ['Usercenter', 'GPBMetadata'])) { $filename = implode(DIRECTORY_SEPARATOR, $arr) . '.php'; includeIfExists($filename); } } require './vendor/autoload.php'; use \Grpc\ChannelCredentials; spl_autoload_register('my_autoloader'); $client = new \Usercenter\usercenterserviceClient('127.0.0.1:10023', ['credentials' => ChannelCredentials::createInsecure()]); $req = new \Usercenter\GetUserListReq(); $req->setPage(1); $req->setPagesize(10); list($re, $status) = $client->GetUserList($req)->wait(); $result = $re->serializeToJsonString($re); $result = json_decode($result, true); var_dump($result);
執行php client.php,即可看到結果。