当前位置: 首页 > 后端技术 > PHP

grpc——用golang带你从头搞定一套RPC服务(二)

时间:2023-03-30 02:38:36 PHP

继上一篇文章,下面使用PHP作为客户端调用Go服务端。安装grpc_php_plugin插件grpc_php_plugin插件可以帮我们自动生成一个clientstub客户端(封装了grpc的服务接口),方便我们直接引入调用,否则只有service/request/response的实体类生成了,使用起来不方便。#下载grpc库到本地cd~&&gitclone-b$(curl-Lhttps://grpc.io/release)https://github.com/grpc/grpc#更新子模块依赖cdgrpc&&gitsubmoduleupdate--init#这里只编译php插件如果要全部编译make&&makeinstallmakegrpc_php_plugin#插件路径ll./bins/opt/grpc_php_plugin生成PHP客户端PHP只能做C端,需要安装grpc和protobuf扩展和库。###生成php客户端库#不会有客户端存根类protoc-I。--php_out=plugins=grpc:./useruser.proto#会有clientstubclassprotoc-I。\--php_out=./user\--grpc_out=./user\--plugin=protoc-gen-grpc=/root/grpc/bins/opt/grpc_php_plugin\user.proto#查看生成的服务类库[root@localhostgrpc]#treeuseruser├──GPBMetadata│└──User.php├──User│├──UserClient.php│├──UserDeleteRequest.php│├──UserDeleteResponse.php│├──UserEntity.php│├──UserIndexRequest.php│├──UserIndexResponse.php│├──UserPostRequest.php│├──UserPostResponse.php│├──UserViewRequest.php│└──UserViewResponse.php└──user.pb.goPHPGRPC扩展和依赖安装#InstallationExtendedpeclinstallgrpcpeclinstallprotobuf使用composer来管理依赖加载。mkdirgrpc-php-client&&cdgrpc-php-client#使用composer管理项目composerinit#安装grpc/protobuf客户端库文件composerrequiregrpc/grpccomposerrequiregoogle/protobuf#新建grpc服务库目录生成PHP客户端将客户端文件移动到这个mkdirgrpc&&mv$GOPATH/src/grpc/user/*./grpc#注册psr4自动加载服务的客户端文件vicomposer.json{"name":"root/php-client","require":{"grpc/grpc":"^1.19","google/protobuf":"^3.7"},"autoload":{"psr-4":{"User\\":"./grpc/user/","GPBMetadata\\":"./grpc/GPBMetadata/"}}}#更新composerloadercomposerdump-autoloadPHP客户端代码示例安装好grpc扩展和php的依赖库后,我们就可以写代码了。Grpc\ChannelCredentials::createInsecure()]);$userIndexRequest=newUserIndexRequest();$userIndexRequest->setPage(1);$userIndexRequest->setPageSize(12);/*@var$userIndexResponseUserIndexResponse*//*@var$statusObjstdClass*/list($userIndexResponse,$statusObj)=$userClient->UserIndex($userIndexRequest)->wait();if(0!=$statusObj->code){thrownew\Exception($statusObj->details,$statusObj->code);}printf("索引请求结束:错误%d消息%s"。PHP_EOL,$userIndexResponse->getErr(),$userIndexResponse->getMsg());/*@var$dataUserEntity[]*/$data=$userIndexResponse->getData();foreach($dataas$row){echo$row->getName().”“。$行->getAge()。PHP_EOL;}//剩下的就不写了,很简单//$userClient->UserView();//$userClient->UserPost();//$userClient->UserDelete();#Result[root@localhostphp-client]#phpindex.phpindexrequestend:err0msgsuccessbig_cat28sqrt_cat29Goserver和client版本的Protobuf原生使用grpc和protobuf作为IDL,声明服务接口,请求实体,响应实体,然后我们填写我们自己的业务,客户端发送请求实体,服务器服务接口处理业务,然后返回响应实体,请求/响应实体的数据传输也是使用protobuf打包/解包#打包//\Google\Protobuf\Internal\Message::serializeToString#解压//\Google\Protobuf\Internal\Message::mergeFromString//Client$message=newMessage();$message->setId(1);$message->setName("sqrt_cat");$message->setAddress("shanghai");$package=$message->serializeToString();//发送$package给服务器//服务器接收到数据后使用要解压的相应实体//server$message=newMessage();$message->mergeFromString($package);var_dump($message->getId(),$message->getName(),$message->getAddress());感谢:grpc简单教程goserver+phpclient

最新推荐
猜你喜欢