go+protobuf+php简单示例

快感炮神 · · 446 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

go get github.com/golang/protobuf/protoc-gen-go
go get github.com/golang/protobuf/proto

  • proto
syntax="proto3";
package prod;
message ProdRequest{
  int32 prod_id=1;  // 商品id
}
message ProdResponse{
  int32 prod_stock=1;  // 商品库存
}

命令protoc --go_out=. prodService.proto生成go文件

  • rpc server
package main

import (
    "net"
    "net/rpc"
    "net/rpc/jsonrpc"
    prod "think/pb"
)

type ProdService struct {

}

// GetStock 获取库存
// 随便模拟一下商品库存
func (s *ProdService) GetStock(req prod.ProdRequest,res *prod.ProdResponse) error{
    if req.ProdId==1 {
        res.ProdStock=10
    }else {
        res.ProdStock=0
    }
    return nil
}

func main() {
    listener, _:=net.Listen("tcp",":30000")
    rpc.Register(new(ProdService))

    for  {
        conn,_:=listener.Accept()
        jsonrpc.ServeConn(conn)
    }
}

  • rpc client
package main

import (
    "fmt"
    "net/rpc/jsonrpc"
    prod "think/pb"
)

func main() {
    client,err :=jsonrpc.Dial("tcp","127.0.0.1:30000")
    if err!=nil {
        fmt.Println(err)
        return
    }
    res:=prod.ProdResponse{}
    err=client.Call("ProdService.GetStock",prod.ProdRequest{ProdId:10},&res)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(res.ProdStock)
}
  • php调用
$fp = stream_socket_client('tcp://127.0.0.1:30000',$errno,$msg,3);

if (!$fp) {
    echo "$msg ($errno)<br>\n";
    return;
}

fwrite($fp, json_encode([
    'method' => 'ProdService.GetStock',
    'params' => [['prod_id' => 1]],
    'id' => 0
])."\n");

echo fgets($fp);

fclose($fp);

返回

{"id":0,"result":{"prod_stock":5},"error":null}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:快感炮神

查看原文:go+protobuf+php简单示例

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

446 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传