我是靠谱客的博主 舒心大地,最近开发中收集的这篇文章主要介绍grpc-protobuf golang做server&php做client,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文做一个小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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部