grpc-protobuf golang作server&php作client

本文作一個小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,即可看到結果。

相關文章
相關標籤/搜索