概述
本文做一个小demo,用go大家grpc服务,提供一个查询用户列表的接口。用php做client。
环境安装:
- 安装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文件:
在程序根目录下新建usercenter目录,新建usercenter.proto文件。
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的库文件:
执行:
protoc --go_out=plugins=grpc:./ usercenter.proto
server端文件
在根目录下新建usercenterserver.go
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 GrpcChannelCredentials; spl_autoload_register('my_autoloader'); $client = new UsercenterusercenterserviceClient('127.0.0.1:10023', ['credentials' => ChannelCredentials::createInsecure()]); $req = new UsercenterGetUserListReq(); $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,便可看到结果。
转载于:https://my.oschina.net/u/3780525/blog/2995799
最后
以上就是舒心大地为你收集整理的grpc-protobuf golang做server&php做client的全部内容,希望文章能够帮你解决grpc-protobuf golang做server&php做client所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复