mac下grpc(golang server + php client)实践

目前微服务这么流行,RPC框架也是百花齐放,本文讲述一下mac下grpc的开发环境搭建,其中server端使用golang,客户端使用php。

服务端

golang grpc安装

这里列出了一个参考,由于grpc在github上的文件目录有改动,所以直接按官方的安装,会出404资源无法找到的问题。
需要先在本地安装golang+grpc。具体可参考:golang安装grpc
操作完之后,在终端运行:protoc --version,能看到版本信息
同时,protoc-gen-go命令应该也已经被安装

查看protoc版本信息

php grpc客户端

扩展有几个,推荐使用官方的
当然,另外一个也相当不错,datto的protobuf扩展。使用datto的这个的时候,我用perl根据其文档安装失败,既然官方的ok了,也就懒得再去折腾了。
官方的具体的安装流程,刚刚给的github的网址上有详细的说明,根据步骤走,就ok了。
安装完之后,为了在nginx下使用,应该装grpc这个扩展:

php的grpc扩展安装成功查看

开始Demo

官方给了一个helloworld.proto的demo,咱们按样子,增加一个,目录结构如下:
demo目录结构

app和meta,放的是protoc编译之后的服务端的go的源码。
grpc,将protoc编译成PHP所需要的工具及源码(即:grpc_php_plugin)
phpClient,是protoc编译出来的php的源码,下面的vendor文件夹是composer加载的grpc/grpc的php客户端的连接服务端的源码

上源码

先建立文件夹:mkdir grpc_demo

meta.proto的源码

syntax = "proto3";

package meta;

service Agent {
  rpc GetInfo (MetaRequest) returns (MetaResponse);
}

message MetaRequest {
  string appId = 1;
}

message MetaResponse {
  string appId = 1;
  string title = 2;
  string name = 3;
  string logo = 4;
}

编译成golang文件:

protoc --go_out=plugins=grpc:./meta ./meta.proto

编译成php文件:

protoc --proto_path=./ \
       --php_out=phpClient/meta \
       --grpc_out=phpClient/meta \
       --plugin=protoc-gen-grpc=./grpc/bins/opt/grpc_php_plugin \
       meta.proto

编写main.go文件:(此处把helloworld.proto这个demo也加进来了)

package main

import (
    "log"
    "net"
    pb "grpc_demo/app"
    meta "grpc_demo/meta"
    "golang.org/x/net/context"
    "google.golang.org/grpc"
)

const (
    port = ":50051"
)

// server is used to implement helloworld.GreeterServer.
type server struct{}

// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Hello " + in.Name + "--from jacky_chen"}, nil
}

func (s *server) GetInfo(ctx context.Context, in *meta.MetaRequest) (*meta.MetaResponse, error) {
    return &meta.MetaResponse {
        AppId: in.AppId,
        Title: "my title",
        Name: "My Name",
        Logo: "https://xxx.com",
    }, nil
}
 
func main() {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    meta.RegisterAgentServer(s, &server{})
    s.Serve(lis)
}

agent_client.php源码:

<?php

require dirname(__FILE__).'/../vendor/autoload.php';

print_r(get_declared_classes());exit;

include_once dirname(__FILE__).'/Meta/AgentClient.php';
include_once dirname(__FILE__).'/Meta/MetaRequest.php';
include_once dirname(__FILE__).'/Meta/MetaResponse.php';
include_once dirname(__FILE__).'/GPBMetadata/Meta.php';
$appId = "123";
try {
    $client = new Meta\AgentClient('localhost:50051', [
        'credentials' => Grpc\ChannelCredentials::createInsecure(),
    ]);
    $request = new Meta\MetaRequest();
    $request->setAppId($appId);
    list($reply, $status) = $client->GetInfo($request)->wait();
    echo $reply->serializeToJsonString();
} catch (\Throwable | \Error | \Exception $e) {
    echo  "error : " . $e->getMessage();
}

运行服务端:

go run main.go

运行客户端:

php 

结果如图:


php调用go的rpc服务

由于php本身的原因(官方是基于php-fpm,非常驻内存),所以grpc官方并没有php的服务端。当然,基于swoole开发的grpc的服务端在github上已经有了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容