目录
http://www.topgoer.com/%E5%BE%AE%E6%9C%8D%E5%8A%A1/gRPC/
安装
go get github.com/golang/protobuf/proto
go get google.golang.org/grpc(无法使用,用如下命令代替)
git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net
git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto
cd $GOPATH/src/
go install google.golang.org/grpc
protobuf安装
go get github.com/golang/protobuf/protoc-gen-go
上面安装好后,会在GOPATH/bin下生成protoc-gen-go.exe
但还需要一个protoc.exe,windows平台编译受限,很难自己手动编译,直接去网站下载一个,地址:https://github.com/protocolbuffers/protobuf/releases/tag/v3.9.0 ,同样放在GOPATH/bin下
proto3语法官网
https://developers.google.com/protocol-buffers/docs/proto3
proto3语法生成文件
proto文件:option go_package = "../services";
protoc --go_out=plugins=grpc:../services Prod.proto
小案例
服务端
结构
pbfiles/Prod.proto文件
syntax = "proto3"; // 指定proto版本
package services; // 指定默认包名
// 指定golang包名路径
option go_package = "../services";
// HelloRequest 请求结构
message ProdRequest {
int32 prod_id = 1;
}
// HelloResponse 响应结构
message ProdResponse {
string message = 1;
}
service ProdService {
rpc GetProdStock(ProdRequest) returns(ProdResponse);
}
生成services/Prod.pb.go文件
在Prod.proto同级目录中
protoc --go_out=plugins=grpc:../services Prod.proto
services/ProdService.go自定义响应方法文件
package services
import (
"context"
)
type ProdService struct {
}
func(this *ProdService) GetProdStock(ctx context.Context, in *ProdRequest) (*ProdResponse, error) {
return &ProdResponse{Message:"jeff"},nil
}
server.go服务端启动文件
package main
import (
"google.golang.org/grpc"
"net"
"rpc_server/services"
)
func main() {
rpcServer:=grpc.NewServer()
services.RegisterProdServiceServer(rpcServer,new(services.ProdService))
lis,_:=net.Listen("tcp",":8081")
rpcServer.Serve(lis)
}
客户端
结构
复制Prod.pb.go文件
mian.go 客户端启动文件
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"rpc_client/services"
)
func main() {
conn,err:=grpc.Dial(":8081",grpc.WithInsecure())
if err!=nil{
fmt.Println(err)
}
defer conn.Close()
prodClient:=services.NewProdServiceClient(conn)
prodRes,err:= prodClient.GetProdStock(context.Background(),&services.ProdRequest{ProdId: 12})
if err!=nil{
fmt.Println(err)
}
fmt.Println(prodRes.Message)
}