美文网首页
go+protobuf+php简单示例

go+protobuf+php简单示例

作者: 快感炮神 | 来源:发表于2020-09-10 14:32 被阅读0次
  1. 下载protobuf
  2. go get github.com/golang/protobuf/protoc-gen-go
  3. 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简单示例

      本文链接:https://www.haomeiwen.com/subject/gfkpektx.html